Skip to content

Method: FzgStateImpl(FzgPlayer, FzgPlayer)

1: package de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.impl;
2:
3: import java.util.HashMap;
4: import java.util.HashSet;
5: import java.util.Map;
6: import java.util.Objects;
7: import java.util.Set;
8:
9: import de.fhdw.gaming.core.domain.GameException;
10: import de.fhdw.gaming.core.domain.PlayerState;
11: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgPlayer;
12: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.domain.FzgState;
13: import de.fhdw.gaming.ipspiel23.freizeitgestaltung.move.AnswerOptions;
14:
15: /**
16: * Implements {@link FzgState}.
17: *
18: *
19: */
20: public class FzgStateImpl implements FzgState {
21:
22: /**
23: * First Player.
24: */
25: private final FzgPlayer firstPlayer;
26:
27: /**
28: * Second Player.
29: */
30: private final FzgPlayer secondPlayer;
31:
32: /**
33: * Contructor, creates a FzgState.
34: *
35: * @param firstPlayer The first player.
36: * @param secondPlayer The second player.
37: * @throws GameException if the state cannot be created according to the rules of the game.
38: */
39: public FzgStateImpl(final FzgPlayer firstPlayer, final FzgPlayer secondPlayer) {
40: this.firstPlayer = firstPlayer;
41: this.secondPlayer = secondPlayer;
42:
43:• if (this.firstPlayer.getName().equals(this.secondPlayer.getName())) {
44: throw new IllegalArgumentException(
45: String.format("Both players have the same name '%s'.", this.firstPlayer.getName()));
46: }
47: }
48:
49: /**
50: * Used for DeepCopy.
51: *
52: * @param source state to copy.
53: */
54: FzgStateImpl(final FzgStateImpl source) {
55: this.firstPlayer = source.firstPlayer.deepCopy();
56: this.secondPlayer = source.secondPlayer.deepCopy();
57: }
58:
59: @Override
60: public Map<String, FzgPlayer> getPlayers() {
61: final Map<String, FzgPlayer> retVal = new HashMap<>();
62: retVal.put(this.firstPlayer.getName(), this.firstPlayer);
63: retVal.put(this.secondPlayer.getName(), this.secondPlayer);
64: return retVal;
65: }
66:
67: @Override
68: public String toString() {
69: return String.format("FzgState[firstPlayer=%s, secondPlayer=%s]", this.firstPlayer, this.secondPlayer);
70: }
71:
72: @Override
73: public boolean equals(final Object obj) {
74: if (obj instanceof FzgStateImpl) {
75: final FzgStateImpl other = (FzgStateImpl) obj;
76: return this.firstPlayer.equals(other.firstPlayer) && this.secondPlayer.equals(other.secondPlayer);
77: }
78: return false;
79: }
80:
81: @Override
82: public int hashCode() {
83: return Objects.hash(this.firstPlayer, this.secondPlayer);
84: }
85:
86: /**
87: * Getter fristPlayer.
88: *
89: * @return the firstPlayer
90: */
91: @Override
92: public FzgPlayer getFirstPlayer() {
93: return this.firstPlayer;
94: }
95:
96: /**
97: * Getter secondPlayer.
98: *
99: * @return the secondPlayer
100: */
101: @Override
102: public FzgPlayer getSecondPlayer() {
103: return this.secondPlayer;
104: }
105:
106: @Override
107: public Set<FzgPlayer> computeNextPlayers() {
108: final HashSet<FzgPlayer> retVal = new HashSet<>();
109: if (this.firstPlayer.getAnswer().isEmpty()) {
110: retVal.add(this.firstPlayer);
111: }
112: if (this.secondPlayer.getAnswer().isEmpty()) {
113: retVal.add(this.secondPlayer);
114: }
115: return retVal;
116: }
117:
118: @Override
119: public void nextTurn() {
120: final Set<FzgPlayer> playersWithoutMove = this.computeNextPlayers();
121: if (playersWithoutMove.isEmpty()) {
122: final AnswerOptions answerOfFirstPlayer = this.firstPlayer.getAnswer().orElseThrow();
123: final AnswerOptions answerOfSecondPlayer = this.secondPlayer.getAnswer().orElseThrow();
124:
125: final Double outcomeOfFirstPlayer = this.firstPlayer.getPossibleOutcomes().get(answerOfFirstPlayer)
126: .get(answerOfSecondPlayer);
127: this.firstPlayer.setState(outcomeToState(outcomeOfFirstPlayer));
128: this.firstPlayer.setOutcome(outcomeOfFirstPlayer);
129:
130: final Double outcomeOfSecondPlayer = this.secondPlayer.getPossibleOutcomes().get(answerOfFirstPlayer)
131: .get(answerOfSecondPlayer);
132: this.secondPlayer.setState(outcomeToState(outcomeOfSecondPlayer));
133: this.secondPlayer.setOutcome(outcomeOfSecondPlayer);
134: }
135:
136: }
137:
138: @Override
139: public FzgState deepCopy() {
140: return new FzgStateImpl(this);
141: }
142:
143: /**
144: * Converts outcome to playerState.
145: *
146: * @param outcome the players outcome.
147: */
148: private PlayerState outcomeToState(final Double outcome) {
149: // Das Spiel hat kein Verlierer, weil die beiden Spiler, laut Aufgabenstellung, bei einem nicht zustande
150: // kommenden Date dennoch mögen.
151: // Daher wurde entschieden, dass ein Spieler immer den State DRAW hat, es sei denn, er/sie hat eine positive
152: // Auszahlung.
153: return outcome > 0.0 ? PlayerState.WON : PlayerState.DRAW;
154: }
155: }