1
0
Fork 0

Bug fix for KQKRPs endgame

This lost position 8/8/3q4/8/5k2/2P1R3/2K2P2/8 w - - 0 1
was previously evaluated as a draw.

The king and rook need to be correctly placed with
respect to the _same_ pawn.

(Note also that the check for the pawn being on RANK_2
in the old version is redundant: it must be on RANK_2 if
it hopes to protect a rook on RANK_3)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
sf_dd_base
Chris Caino 2013-10-15 00:09:05 +01:00 committed by Marco Costalba
parent 5aeb907fa1
commit 2bf18bfc63
1 changed files with 4 additions and 4 deletions

View File

@ -464,10 +464,10 @@ ScaleFactor Endgame<KQKRPs>::operator()(const Position& pos) const {
if ( relative_rank(weakSide, kingSq) <= RANK_2
&& relative_rank(weakSide, pos.king_square(strongSide)) >= RANK_4
&& (pos.pieces(weakSide, ROOK) & rank_bb(relative_rank(weakSide, RANK_3)))
&& (pos.pieces(weakSide, PAWN) & rank_bb(relative_rank(weakSide, RANK_2)))
&& (pos.attacks_from<KING>(kingSq) & pos.pieces(weakSide, PAWN))
&& (pos.attacks_from<PAWN>(rsq, strongSide) & pos.pieces(weakSide, PAWN)))
&& relative_rank(weakSide, rsq) == RANK_3
&& ( pos.pieces(weakSide, PAWN)
& pos.attacks_from<KING>(kingSq)
& pos.attacks_from<PAWN>(rsq, strongSide)))
return SCALE_FACTOR_DRAW;
return SCALE_FACTOR_NONE;