+ const int penalty[8] = { 0, 10, 14, 20, 30, 42, 58, 80 };
+
+ Square bksq = pos.king_square(weakerSide);
+ Square bnsq = pos.piece_list(weakerSide, KNIGHT)[0];
+ Value result = Value(MateTable[bksq] + penalty[square_distance(bksq, bnsq)]);
+ return strongerSide == pos.side_to_move() ? result : -result;
+}
+
+
+/// 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];