示例#1
0
        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);
        }
示例#2
0
 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);
 }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 public void CalculatesCorrectly()
 {
     Assert.AreEqual(10, Bitboards.CountBits(0x3578900000000UL));
     Assert.AreEqual(0, Bitboards.CountBits(0));
     Assert.AreEqual(64, Bitboards.CountBits(0xFFFFFFFFFFFFFFFFUL));
 }