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 double AlphaBeta(Connect4Board oldBoard, int depth, double alpha, double beta, bool player) { if ((depth == 0) || (CheckForWin(oldBoard) != 0 || CheckForDraw(oldBoard))) { return Score(oldBoard); } if (player) { double val = -10000.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, depth-1, alpha, beta, !player)); alpha = Math.Max(alpha, val); if (beta <= alpha) break; } } return alpha; } else { double val = 10000.0; for (int i = 0; i < oldBoard.GetNrColumns(); i++) { if (oldBoard.IsValidMove(i)) { Connect4Board newBoard = new Connect4Board(oldBoard); newBoard.AddDisc(i, botId); val = Math.Min(val, gamma * AlphaBeta(newBoard, depth-1, alpha, beta, !player)); beta = Math.Min(val, beta); if (beta <= alpha) break; } } return beta; } }
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 Connect4Board(Connect4Board oldBoard) { cols = oldBoard.GetNrColumns(); rows = oldBoard.GetNrRows(); board = new int[cols, rows]; for (int i = 0; i < cols; i++) { for (int j = 0; j < rows; j++) { board[i, j] = oldBoard.GetDisc(i, j); } } }
public int CheckForWin(Connect4Board b) { int piece; //Checking vertically for (int i = 0; i < b.GetNrColumns(); i++) { for (int j = 0; j < b.GetNrRows()-3; j++) { if ((piece = b.GetDisc(i, j)) != 0) { if (piece == b.GetDisc(i, j+1)) { if (piece == b.GetDisc(i, j+2)) { if (piece == b.GetDisc(i, j+3)) return piece; else j += 2; } else j += 1; } } } } //Checking horizontally for (int j = 0; j < b.GetNrRows(); j++) { for (int i = 0; i < b.GetNrColumns()-3; i++) { if ((piece = b.GetDisc(i, j)) != 0) { if (piece == b.GetDisc(i+1, j)) { if (piece == b.GetDisc(i+2, j)) { if (piece == b.GetDisc(i+3, j)) return piece; else i += 2; } else i += 1; } } } } //Checking diagonally for (int i = 0; i < b.GetNrColumns()-3; i++) { for (int j = 0; j < b.GetNrRows()-3; j++) { if ((piece = b.GetDisc(i, j)) != 0) { if (piece == b.GetDisc(i + 1, j + 1) && piece == b.GetDisc(i + 2, j + 2) && piece == b.GetDisc(i + 3, j + 3)) return piece; } if ((piece = b.GetDisc(i+3, j)) != 0) { if (piece == b.GetDisc(i + 2, j + 1) && piece == b.GetDisc(i + 1, j + 2) && piece == b.GetDisc(i, j + 3)) return piece; } } } return 0; }
public bool CheckForDraw(Connect4Board b) { for (int i = 0; i < b.GetNrColumns(); i++) { if (b.IsValidMove(i)) return false; } return true; }
public double EvalBoardPosition(Connect4Board b) { double accumScore = 0.0; //Vertical for (int i = 0; i < b.GetNrColumns(); i++) { for (int j = 0; j < b.GetNrRows()-3; j++) { accumScore += EvalSingle(b, i, j, 0, 1, botId); accumScore -= EvalSingle(b, i, j, 0, 1, 3 - botId); } } //Horizontal for (int j = 0; j < b.GetNrRows(); j++) { for (int i = 0; i < b.GetNrColumns()-3; i++) { accumScore += EvalSingle(b, i, j, 1, 0, botId); accumScore -= EvalSingle(b, i, j, 1, 0, 3 - botId); } } for (int i = 0; i < b.GetNrColumns()-3; i++) { for (int j = 0; j < b.GetNrRows()-3; j++) { accumScore += EvalSingle(b, i, j, 1, 1, botId); accumScore -= EvalSingle(b, i, j, 1, 1, 3 - botId); accumScore += EvalSingle(b, i + 3, j, -1, 1, botId); accumScore -= EvalSingle(b, i + 3, j, -1, 1, 3 - botId); } } return accumScore; }