mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 03:29:14 +00:00
Detect drawish KQKP endings
Based off of the rules from the wikipedia page, here: http://en.wikipedia.org/wiki/Queen_versus_pawn_endgame. bench does not change: 5312693 but patch is real, has been tested on specific positions.
This commit is contained in:
parent
b3d030294b
commit
cee6336515
2 changed files with 35 additions and 2 deletions
|
@ -95,6 +95,7 @@ Endgames::Endgames() {
|
|||
add<KRKP>("KRKP");
|
||||
add<KRKB>("KRKB");
|
||||
add<KRKN>("KRKN");
|
||||
add<KQKP>("KQKP");
|
||||
add<KQKR>("KQKR");
|
||||
add<KBBKN>("KBBKN");
|
||||
|
||||
|
@ -169,12 +170,12 @@ Value Endgame<KBNK>::operator()(const Position& pos) const {
|
|||
|
||||
Square winnerKSq = pos.king_square(strongerSide);
|
||||
Square loserKSq = pos.king_square(weakerSide);
|
||||
Square bishopSquare = pos.piece_list(strongerSide, BISHOP)[0];
|
||||
Square bishopSq = pos.piece_list(strongerSide, BISHOP)[0];
|
||||
|
||||
// kbnk_mate_table() tries to drive toward corners A1 or H8,
|
||||
// if we have a bishop that cannot reach the above squares we
|
||||
// mirror the kings so to drive enemy toward corners A8 or H1.
|
||||
if (opposite_colors(bishopSquare, SQ_A1))
|
||||
if (opposite_colors(bishopSq, SQ_A1))
|
||||
{
|
||||
winnerKSq = mirror(winnerKSq);
|
||||
loserKSq = mirror(loserKSq);
|
||||
|
@ -326,6 +327,37 @@ Value Endgame<KRKN>::operator()(const Position& pos) const {
|
|||
}
|
||||
|
||||
|
||||
/// KQ vs KP. In general, a win for the stronger side, however, there are a few
|
||||
/// important exceptions. Pawn on 7th rank, A,C,F or H file, with king next can
|
||||
/// be a draw, so we scale down to distance between kings only.
|
||||
template<>
|
||||
Value Endgame<KQKP>::operator()(const Position& pos) const {
|
||||
|
||||
assert(pos.non_pawn_material(strongerSide) == QueenValueMg);
|
||||
assert(pos.piece_count(strongerSide, PAWN) == 0);
|
||||
assert(pos.non_pawn_material(weakerSide) == 0);
|
||||
assert(pos.piece_count(weakerSide, PAWN) == 1);
|
||||
|
||||
Square winnerKSq = pos.king_square(strongerSide);
|
||||
Square loserKSq = pos.king_square(weakerSide);
|
||||
Square pawnSq = pos.piece_list(weakerSide, PAWN)[0];
|
||||
|
||||
Value result = QueenValueEg
|
||||
- PawnValueEg
|
||||
+ DistanceBonus[square_distance(winnerKSq, loserKSq)];
|
||||
|
||||
if ( square_distance(loserKSq, pawnSq) == 1
|
||||
&& relative_rank(weakerSide, pawnSq) == RANK_7)
|
||||
{
|
||||
File f = file_of(pawnSq);
|
||||
|
||||
if (f == FILE_A || f == FILE_C || f == FILE_F || f == FILE_H)
|
||||
result = Value(DistanceBonus[square_distance(winnerKSq, loserKSq)]);
|
||||
}
|
||||
return strongerSide == pos.side_to_move() ? result : -result;
|
||||
}
|
||||
|
||||
|
||||
/// KQ vs KR. This is almost identical to KX vs K: We give the attacking
|
||||
/// king a bonus for having the kings close together, and for forcing the
|
||||
/// defending king towards the edge. If we also take care to avoid null move
|
||||
|
|
|
@ -39,6 +39,7 @@ enum EndgameType {
|
|||
KRKP, // KR vs KP
|
||||
KRKB, // KR vs KB
|
||||
KRKN, // KR vs KN
|
||||
KQKP, // KQ vs KP
|
||||
KQKR, // KQ vs KR
|
||||
KBBKN, // KBB vs KN
|
||||
KNNK, // KNN vs K
|
||||
|
|
Loading…
Add table
Reference in a new issue