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 PlayAGame() { TicTacToeBot ai = new TicTacToeBot(); TicTacToeBoard board = new TicTacToeBoard(); Random rng = new Random(); bool yourTurn; Console.WriteLine("Randomizing who starts..."); if (rng.Next(2) == 0) { Console.WriteLine("You start!"); yourTurn = true; } else { Console.WriteLine("AI starts."); yourTurn = false; } int winner = 0; bool draw = false; while (winner == 0 && !draw) { if (yourTurn) { TakeATurn(board); } else { board.MakeMove(ai.GetBestMove(board), 1); } yourTurn = !yourTurn; winner = board.CheckForWin(); draw = board.CheckForDraw(); } board.DisplayBoard(); if (winner == 1) { Console.WriteLine("AI wins."); } else if (winner == 2) { Console.WriteLine("You win!"); } else { Console.WriteLine("Draw game."); } }
public double Score(TicTacToeBoard board) { int winner = board.CheckForWin(); if (winner == 1) { return 10.0; } else if (winner == 2) { return -10.0; } else { return 0.0; } }