X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=b381b5c4abc3f567cec33c1b7a68964c70e65adf;hp=df7a0a2d3c507a1215b281b0a2ca6e4e4853c602;hb=6b7efa0cd14b73416c9030462f79a02bbfc7ad2c;hpb=c23cd4d90aa91504a5a3ec3ce896d1e35e34c494 diff --git a/src/pawns.cpp b/src/pawns.cpp index df7a0a2d..b381b5c4 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -70,6 +70,13 @@ namespace { S(34,68), S(83,166), S(0, 0), S( 0, 0) }; + // UnpairedPawnsTable[] gives a score according to the number + // of panws that do not have an enemy pawn in front of them. + const int UnpairedPawnsTable[8] = { + SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, + SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL + }; + // Pawn storm tables for positions with opposite castling const int QStormTable[64] = { 0, 0, 0, 0, 0, 0, 0, 0, @@ -187,6 +194,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, int bonus; Score value = make_score(0, 0); const Square* ptr = pos.piece_list_begin(Us, PAWN); + int unpairedPawnsNum = pos.piece_count(Us, PAWN); // Initialize pawn storm scores by giving bonuses for open files for (f = FILE_A; f <= FILE_H; f++) @@ -211,6 +219,10 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, doubled = ourPawns & squares_behind(Us, s); opposed = theirPawns & squares_in_front_of(Us, s); + // Decrease number of unpaired pawns + if (opposed) + unpairedPawnsNum--; + // We calculate kingside and queenside pawn storm // scores for both colors. These are used when evaluating // middle game positions with opposite side castling. @@ -337,6 +349,9 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, value += CandidateBonus[relative_rank(Us, s)]; } + // Calculate a scale factor to be used to evaluate if position is drawish + pi->factor[Us] = UnpairedPawnsTable[unpairedPawnsNum]; + return value; }