1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

Improve KBPsK endgame

Better endgame with bishop and blocked g-pawn

bench: 8279065
This commit is contained in:
ceebo 2013-10-13 16:44:51 +01:00 committed by Marco Costalba
parent 549b5c478f
commit e9366fa155

View file

@ -451,13 +451,27 @@ ScaleFactor Endgame<KBPsK>::operator()(const Position& pos) const {
Square weakerKingSq = pos.king_square(weakerSide); Square weakerKingSq = pos.king_square(weakerSide);
Square bishopSq = pos.list<BISHOP>(strongerSide)[0]; Square bishopSq = pos.list<BISHOP>(strongerSide)[0];
// Draw if weaker pawn is on rank 7, bishop can't attack the pawn, and // Potential for a draw if our pawn is blocked on the 7th rank
// weaker king can stop opposing opponent's king from penetrating. // the bishop cannot attack it or they only have one pawn left
if ( relative_rank(strongerSide, weakerPawnSq) == RANK_7 if ( relative_rank(strongerSide, weakerPawnSq) == RANK_7
&& opposite_colors(bishopSq, weakerPawnSq) && (pos.pieces(strongerSide, PAWN) & (weakerPawnSq + pawn_push(weakerSide)))
&& square_distance(weakerPawnSq, weakerKingSq) <= square_distance(weakerPawnSq, strongerKingSq)) && (opposite_colors(bishopSq, weakerPawnSq) || pos.count<PAWN>(strongerSide) == 1))
{
int strongerKingDist = square_distance(weakerPawnSq, strongerKingSq);
int weakerKingDist = square_distance(weakerPawnSq, weakerKingSq);
// Draw if the weak king is on it's back two ranks, within 2
// squares of the blocking pawn and the strong king is not
// closer. (I think this rule only fails in practically
// unreachable positions such as 5k1K/6p1/6P1/8/8/3B4/8/8 w
// and positions where qsearch will immediately correct the
// problem such as 8/4k1p1/6P1/1K6/3B4/8/8/8 w)
if ( relative_rank(strongerSide, weakerKingSq) >= RANK_7
&& weakerKingDist <= 2
&& weakerKingDist <= strongerKingDist)
return SCALE_FACTOR_DRAW; return SCALE_FACTOR_DRAW;
} }
}
return SCALE_FACTOR_NONE; return SCALE_FACTOR_NONE;
} }