X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fendgame.cpp;h=efc41a98844799be346293c83e103da236b32a48;hp=66ee54d846044c90d03ec4dcaf9699e07aae13ee;hb=82ad9ce9cfb0eff33f1d781f329f7c5dc0b277eb;hpb=96ac85b3196ed7369a91a0852da0adcaf05a04b3;ds=inline
diff --git a/src/endgame.cpp b/src/endgame.cpp
index 66ee54d8..efc41a98 100644
--- a/src/endgame.cpp
+++ b/src/endgame.cpp
@@ -18,7 +18,6 @@
along with this program. If not, see .
*/
-#include
#include
#include "bitboard.h"
@@ -77,10 +76,7 @@ namespace {
if (file_of(pos.square(strongSide)) >= FILE_E)
sq = Square(sq ^ 7); // Mirror SQ_H1 -> SQ_A1
- if (strongSide == BLACK)
- sq = ~sq;
-
- return sq;
+ return strongSide == WHITE ? sq : ~sq;
}
} // namespace
@@ -131,7 +127,7 @@ Value Endgame::operator()(const Position& pos) const {
Square loserKSq = pos.square(weakSide);
Square bishopSq = pos.square(strongSide);
- // If our Bishop does not attack A1/H8, we flip the enemy king square
+ // 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
@@ -286,6 +282,21 @@ Value Endgame::operator()(const Position& pos) const {
}
+/// KNN vs KP. Simply push the opposing king to the corner
+template<>
+Value Endgame::operator()(const Position& pos) const {
+
+ assert(verify_material(pos, strongSide, 2 * KnightValueMg, 0));
+ assert(verify_material(pos, weakSide, VALUE_ZERO, 1));
+
+ Value result = 2 * KnightValueEg
+ - PawnValueEg
+ + PushToEdges[pos.square(weakSide)];
+
+ return strongSide == pos.side_to_move() ? result : -result;
+}
+
+
/// Some cases of trivial draws
template<> Value Endgame::operator()(const Position&) const { return VALUE_DRAW; }
@@ -724,6 +735,9 @@ ScaleFactor Endgame::operator()(const Position& pos) const {
template<>
ScaleFactor Endgame::operator()(const Position& pos) const {
+ assert(verify_material(pos, strongSide, KnightValueMg, 1));
+ assert(verify_material(pos, weakSide, BishopValueMg, 0));
+
Square pawnSq = pos.square(strongSide);
Square bishopSq = pos.square(weakSide);
Square weakKingSq = pos.square(weakSide);