Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }