public int EvaluateSlidingPiece(Position position, int color, int pieceType, int materialValue, int mobilityMultiplier, ref Bitboard destinationBitboard) { Bitboard pieces = position.GetPieceBitboard(color, pieceType); int score = 0; while (pieces != 0) { score += materialValue; int square = pieces.BitScanForward(); Bitboards.PopLsb(ref pieces); Bitboard attacks = 0; if (pieceType == Position.ROOK || pieceType == Position.QUEEN) { attacks = Bitboards.GetRookMoveBitboard(square, position.AllPiecesBitboard); } if (pieceType == Position.BISHOP || pieceType == Position.QUEEN) { attacks |= Bitboards.GetBishopMoveBitboard(square, position.AllPiecesBitboard); } attacks &= destinationBitboard; score += Bitboards.CountBits(attacks) * mobilityMultiplier; } return(score); }
static int[] GenerateShifts(Bitboard[] occupancyBBs) { int[] result = new int[64]; for (int i = 0; i < 64; i++) { result[i] = 64 - Bitboards.CountBits(occupancyBBs[i]); } return(result); }
public int EvaluateKnights(Position position, int color, int mobilityMultiplier, ref Bitboard destinationBitboard) { Bitboard pieces = position.GetPieceBitboard(color, Position.KNIGHT); int score = 0; while (pieces != 0) { score += 300; // Material value int square = pieces.BitScanForward(); Bitboards.PopLsb(ref pieces); score += mobilityMultiplier * (Bitboards.CountBits(destinationBitboard & Bitboards.KnightBitboards[square])); } return(score); }
public int EvaluatePosition(Position position) { int score = 0; Bitboard notWhite = ~position.GetPieceBitboard(Position.WHITE, Position.ALL_PIECES); Bitboard notBlack = ~position.GetPieceBitboard(Position.BLACK, Position.ALL_PIECES); // King mobility int whiteKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.WHITE, Position.KING)); int blackKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.BLACK, Position.KING)); int whiteKing = Bitboards.CountBits(notWhite & Bitboards.KingBitboards[whiteKingSquare]); int blackKing = Bitboards.CountBits(notBlack & Bitboards.KingBitboards[blackKingSquare]); // Queen evalution int whiteQueen = EvaluateSlidingPiece(position, Position.WHITE, Position.QUEEN, 900, 1, ref notWhite); int blackQueen = EvaluateSlidingPiece(position, Position.BLACK, Position.QUEEN, 900, 1, ref notBlack); // Rook Evaluation int whiteRook = EvaluateSlidingPiece(position, Position.WHITE, Position.ROOK, 500, 3, ref notWhite); int blackRook = EvaluateSlidingPiece(position, Position.BLACK, Position.ROOK, 500, 3, ref notBlack); // Bishop Evaluation int whiteBishop = EvaluateSlidingPiece(position, Position.WHITE, Position.BISHOP, 325, 8, ref notWhite); int blackBishop = EvaluateSlidingPiece(position, Position.BLACK, Position.BISHOP, 325, 8, ref notBlack); // Knight Evaluation int whiteKnight = EvaluateKnights(position, Position.WHITE, 8, ref notWhite); int blackKnight = EvaluateKnights(position, Position.BLACK, 8, ref notBlack); // For now, do not include pawn mobility int whitePawn = 100 * Bitboards.CountBits(position.GetPieceBitboard(Position.WHITE, Position.PAWN)); int blackPawn = 100 * Bitboards.CountBits(position.GetPieceBitboard(Position.BLACK, Position.PAWN)); score = whitePawn + whiteKnight + whiteBishop + whiteRook + whiteQueen + whiteKing; score -= (blackPawn + blackKnight + blackBishop + blackRook + blackQueen + blackKing); if (position.PlayerToMove == Position.BLACK) { score *= -1; } return(score); }
public int EvaluatePosition(Position position) { int score = 0; Bitboard notWhite = ~position.GetPieceBitboard(Position.WHITE, Position.ALL_PIECES); Bitboard notBlack = ~position.GetPieceBitboard(Position.BLACK, Position.ALL_PIECES); // King mobility int whiteKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.WHITE, Position.KING)); int blackKingSquare = Bitboards.BitScanForward(position.GetPieceBitboard(Position.BLACK, Position.KING)); int whiteKing = Bitboards.CountBits(notWhite & Bitboards.KingBitboards[whiteKingSquare]); int blackKing = Bitboards.CountBits(notBlack & Bitboards.KingBitboards[blackKingSquare]); // Queen evalution int whiteQueen = EvaluateSliders(ref position, Position.WHITE, Position.QUEEN); int blackQueen = EvaluateSliders(ref position, Position.BLACK, Position.QUEEN); // Rook Evaluation int whiteRook = EvaluateSliders(ref position, Position.WHITE, Position.ROOK); int blackRook = EvaluateSliders(ref position, Position.BLACK, Position.ROOK); // Bishop Evaluation int whiteBishop = EvaluateSliders(ref position, Position.WHITE, Position.BISHOP); int blackBishop = EvaluateSliders(ref position, Position.BLACK, Position.BISHOP); // Knight Evaluation int whiteKnight = EvaluateKnights(ref position, Position.WHITE); int blackKnight = EvaluateKnights(ref position, Position.BLACK); int whitePawn = EvaluatePawns(ref position, Position.WHITE); int blackPawn = EvaluatePawns(ref position, Position.BLACK); score = whitePawn + whiteKnight + whiteBishop + whiteRook + whiteQueen + whiteKing; score -= (blackPawn + blackKnight + blackBishop + blackRook + blackQueen + blackKing); if (position.PlayerToMove == Position.BLACK) { score *= -1; } return(score); }
public void CalculatesCorrectly() { Assert.AreEqual(10, Bitboards.CountBits(0x3578900000000UL)); Assert.AreEqual(0, Bitboards.CountBits(0)); Assert.AreEqual(64, Bitboards.CountBits(0xFFFFFFFFFFFFFFFFUL)); }