Skip to content

Method: build(int)

1: package de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.impl;
2:
3: import java.util.LinkedHashMap;
4: import java.util.Map;
5: import java.util.Objects;
6: import java.util.Optional;
7:
8: import de.fhdw.gaming.core.domain.DefaultObserverFactoryProvider;
9: import de.fhdw.gaming.core.domain.GameBuilder;
10: import de.fhdw.gaming.core.domain.GameException;
11: import de.fhdw.gaming.core.domain.ObserverFactoryProvider;
12: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgGame;
13: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgGameBuilder;
14: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgPlayer;
15: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgPlayerBuilder;
16: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgStrategy;
17: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.move.impl.AbstractAnswer;
18:
19: /**
20: * Builds a Game, implements {@link FzgGameBuilder}.
21: *
22: */
23: public class FzgGameBuilderImpl implements FzgGameBuilder {
24:
25: /**
26: * The {@link ObserverFactoryProvider}.
27: */
28: private ObserverFactoryProvider observerFactoryProvider;
29: /**
30: * The first player.
31: */
32: private Optional<FzgPlayer> firstPlayer;
33: /**
34: * The strategy of the first player.
35: */
36: private Optional<FzgStrategy> firstPlayerStrategy;
37: /**
38: * The second player.
39: */
40: private Optional<FzgPlayer> secondPlayer;
41: /**
42: * The strategy of the second player.
43: */
44: private Optional<FzgStrategy> secondPlayerStrategy;
45: /**
46: * The maximum computation time per move in seconds.
47: */
48: private int maxComputationTimePerMove;
49:
50: /**
51: * Constructor, creates a FzgGameBuilder.
52: */
53: public FzgGameBuilderImpl() {
54: this.observerFactoryProvider = new DefaultObserverFactoryProvider();
55: this.firstPlayer = Optional.empty();
56: this.firstPlayerStrategy = Optional.empty();
57: this.secondPlayer = Optional.empty();
58: this.secondPlayerStrategy = Optional.empty();
59: this.maxComputationTimePerMove = GameBuilder.DEFAULT_MAX_COMPUTATION_TIME_PER_MOVE;
60: }
61:
62: @Override
63: public FzgPlayerBuilder createPlayerBuilder() {
64: return new FzgPlayerBuilderImpl();
65: }
66:
67: @Override
68: public FzgGameBuilder changeMaximumComputationTimePerMove(final int newMaxComputationTimePerMove) {
69: this.maxComputationTimePerMove = newMaxComputationTimePerMove;
70: return this;
71: }
72:
73: @Override
74: public FzgGameBuilder addPlayer(final FzgPlayer player, final FzgStrategy strategy) throws GameException {
75: if (this.firstPlayer.isEmpty()) {
76: this.firstPlayer = Optional.of(Objects.requireNonNull(player, "player"));
77: this.firstPlayerStrategy = Optional.of(Objects.requireNonNull(strategy, "firstPlayerStrategy"));
78: } else if (this.secondPlayer.isEmpty()) {
79: this.secondPlayer = Optional.of(Objects.requireNonNull(player, "player"));
80: this.secondPlayerStrategy = Optional.of(Objects.requireNonNull(strategy, "secondPlayerStrategy"));
81: } else {
82: throw new GameException(String.format("More than two players are not allowed."));
83: }
84: return this;
85: }
86:
87: @Override
88: public FzgGameBuilder changeObserverFactoryProvider(final ObserverFactoryProvider newObserverFactoryProvider) {
89: this.observerFactoryProvider = newObserverFactoryProvider;
90: return this;
91: }
92:
93: @Override
94: public FzgGame build(final int id) throws GameException, InterruptedException {
95:• if (!this.firstPlayer.isPresent() || !this.secondPlayer.isPresent()) {
96: throw new GameException("Freizeitgestaltung needs two players.");
97: }
98:
99: final FzgStateImpl initialState = new FzgStateImpl(this.firstPlayer.get(), this.secondPlayer.get());
100:
101: final Map<String, FzgStrategy> strategies = new LinkedHashMap<>();
102: strategies.put(initialState.getFirstPlayer().getName(), this.firstPlayerStrategy.orElseThrow());
103: strategies.put(initialState.getSecondPlayer().getName(), this.secondPlayerStrategy.orElseThrow());
104: return new FzgGameImpl(
105: id,
106: initialState,
107: strategies,
108: this.maxComputationTimePerMove,
109: AbstractAnswer.class::isInstance,
110: this.observerFactoryProvider);
111: }
112: }