public static int Evaluate(BoardState board, int color, int openingPhase, int endingPhase) { var doubledRooks = 0; var rooksOnOpenFile = 0; var pairOfBishops = 0; var enemyColor = ColorOperations.Invert(color); var rooks = board.Pieces[color][Piece.Rook]; while (rooks != 0) { var lsb = BitOperations.GetLsb(rooks); var field = BitOperations.BitScan(lsb); rooks = BitOperations.PopLsb(rooks); var file = FilePatternGenerator.GetPattern(field) | lsb; var rooksOnFile = file & board.Pieces[color][Piece.Rook]; var friendlyPawnsOnFile = file & board.Pieces[color][Piece.Pawn]; var enemyPawnsOnFile = file & board.Pieces[enemyColor][Piece.Pawn]; if (BitOperations.Count(rooksOnFile) > 1) { // We don't assume that there will be more than two rooks - even if, then this color is probably anyway winning doubledRooks = 1; } if (friendlyPawnsOnFile == 0 && enemyPawnsOnFile == 0) { rooksOnOpenFile++; } } var bishops = board.Pieces[color][Piece.Bishop]; if (BitOperations.Count(bishops) > 1) { pairOfBishops = 1; } var doubledRooksOpeningScore = doubledRooks * EvaluationConstants.DoubledRooks; var doubledRooksAdjusted = TaperedEvaluation.AdjustToPhase(doubledRooksOpeningScore, 0, openingPhase, endingPhase); var rooksOnOpenFileOpeningScore = rooksOnOpenFile * EvaluationConstants.RookOnOpenFile; var rooksOnOpenFileAdjusted = TaperedEvaluation.AdjustToPhase(rooksOnOpenFileOpeningScore, 0, openingPhase, endingPhase); var pairOfBishopsOpeningScore = pairOfBishops * EvaluationConstants.PairOfBishops; var pairOfBishopsAdjusted = TaperedEvaluation.AdjustToPhase(pairOfBishopsOpeningScore, 0, openingPhase, endingPhase); return(doubledRooksAdjusted + rooksOnOpenFileAdjusted + pairOfBishopsAdjusted); }
public static MagicContainer[] GenerateRookAttacks(ulong[] keys = null) { var masks = new ulong[64]; var permutations = new ulong[64][]; var attacks = new ulong[64][]; for (var fieldIndex = 0; fieldIndex < 64; fieldIndex++) { masks[fieldIndex] = (FilePatternGenerator.GetPattern(fieldIndex) & ~BoardConstants.TopBottomEdge) | (RankPatternGenerator.GetPattern(fieldIndex) & ~BoardConstants.RightLeftEdge); permutations[fieldIndex] = new ulong[1 << MagicShifts.RookShifts[fieldIndex]]; attacks[fieldIndex] = new ulong[1 << MagicShifts.RookShifts[fieldIndex]]; for (var permutationIndex = 0; permutationIndex < permutations[fieldIndex].Length; permutationIndex++) { permutations[fieldIndex][permutationIndex] = PermutationsGenerator.GetPermutation(masks[fieldIndex], permutationIndex); attacks[fieldIndex][permutationIndex] = AttacksGenerator.GetFileRankAttacks(permutations[fieldIndex][permutationIndex], fieldIndex); } } return(_rookMagicArray = GenerateAttacks(masks, permutations, attacks, MagicShifts.RookShifts, keys)); }