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;
    }
  }