Beispiel #1
0
        public int EvaluatePawns(ref Position position, int color)
        {
            int score = 0;

            Bitboard myPawns  = position.GetPieceBitboard(color, Position.PAWN);
            Bitboard myPieces = position.GetPieceBitboard(color, Position.ALL_PIECES);

            Bitboard opponentPawns =
                position.GetPieceBitboard(color == Position.WHITE ? Position.BLACK : Position.WHITE, Position.PAWN);

            Bitboard allPawns = myPawns | opponentPawns;

            Bitboard pawns = myPawns;

            while (pawns != 0)
            {
                score += materialValues[Position.PAWN];

                int currSquare = pawns.BitScanForward();
                Bitboards.PopLsb(ref pawns);

                // Add bonus based on file of pawn (to promote taking towards the center)
                score += pawnFileBonus[Bitboards.GetColumn(currSquare)];

                // Analyze stacked pawns
                Bitboard filePawns = Bitboards.ColumnBitboards[currSquare] & myPawns;

                if ((filePawns & (filePawns - 1)) != 0) // More than 1 pawn in this rank
                {
                    score -= stackedPawnPenalty;
                }

                // Analyze isolated pawns
                if ((Bitboards.IsolatedPawnBitboards[currSquare] & myPawns) == 0)
                {
                    score -= isolatedPawnPenalty;
                }

                // Analyze passed pawns
                if ((Bitboards.PassedPawnBitboards[color, currSquare] & allPawns) == 0)
                {
                    score += passedPawnBonus[color, Bitboards.GetRow(currSquare)];
                }

                Bitboard pawnAttacks = Bitboards.PawnBitboards[color, currSquare];
                while (pawnAttacks != 0)
                {
                    int attackSquare = pawnAttacks.BitScanForward();
                    Bitboards.PopLsb(ref pawnAttacks);
                    int attackedPiece = position.GetPieceSquares()[attackSquare];
                    if (attackedPiece == Position.EMPTY || (myPieces & Bitboards.SquareBitboards[attackSquare]) != 0)
                    {
                        continue;
                    }
                    score += attackBonus[attackedPiece];
                }
            }
            return(score);
        }
Beispiel #2
0
        public int EvaluatePawnStructure(Position position, int color)
        {
            int score = 0;

            Bitboard myPawns = position.GetPieceBitboard(color, Position.PAWN);

            Bitboard opponentPawns =
                position.GetPieceBitboard(color == Position.WHITE ? Position.BLACK : Position.WHITE, Position.PAWN);

            Bitboard allPawns = myPawns | opponentPawns;

            Bitboard pawns = myPawns;

            while (pawns != 0)
            {
                int currSquare = pawns.BitScanForward();
                Bitboards.PopLsb(ref pawns);

                // Add bonus based on file of pawn (to promote taking towards the center)
                score += pawnFileBonus[Bitboards.GetColumn(currSquare)];

                // Analyze stacked pawns
                Bitboard filePawns = Bitboards.ColumnBitboards[currSquare] & myPawns;

                if ((filePawns & (filePawns - 1)) != 0) // More than 1 pawn in this rank
                {
                    score -= stackedPawnPenalty;
                }

                // Analyze isolated pawns
                if ((Bitboards.IsolatedPawnBitboards[currSquare] & myPawns) == 0)
                {
                    score -= isolatedPawnPenalty;
                }

                // Analyze passed pawns
                if ((Bitboards.PassedPawnBitboards[color, currSquare] & allPawns) == 0)
                {
                    score += passedPawnBonus[color, Bitboards.GetRow(currSquare)];
                }
            }
            return(score);
        }