public int MakeTurn(Connect4Board b) { int depth = 5; if (round >= 25) depth = 7; else if (round >= 32) depth = 100; double max = -10000.0; int bestMoveSoFar = 0; for (int i = 0; i < b.GetNrColumns(); i++) { if (b.IsValidMove(i)) { Connect4Board testBoard = new Connect4Board(b); testBoard.AddDisc(i, botId); double moveScore = AlphaBeta(testBoard, depth, -100000.0, 100000.0, false); //DisplayScore(moveScore, i); if (moveScore > max) { max = moveScore; bestMoveSoFar = i; } } } //b.DisplayBoard(); return bestMoveSoFar; }
public int MakeTurn(Connect4Board b) { double max = -10000.0; int bestMoveSoFar = 0; for (int i = 0; i < b.GetNrColumns(); i++) { if (b.IsValidMove(i)) { Connect4Board testBoard = new Connect4Board(b); testBoard.AddDisc(i, botId); double moveScore = AlphaBeta(testBoard, depth, -10000.0, 10000.0, false); if (moveScore > max) { max = moveScore; bestMoveSoFar = i; } } } return bestMoveSoFar; }
public double AlphaBeta(Connect4Board oldBoard, int d, double alpha, double beta, bool player) { if (d == 0 || (CheckForWin(oldBoard) != 0 || CheckForDraw(oldBoard))) { return Score(oldBoard); } if (player) { double val = -100000.0; for (int i = 0; i < oldBoard.GetNrColumns(); i++) { if (oldBoard.IsValidMove(i)) { Connect4Board newBoard = new Connect4Board(oldBoard); newBoard.AddDisc(i, botId); val = Math.Max(val, gamma * AlphaBeta(newBoard, d-1, alpha, beta, !player)); alpha = Math.Max(alpha, val); if (beta <= alpha) break; } } return alpha; } else { double val = 100000.0; for (int i = 0; i < oldBoard.GetNrColumns(); i++) { if (oldBoard.IsValidMove(i)) { Connect4Board newBoard = new Connect4Board(oldBoard); newBoard.AddDisc(i, (3- botId)); val = Math.Min(val, gamma * AlphaBeta(newBoard, d-1, alpha, beta, !player)); beta = Math.Min(val, beta); if (beta <= alpha) break; } } return beta; } }