Skip to content

Commit

Permalink
Simplify KBNK endgame implementation
Browse files Browse the repository at this point in the history
We do not need to change the winnerKSq variable, so we can simplify
a little bit the logic of the code by changing only the loserKSq
variable when it is necessary. Also consolidate and clarify comments.

See the pull request thread for a proof that the code is correct:
#1854

No functional change
  • Loading branch information
protonspring authored and snicolet committed Dec 20, 2018
1 parent 0f2df4e commit b54bcfd
Showing 1 changed file with 4 additions and 10 deletions.
14 changes: 4 additions & 10 deletions src/endgame.cpp
Expand Up @@ -120,7 +120,7 @@ Value Endgame<KXK>::operator()(const Position& pos) const {


/// Mate with KBN vs K. This is similar to KX vs K, but we have to drive the
/// defending king towards a corner square of the right color.
/// defending king towards a corner square that our bishop attacks.
template<>
Value Endgame<KBNK>::operator()(const Position& pos) const {

Expand All @@ -131,18 +131,12 @@ Value Endgame<KBNK>::operator()(const Position& pos) const {
Square loserKSq = pos.square<KING>(weakSide);
Square bishopSq = pos.square<BISHOP>(strongSide);

// kbnk_mate_table() tries to drive toward corners A1 or H8. If we have a
// bishop that cannot reach the above squares, we flip the kings in order
// to drive the enemy toward corners A8 or H1.
if (opposite_colors(bishopSq, SQ_A1))
{
winnerKSq = ~winnerKSq;
loserKSq = ~loserKSq;
}
// If our Bishop does not attack A1/H8, we flip the enemy king square
// to drive to opposite corners (A8/H1).

Value result = VALUE_KNOWN_WIN
+ PushClose[distance(winnerKSq, loserKSq)]
+ PushToCorners[loserKSq];
+ PushToCorners[opposite_colors(bishopSq, SQ_A1) ? ~loserKSq : loserKSq];

return strongSide == pos.side_to_move() ? result : -result;
}
Expand Down

0 comments on commit b54bcfd

Please sign in to comment.