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); } }
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); }