Beispiel #1
0
        private static int DoAlphaBetaPruning(int depth, int alpha, int beta)
        {
            VisitedNodes++;

            List <Move> availableMoves = MoveGenerator.GetAvailableMoves(position);

            position.PieceActivity = availableMoves.Count;
            int gameStateScore = GetGameStateScore(position, availableMoves.Count, depth);

            if (gameStateScore != 9999)
            {
                return(gameStateScore);
            }

            MoveSorter.SortMoves(position, availableMoves, killerMoves, depth);

            for (int moveIndex = 0; moveIndex < availableMoves.Count; moveIndex++)
            {
                Move currentMove = availableMoves[moveIndex];

                position.MakeMove(currentMove);

                long zobristKey = ZobristHasher.GetZobristHash(position);

                if (!position.GameHistory.ContainsKey(zobristKey))
                {
                    position.GameHistory.Add(zobristKey, 1);
                }
                else
                {
                    position.GameHistory[zobristKey]++;
                }

                int score =
                    (position.TranspositionTable.ContainsKey(zobristKey) &&
                     position.TranspositionTable[zobristKey].Depth >= depth) ?
                    position.TranspositionTable[zobristKey].Score :
                    DoAlphaBetaPruning(depth + 1, alpha, beta);

                position.UndoMove(currentMove);
                position.GameHistory.Remove(zobristKey);

                if (position.SideToMove == maximizingSide)
                {
                    if (score >= beta)
                    {
                        TryAddKillerMove(currentMove, depth);

                        return(beta);
                    }

                    if (score > alpha)
                    {
                        alpha = score;

                        if (depth == 0)
                        {
                            position.MaximizingSideBestMove = currentMove;
                        }

                        UpdatePrincipalVariation(depth, currentMove);
                        TryAddTableEntry(zobristKey, score, depth, currentMove);
                    }
                }
                else
                {
                    if (score <= alpha)
                    {
                        return(alpha);
                    }

                    if (score <= beta)
                    {
                        beta = score;

                        UpdatePrincipalVariation(depth, currentMove);
                    }
                }
            }

            return((position.SideToMove == maximizingSide) ? alpha : beta);
        }