public Move GetBestMove(Board board) { int bestValue = int.MinValue; Move bestMove = null; List <Move> pseudoLegalMoves = MoveGeneration.GenerateAllMoves(board, Piece.black); SortMoves(board, pseudoLegalMoves); foreach (var move in pseudoLegalMoves) { board.MakeMove(move, true); if (MoveGeneration.IsInCheck(board, Piece.black)) { board.UnMakeMove(true); continue; } int value = Minimax(board, depth, int.MinValue, int.MaxValue, false); board.UnMakeMove(true); if (value >= bestValue) { bestValue = value; bestMove = move; } } return(bestMove); }
private int Minimax(Board board, int depth, int alpha, int beta, bool isMaximizingPlayer) { if (depth == 0) { return(Evaluate(board)); } if (isMaximizingPlayer) { int bestValue = int.MinValue; List <Move> pseudoLegalMoves = MoveGeneration.GenerateAllMoves(board, Piece.black); SortMoves(board, pseudoLegalMoves); foreach (var move in pseudoLegalMoves) { board.MakeMove(move, true); if (MoveGeneration.IsInCheck(board, Piece.black)) { board.UnMakeMove(true); continue; } int value = Minimax(board, depth - 1, alpha, beta, false); board.UnMakeMove(true); bestValue = Math.Max(value, bestValue); alpha = Math.Max(alpha, value); if (beta <= alpha) { break; } } return(bestValue); } else { int bestValue = int.MaxValue; List <Move> pseudoLegalMoves = MoveGeneration.GenerateAllMoves(board, Piece.white); SortMoves(board, pseudoLegalMoves); foreach (var move in pseudoLegalMoves) { board.MakeMove(move, true); if (MoveGeneration.IsInCheck(board, Piece.white)) { board.UnMakeMove(true); continue; } int value = Minimax(board, depth - 1, alpha, beta, true); board.UnMakeMove(true); bestValue = Math.Min(value, bestValue); beta = Math.Min(beta, value); if (beta <= alpha) { break; } } return(bestValue); } }