X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=65bb3dbaa38d1dcc9224639f6d0c5bf4ae860313;hp=2459a6b05ea09ab170c9e857324078bf807912b1;hb=97f5d19bdc0439f297ad11dd59997aba9342ce93;hpb=a9fa1fc7f76458b9e09410fe966f03324ada3cb3 diff --git a/src/pawns.cpp b/src/pawns.cpp index 2459a6b0..65bb3dba 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[16] = { 32, 48, 64, 80, 96, 112, 128, 128, 128 }; + + // PawnsQtyTable[] gives a score according to the number of panws + const int PawnsQtyTable[16] = { 16, 16, 16, 16, 16, 16, 16, 16, 16 }; + // Pawn storm tables for positions with opposite castling const int QStormTable[64] = { 0, 0, 0, 0, 0, 0, 0, 0, @@ -183,10 +190,11 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, Square s; File f; Rank r; - bool passed, isolated, doubled, chain, backward, candidate; + bool passed, isolated, doubled, opposed, chain, backward, candidate; 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++) @@ -209,6 +217,11 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, passed = !(theirPawns & passed_pawn_mask(Us, s)); isolated = !(ourPawns & neighboring_files_bb(s)); 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 @@ -299,7 +312,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // Test for candidate passed pawn candidate = !passed - && !(theirPawns & file_bb(f)) + && !opposed && ( count_1s_max_15(neighboring_files_bb(f) & (behind_bb(Us, r) | rank_bb(r)) & ourPawns) - count_1s_max_15(neighboring_files_bb(f) & in_front_bb(Us, r) & theirPawns) >= 0); @@ -336,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] * PawnsQtyTable[pos.piece_count(Us, PAWN)] / 16; + return value; }