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