private TreeNode MiniMax(Board board, Double depth, Double alpha, Double beta, Boolean maximizer) { if(depth == 0) { return GetLeafNode(board, maximizer); } var pieces = board.GetPiecesForPlayer(board.PlayerTurn); var bestScore = maximizer ? _minScore : _maxScore; var bestMove = default(Move); var moves = pieces.SelectMany(x => x.GetPossibleMoves(board)); if (!moves.Any()) { if (board.PlayerHasCheck(board.PlayerTurn)) { return new TreeNode(null, maximizer ? _maxScore : _minScore); } } foreach (var mv in moves) { var newBoard = board.Copy(); newBoard.MakeMove(mv); var newNode = MiniMax(newBoard, depth - 1, alpha, beta, !maximizer); if (maximizer) { if(newNode.Score > bestScore) { bestScore = newNode.Score; bestMove = mv; } alpha = Math.Max(alpha, bestScore); if(beta <= alpha) { return new TreeNode(bestMove, bestScore); } } else { if(newNode.Score < bestScore) { bestScore = newNode.Score; bestMove = mv; } beta = Math.Min(beta, bestScore); if(beta <= alpha) { return new TreeNode(bestMove, bestScore); } } } return new TreeNode(bestMove, bestScore); }
public void GetNextMoveMustNotAlterBoard() { _board = new Board(); _board.Initialize(); for(int i = 0; i < 10; i++) { var origBoard = _board.Copy(); var mv = _miniMaxService.GetNextMove(_board); Assert.IsTrue(_board.Equals(origBoard)); _board.MakeMove(mv); } }
public Move GetNextMove(Board board) { var newBoard = board.Copy(); return MiniMax(board, _maxDepth, _minScore, _maxScore, true).Move; }