Skip to content

Package: FzgGameBuilderFactoryImpl

FzgGameBuilderFactoryImpl

nameinstructionbranchcomplexitylinemethod
FzgGameBuilderFactoryImpl()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
FzgGameBuilderFactoryImpl(FzgStrategyFactoryProvider)
M: 0 C: 33
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
createGameBuilder(InputProvider)
M: 15 C: 94
86%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 2 C: 20
91%
M: 0 C: 1
100%
createPlayer(FzgPlayerBuilder, Map)
M: 0 C: 76
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 15
100%
M: 0 C: 1
100%
getMaximumNumberOfPlayers()
M: 0 C: 2
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getMinimumNumberOfPlayers()
M: 0 C: 2
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getName()
M: 0 C: 2
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getStrategies()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getStrategy(Map)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
requestPlayerData(InputProvider, String, Boolean)
M: 0 C: 72
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 14
100%
M: 0 C: 1
100%

Coverage

1: package de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.impl;
2:
3: import java.util.ArrayList;
4: import java.util.LinkedHashMap;
5: import java.util.LinkedHashSet;
6: import java.util.List;
7: import java.util.Map;
8: import java.util.Optional;
9: import java.util.Set;
10: import java.util.regex.Pattern;
11:
12: import de.fhdw.gaming.core.domain.GameBuilder;
13: import de.fhdw.gaming.core.domain.GameBuilderFactory;
14: import de.fhdw.gaming.core.domain.GameException;
15: import de.fhdw.gaming.core.domain.Strategy;
16: import de.fhdw.gaming.core.ui.InputProvider;
17: import de.fhdw.gaming.core.ui.InputProviderException;
18: import de.fhdw.gaming.core.ui.type.validator.MaxValueValidator;
19: import de.fhdw.gaming.core.ui.type.validator.MinValueValidator;
20: import de.fhdw.gaming.core.ui.type.validator.PatternValidator;
21: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgGameBuilder;
22: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgGameBuilderFactory;
23: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgPlayer;
24: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgPlayerBuilder;
25: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgStrategy;
26: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.factory.FzgStrategyDefaultFactoryProvider;
27: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.factory.FzgStrategyFactory;
28: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.factory.FzgStrategyFactoryProvider;
29: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.move.AnswerOptions;
30: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.move.factory.AnswerFactory;
31: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.move.impl.AnswerFactoryImpl;
32:
33: /**
34: * Creates game builder, implements {@link FzgGameBuilderFactory}.
35: *
36: */
37: public class FzgGameBuilderFactoryImpl implements FzgGameBuilderFactory {
38:
39: /**
40: * Name of the game.
41: */
42: private static final String GAME_NAME = "Freizeitgestaltung";
43: /**
44: * The number of players.
45: */
46: private static final int NUMBER_OF_PLAYERS = 2;
47: /**
48: * Smallest allowed maximum computation time per move in seconds.
49: */
50: private static final int MIN_MAX_COMPUTATION_TIME_PER_MOVE = 1;
51: /**
52: * Largest allowed maximum computation time per move in seconds.
53: */
54: private static final int MAX_MAX_COMPUTATION_TIME_PER_MOVE = 3600;
55:
56: /**
57: * All available Demo strategies.
58: */
59: private final Set<FzgStrategy> strategies;
60:
61: /**
62: * Creates gameBuilder Factory.
63: */
64: public FzgGameBuilderFactoryImpl() {
65: this(new FzgStrategyDefaultFactoryProvider());
66: }
67:
68: /**
69: * Creates a Demo game factory.
70: *
71: * @param strategyFactoryProvider The {@link DemoStrategyFactoryProvider} for loading Demo strategies.
72: */
73: FzgGameBuilderFactoryImpl(final FzgStrategyFactoryProvider strategyFactoryProvider) {
74: final AnswerFactory answerFactory = new AnswerFactoryImpl();
75:
76: final List<FzgStrategyFactory> factories = strategyFactoryProvider.getStrategyFactories();
77: this.strategies = new LinkedHashSet<>();
78:• for (final FzgStrategyFactory factory : factories) {
79: this.strategies.add(factory.create(answerFactory));
80: }
81: }
82:
83: @Override
84: public String getName() {
85: return GAME_NAME;
86: }
87:
88: @Override
89: public int getMinimumNumberOfPlayers() {
90: return NUMBER_OF_PLAYERS;
91: }
92:
93: @Override
94: public int getMaximumNumberOfPlayers() {
95: return NUMBER_OF_PLAYERS;
96: }
97:
98: @Override
99: public List<? extends Strategy<?, ?, ?>> getStrategies() {
100: return new ArrayList<>(this.strategies);
101: }
102:
103: @Override
104: public FzgGameBuilder createGameBuilder(final InputProvider inputProvider) throws GameException {
105: try {
106: final FzgGameBuilder gameBuilder = new FzgGameBuilderImpl();
107:
108: @SuppressWarnings("unchecked")
109: final Map<String,
110: Object> gameData = inputProvider.needInteger(
111: GameBuilderFactory.PARAM_MAX_COMPUTATION_TIME_PER_MOVE,
112: "Maximum computation time per move in seconds",
113: Optional.of(GameBuilder.DEFAULT_MAX_COMPUTATION_TIME_PER_MOVE),
114: new MinValueValidator<>(FzgGameBuilderFactoryImpl.MIN_MAX_COMPUTATION_TIME_PER_MOVE),
115: new MaxValueValidator<>(FzgGameBuilderFactoryImpl.MAX_MAX_COMPUTATION_TIME_PER_MOVE))
116: .requestData("Game properties");
117:
118: gameBuilder.changeMaximumComputationTimePerMove(
119: (Integer) gameData.get(GameBuilderFactory.PARAM_MAX_COMPUTATION_TIME_PER_MOVE));
120:
121: final InputProvider firstPlayerInputProvider = inputProvider.getNext(gameData);
122: final Map<String,
123: Object> firstPlayerData = this.requestPlayerData(firstPlayerInputProvider, "Player 1 / Gabi", true);
124: final FzgPlayer firstPlayer = this.createPlayer(gameBuilder.createPlayerBuilder(), firstPlayerData);
125: final FzgStrategy firstPlayerStrategy = this.getStrategy(firstPlayerData);
126: gameBuilder.addPlayer(firstPlayer, firstPlayerStrategy);
127:
128: final InputProvider secondPlayerInputProvider = firstPlayerInputProvider.getNext(firstPlayerData);
129: final Map<String,
130: Object> secondPlayerData = this.requestPlayerData(secondPlayerInputProvider, "Player 2 / Klaus",
131: false);
132: final FzgPlayer secondPlayer = this.createPlayer(gameBuilder.createPlayerBuilder(), secondPlayerData);
133: final FzgStrategy secondPlayerStrategy = this.getStrategy(secondPlayerData);
134: gameBuilder.addPlayer(secondPlayer, secondPlayerStrategy);
135:
136: return gameBuilder;
137: } catch (final InputProviderException e) {
138: throw new GameException(String.format("Creating Demo game was aborted: %s", e.getMessage()), e);
139: }
140: }
141:
142: /**
143: * returns data for PlayerBuilder.
144: *
145: * @param inputProvider The input provider.
146: * @param title The title for the UI.
147: * @param isGabi Flag to show if the Player is "Gabi"/FirstPlayer, therefore different standard-outcome.
148: * @throws InputProviderException if the operation has been aborted prematurely (e.g. if the user cancelled a
149: * dialog).
150: */
151: @SuppressWarnings("unchecked")
152: private Map<String, Object> requestPlayerData(final InputProvider inputProvider, final String title,
153: final Boolean isGabi)
154: throws GameException, InputProviderException {
155: inputProvider
156: .needString(
157: GameBuilderFactory.PARAM_PLAYER_NAME,
158: "Name",
159: Optional.empty(),
160: new PatternValidator(Pattern.compile("\\S+(\\s+\\S+)*")))
161: .needInteger(
162: FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_CIN_CIN,
163: "Player's outcome on Cinema/Cinema",
164:• isGabi ? Optional.of(2) : Optional.of(1))
165: .needInteger(
166: FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_CIN_FOOT,
167: "Player's outcome on Cinema/Football",
168: Optional.of(0))
169: .needInteger(
170: FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_FOOT_CIN,
171: "Player's outcome on Football/Cinema",
172: Optional.of(0))
173: .needInteger(
174: FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_FOOT_FOOT,
175: "Player's outcome on Football/Football",
176:• isGabi ? Optional.of(1) : Optional.of(2))
177: .needObject(GameBuilderFactory.PARAM_PLAYER_STRATEGY, "Strategy", Optional.empty(), this.strategies);
178:
179: return inputProvider.requestData(title);
180: }
181:
182: /**
183: * Creates FzgPlayer.
184: *
185: * @param playerBuilder The player builder.
186: * @param playerData The requested player data.
187: * @return The created {@link FzgPlayer}.
188: * @throws InputProviderException if the operation has been aborted prematurely (e.g. if the user cancelled a
189: * dialog).
190: */
191: private FzgPlayer createPlayer(final FzgPlayerBuilder playerBuilder,
192: final Map<String, Object> playerData) throws GameException, InputProviderException {
193:
194: final Map<AnswerOptions, Map<AnswerOptions, Double>> possibleOutcomes = new LinkedHashMap<>();
195:
196: final Map<AnswerOptions, Double> possibleOutcomesCinema = new LinkedHashMap<>();
197: possibleOutcomesCinema.put(
198: AnswerOptions.CINEMA,
199: (double) (Integer) playerData.get(FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_CIN_CIN));
200: possibleOutcomesCinema.put(
201: AnswerOptions.FOOTBALL,
202: (double) (Integer) playerData.get(FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_CIN_FOOT));
203: possibleOutcomes.put(AnswerOptions.CINEMA, possibleOutcomesCinema);
204:
205: final Map<AnswerOptions, Double> possibleOutcomesFootball = new LinkedHashMap<>();
206: possibleOutcomesFootball.put(
207: AnswerOptions.CINEMA,
208: (double) (Integer) playerData.get(FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_FOOT_CIN));
209: possibleOutcomesFootball.put(
210: AnswerOptions.FOOTBALL,
211: (double) (Integer) playerData.get(FzgGameBuilderFactory.PARAM_PLAYER_OUTCOME_ON_FOOT_FOOT));
212: possibleOutcomes.put(AnswerOptions.FOOTBALL, possibleOutcomesFootball);
213:
214: return playerBuilder.changeName((String) playerData.get(GameBuilderFactory.PARAM_PLAYER_NAME))
215: .changePossibleOutcomes(possibleOutcomes).build();
216: }
217:
218: /**
219: * Returns a FzgStrategy.
220: *
221: * @param playerData The requested player data.
222: * @return The FzgStrategy.
223: */
224: private FzgStrategy getStrategy(final Map<String, Object> playerData) {
225: return (FzgStrategy) playerData.get(GameBuilderFactory.PARAM_PLAYER_STRATEGY);
226: }
227: }