Simplification of KPsK function
Also the drawing criteria has been slightly loosened. It now detects a draw if the king is ahead of all the pawns and on the same file or the adjacent file. bench: 7700683sf_dd_base
parent
2bf18bfc63
commit
3cddb0c076
|
@ -684,25 +684,15 @@ ScaleFactor Endgame<KPsK>::operator()(const Position& pos) const {
|
|||
|
||||
Square ksq = pos.king_square(weakSide);
|
||||
Bitboard pawns = pos.pieces(strongSide, PAWN);
|
||||
Square psq = pos.list<PAWN>(strongSide)[0];
|
||||
|
||||
// If all pawns are ahead of the king, all pawns are on a single
|
||||
// rook file and the king is within one file of the pawns then draw.
|
||||
if ( !(pawns & ~in_front_bb(weakSide, rank_of(ksq)))
|
||||
&& !((pawns & ~FileABB) && (pawns & ~FileHBB))
|
||||
&& file_distance(ksq, psq) <= 1)
|
||||
return SCALE_FACTOR_DRAW;
|
||||
|
||||
// Are all pawns on the 'a' file?
|
||||
if (!(pawns & ~FileABB))
|
||||
{
|
||||
// Does the defending king block the pawns?
|
||||
if ( square_distance(ksq, relative_square(strongSide, SQ_A8)) <= 1
|
||||
|| ( file_of(ksq) == FILE_A
|
||||
&& !(in_front_bb(strongSide, rank_of(ksq)) & pawns)))
|
||||
return SCALE_FACTOR_DRAW;
|
||||
}
|
||||
// Are all pawns on the 'h' file?
|
||||
else if (!(pawns & ~FileHBB))
|
||||
{
|
||||
// Does the defending king block the pawns?
|
||||
if ( square_distance(ksq, relative_square(strongSide, SQ_H8)) <= 1
|
||||
|| ( file_of(ksq) == FILE_H
|
||||
&& !(in_front_bb(strongSide, rank_of(ksq)) & pawns)))
|
||||
return SCALE_FACTOR_DRAW;
|
||||
}
|
||||
return SCALE_FACTOR_NONE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue