From: Gary Linscott Date: Sun, 3 Feb 2013 20:42:51 +0000 (-0500) Subject: Add KBPKP endgame X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=c67fb8ef04439dbd208bfcd53a89367372ef84e7 Add KBPKP endgame It is a draw if pawns are on G or B files, weaker pawn is on rank 7 and bishop can't attack the pawn. No functional change (because it is very rare and does not appear in bench) --- diff --git a/src/endgame.cpp b/src/endgame.cpp index d60ce396..ae29a71a 100644 --- a/src/endgame.cpp +++ b/src/endgame.cpp @@ -471,6 +471,29 @@ ScaleFactor Endgame::operator()(const Position& pos) const { return SCALE_FACTOR_DRAW; } } + + // All pawns on same B or G file? Then potential draw + if ( (pawnFile == FILE_B || pawnFile == FILE_G) + && !(pos.pieces(PAWN) & ~file_bb(pawnFile)) + && pos.non_pawn_material(weakerSide) == 0 + && pos.piece_count(weakerSide, PAWN) >= 1) + { + // Get weaker pawn closest to opponent's queening square + Bitboard wkPawns = pos.pieces(weakerSide, PAWN); + Square weakerPawnSq = strongerSide == WHITE ? msb(wkPawns) : lsb(wkPawns); + + Square strongerKingSq = pos.king_square(strongerSide); + Square weakerKingSq = pos.king_square(weakerSide); + Square bishopSq = pos.piece_list(strongerSide, BISHOP)[0]; + + // Draw if weaker pawn is on rank 7, bishop can't attack the pawn, and + // weaker king can stop opposing opponent's king from penetrating. + if ( relative_rank(strongerSide, weakerPawnSq) == RANK_7 + && opposite_colors(bishopSq, weakerPawnSq) + && square_distance(weakerPawnSq, weakerKingSq) <= square_distance(weakerPawnSq, strongerKingSq)) + return SCALE_FACTOR_DRAW; + } + return SCALE_FACTOR_NONE; }