Skip to contentMethod: requestedMemoryCapacity()
      1: package de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.tit_for_two_tats;
2: 
3: import java.util.Optional;
4: 
5: import de.fhdw.gaming.core.domain.GameException;
6: import de.fhdw.gaming.ipspiel23.dilemma.domain.IDilemmaPlayer;
7: import de.fhdw.gaming.ipspiel23.dilemma.domain.IDilemmaState;
8: import de.fhdw.gaming.ipspiel23.dilemma.moves.IDilemmaMove;
9: import de.fhdw.gaming.ipspiel23.dilemma.moves.IDilemmaMoveFactory;
10: import de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.DilemmaMemoryStrategy;
11: import de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.DilemmaRoundData;
12: import de.fhdw.gaming.ipspiel23.memory.GameMemoryCapacity;
13: import de.fhdw.gaming.ipspiel23.memory.IGameMemory;
14: import de.fhdw.gaming.ipspiel23.memory.IGameMemoryCapacity;
15: 
16: import static de.fhdw.gaming.ipspiel23.dilemma.domain.DilemmaAnswerType.DEFECT;
17: /**
18:  * Cooperates unless defected against twice in a row.
19:  */
20: public class DilemmaTitForTwoTatsStrategy extends DilemmaMemoryStrategy {
21: 
22:     /**
23:      * Creates a new instance of the {@link DilemmaTitForTwoTatsStrategy} class.
24:      * @param moveFactory the move factory to use.
25:      */
26:     protected DilemmaTitForTwoTatsStrategy(final IDilemmaMoveFactory moveFactory) {
27:         super(moveFactory);
28:     }
29: 
30:     @Override
31:     public Optional<IDilemmaMove> computeNextMove(final int gameId, final IDilemmaPlayer player, 
32:             final IDilemmaState state)
33:             throws GameException, InterruptedException {
34:         final IGameMemory<DilemmaRoundData> memory = getMemoryForPlayer(player, state);
35:         final IDilemmaMoveFactory moveFactory = getMoveFactory();
36:         // always cooperate on first two rounds
37:         if (memory.size() == 0) {
38:             return Optional.of(moveFactory.createCooperateMove());
39:         }
40:         final DilemmaRoundData previousRound = memory.getRound(0, true);
41:         // ...and check if the opponent defects two times in a row
42:         if (previousRound.forOpponentOf(player).answer().equals(DEFECT) 
43:             && memory.size() > 1
44:             && memory.getRound(1, true).forOpponentOf(player).answer().equals(DEFECT)) {
45:             return Optional.of(moveFactory.createDefectMove());
46:         } else {
47:             return Optional.of(moveFactory.createCooperateMove());
48:         }
49:     }
50: 
51:     @Override
52:     protected IGameMemoryCapacity requestedMemoryCapacity() {
53:         return GameMemoryCapacity.unlimited();
54:     }
55: }