Пример #1
0
        public static ICollection <Move> Sort(this MoveSorter sorter, ICollection <Move> moves)
        {
            List <Move> sortedMoves = new List <Move>();

            sortedMoves.AddRange(moves);
            switch (sorter)
            {
            case MoveSorter.STANDARD:
                sortedMoves = sortedMoves.OrderBy(x => x.isCastlingMove(), new BoolComparer()).
                              ThenBy(x => x, new MoveComparer()).ToList();
                return(sortedMoves);

            case MoveSorter.EXPENSIVE:
                sortedMoves = sortedMoves.OrderBy(x => BoardUtils.kingThreat(x), new BoolComparer()).
                              ThenBy(x => x.isCastlingMove(), new BoolComparer()).
                              ThenBy(x => x, new MoveComparer()).ToList();
                return(sortedMoves);

            default:
                return(sortedMoves);
            }
        }
Пример #2
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);
        }