public double AlphaBeta(TicTacToeBoard oldBoard, double alpha, double beta, int player) { if (oldBoard.CheckForWin() != 0 || oldBoard.CheckForDraw()) { return Score(oldBoard); } if (player == 1) { double val = -10000.0; for (int i = 1; i <= 9; i++) { if (oldBoard.GetMove(i) == 0) { TicTacToeBoard newBoard = new TicTacToeBoard(oldBoard); newBoard.MakeMove(i, player); val = Math.Max(val, gamma * AlphaBeta(newBoard, alpha, beta, 2)); alpha = Math.Max(alpha, val); if (beta <= alpha) break; } } return alpha; } else { double val = 10000.0; for (int i = 1; i <= 9; i++) { if (oldBoard.GetMove(i) == 0) { TicTacToeBoard newBoard = new TicTacToeBoard(oldBoard); newBoard.MakeMove(i, player); val = Math.Min(val, gamma * AlphaBeta(newBoard, alpha, beta, 1)); beta = Math.Min(val, beta); if (beta <= alpha) break; } } return beta; } }
public void TakeATurn(TicTacToeBoard board) { board.DisplayBoard(); bool validMove = false; while (!validMove) { Console.WriteLine("Please make a move (1-9):"); int move; if (Int32.TryParse(Console.ReadLine(), out move)) { if (board.GetMove(move) == 0) { board.MakeMove(move, 2); validMove = true; } else { Console.WriteLine("Invalid move. Please try again."); } } else { Console.WriteLine("Invalid syntax. Please try again."); } } }
public int GetBestMove(TicTacToeBoard board) { double max = -100000.0; int bestMoveSoFar = 0; for (int i = 1; i <= 9; i++) { if (board.GetMove(i) == 0) { TicTacToeBoard testBoard = new TicTacToeBoard(board); testBoard.MakeMove(i, 1); double moveScore = AlphaBeta(testBoard, -10000.0, 10000.0, 2); if (moveScore > max) { max = moveScore; bestMoveSoFar = i; } } } return bestMoveSoFar; }