public Move getComputerMove(BoardSymbol symbol) { BoardSymbol oppositeSymbol = symbol.getOppositeSymbol(); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { if (board[i][j] == BoardSymbol.Empty) { Move move = new Move(i, j); if (isWinningMove(symbol, move)) { return move; } } } } for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { if (board[i][j] == BoardSymbol.Empty) { Move move = new Move(i, j); if (isWinningMove(oppositeSymbol, move)) { return move; } } } } for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { if (board[i][j] == BoardSymbol.Empty) { return new Move(i, j); } } } throw new BoardFullException(); }
private boolean isWinningMove(BoardSymbol symbol, Move move) { boolean isWinner = makeMove(symbol.name(), move); // undo the move board[move.getX()][move.getY()] = BoardSymbol.Empty; numberOfMoves--; return isWinner; }
/** @see Board#makeMove(String, Move) */ @Override public boolean makeMove(String symbolString, Move move) { BoardSymbol symbol = BoardSymbol.valueOf(symbolString); int x = move.getX(); int y = move.getY(); // put the player's symbol at this move on the board board[x][y] = symbol; numberOfMoves++; int horizontalCount = 0; int verticalCount = 0; int forwardDiagonalCount = 0; int backwardDiagonalCount = 0; for (int i = 0; i < BOARD_SIZE; i++) { if (board[i][y] == symbol) { horizontalCount++; } if (board[x][i] == symbol) { verticalCount++; } if (board[i][i] == symbol) { forwardDiagonalCount++; } if (board[i][BOARD_SIZE - 1 - i] == symbol) { backwardDiagonalCount++; } } // if there are 3 of the same symbols in any of the possible winning directions, then we have a // winner if (horizontalCount == BOARD_SIZE || verticalCount == BOARD_SIZE || forwardDiagonalCount == BOARD_SIZE || backwardDiagonalCount == BOARD_SIZE) { return true; } else { return false; } }