TicTacToe.java (3992B) download
1package nl.isygameclient.models.games;
2
3import nl.isygameclient.models.Game;
4import nl.isygameclient.models.Player;
5import nl.isygameclient.models.PlayerManager;
6import nl.isygameclient.models.board.HistoryBoard;
7import nl.isygameclient.util.Vector2D;
8
9import java.util.*;
10
11public class TicTacToe extends Game {
12
13 public TicTacToe(PlayerManager playerManager) {
14 super(playerManager, new HistoryBoard<>(3,3){});
15 }
16
17 @Override
18 public void restart() {
19 playerManager.restart();
20 board = new HistoryBoard<>(3,3){};
21 }
22
23 @Override
24 public boolean move(Player player, Vector2D<Integer, Integer> pos) {
25 if (!isMoveValid(player, pos)) {
26 return false;
27 }
28
29 Map<Vector2D<Integer, Integer>, Player> changes = new HashMap<>();
30 changes.put(pos, player);
31 board.add(player, changes);
32
33 playerManager.nextPlayer();
34 return true;
35 }
36
37 @Override
38 public boolean isMoveValid(Player player, Vector2D<Integer, Integer> pos) {
39 boolean positionOnBoard = (pos.getX() >= 0 && pos.getX() < board.getWidth()) && (pos.getY() >= 0 && pos.getY() < board.getHeight());
40 boolean positionEmpty = (board.get(pos) == null);
41 return positionOnBoard && positionEmpty;
42 }
43
44 @Override
45 public boolean isDraw() {
46 for (Player player : playerManager.getPlayers()) {
47 if (getValidMoves(player).size() > 0) {
48 return false;
49 }
50 }
51 return true;
52 }
53
54 @Override
55 public boolean isGameOver() {
56 return getWinners().size() > 0 || isDraw();
57 }
58
59
60 private boolean isPlayer(Player player, Vector2D<Integer, Integer> pos) {
61 return Objects.equals(player, board.get(pos));
62 }
63 @Override
64 public boolean isWinner(Player player) {
65 boolean topRow = isPlayer(player, new Vector2D<>(0,0)) && isPlayer(player, new Vector2D<>(0,1)) && isPlayer(player, new Vector2D<>(0,2));
66 boolean middleRow = isPlayer(player, new Vector2D<>(1,0)) && isPlayer(player, new Vector2D<>(1,1)) && isPlayer(player, new Vector2D<>(1,2));
67 boolean bottomRow = isPlayer(player, new Vector2D<>(2,0)) && isPlayer(player, new Vector2D<>(2,1)) && isPlayer(player, new Vector2D<>(2,2));
68
69 boolean leftColumn = isPlayer(player, new Vector2D<>(0,0)) && isPlayer(player, new Vector2D<>(1,0)) && isPlayer(player, new Vector2D<>(2,0));
70 boolean midColumn = isPlayer(player, new Vector2D<>(0,1)) && isPlayer(player, new Vector2D<>(1,1)) && isPlayer(player, new Vector2D<>(2,1));
71 boolean rightColumn = isPlayer(player, new Vector2D<>(0,2)) && isPlayer(player, new Vector2D<>(1,2)) && isPlayer(player, new Vector2D<>(2,2));
72
73 boolean lrCross = isPlayer(player, new Vector2D<>(0,0)) && isPlayer(player, new Vector2D<>(1,1)) && isPlayer(player, new Vector2D<>(2,2));
74 boolean rlCross = isPlayer(player, new Vector2D<>(0,2)) && isPlayer(player, new Vector2D<>(1,1)) && isPlayer(player, new Vector2D<>(2,0));
75
76 return topRow || middleRow || bottomRow || leftColumn || midColumn || rightColumn || lrCross || rlCross;
77 }
78
79 @Override
80 public List<Vector2D<Integer, Integer>> getValidMoves(Player player) {
81 List<Vector2D<Integer, Integer>> valid = new ArrayList<>();
82 for (int y = 0; y < board.getHeight(); y++) {
83 for (int x = 0; x < board.getWidth(); x++) {
84 if (isMoveValid(player, new Vector2D<>(x, y))) valid.add(new Vector2D<>(x,y));
85 }
86 }
87 return valid;
88 }
89
90 public List<Player> getWinners(){
91 List<Player> players = new ArrayList<>();
92 for (Player player: playerManager.getPlayers()) {
93 if (isWinner(player)) {
94 players.add(player);
95 }
96 }
97 return players;
98 }
99
100 @Override
101 public int getPlayerScore(Player player){
102 if (isGameOver() && isWinner(player)) {
103 return 1;
104 }
105 return 0;
106 }
107}