private BestMove minimax(int depth, Player player, int alpha, int beta) { BestMove currentMove; List <BoardSpace> spaces = generateMoves(); spaces.Shuffle(); int score; string bestPosition = null; if (spaces.Count == 0 || depth == 0) { score = evaluate(); return(new BestMove(score, bestPosition)); } else { foreach (BoardSpace space in spaces) { space.owner = BoardState.GetOwner(player.Token); if (player.Token == currentPlayer.Token) { currentMove = minimax(depth - 1, opponentPlayer, alpha, beta); score = currentMove.Score; if (score > alpha) { alpha = score; bestPosition = space.position; } } else { currentMove = minimax(depth - 1, currentPlayer, alpha, beta); score = currentMove.Score; if (score < beta) { beta = score; bestPosition = space.position; } } space.owner = Owner.Empty; if (alpha >= beta) { break; } } } return(new BestMove((player.Token == currentPlayer.Token)?alpha:beta, bestPosition)); }
public int evaluate() { int score = 0; Owner currentPlayerOwner = BoardState.GetOwner(currentPlayer.token); Owner opponentPlayerOwner = BoardState.GetOwner(opponentPlayer.token); score += EvaluateWin(currentBoard.win1, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win2, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win3, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win4, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win5, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win6, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win7, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win8, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win9, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win10, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win11, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win12, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win13, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win14, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win15, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win16, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win17, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win18, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win19, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win20, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win21, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win22, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win23, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win24, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win25, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win26, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win27, currentPlayerOwner, opponentPlayerOwner); score += EvaluateWin(currentBoard.win28, currentPlayerOwner, opponentPlayerOwner); return(score); }