From 6d8f583af26daa1c158324d5c13cf01b17c746a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ste=CC=81phane=20Nicolet?= Date: Wed, 7 Mar 2018 22:12:29 +0100 Subject: [PATCH] Knight threats on Queen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We give a S(21,11) bonus for knight threats on the next moves against enemy queen. The threats are from squares which are "not strongly protected" and which may be empty, contain enemy pieces or even one of our piece at the moment (N,B,Q,R) -- hence be two-steps threats in the later case because we will have to move our piece and *then* attack the enemy queen with the knight. STC: http://tests.stockfishchess.org/tests/view/5a9e442e0ebc590297cb6162 LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 35129 W: 7346 L: 7052 D: 20731 LTC: http://tests.stockfishchess.org/tests/view/5a9e6e620ebc590297cb617f LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 42442 W: 6695 L: 6414 D: 29333 How to continue from there? • Trying to refine the threat condition ("not strongly protected") • Trying the two-steps idea for bishops or rooks threats against queen Bench: 6051247 --- src/evaluate.cpp | 14 +++++++++++++- src/pawns.cpp | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 2b901bbd..1e5c588a 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -167,6 +167,7 @@ namespace { const Score CloseEnemies = S( 7, 0); const Score Hanging = S( 52, 30); const Score HinderPassedPawn = S( 8, 1); + const Score KnightOnQueen = S( 21, 11); const Score LongRangedBishop = S( 22, 0); const Score MinorBehindPawn = S( 16, 0); const Score PawnlessFlank = S( 20, 80); @@ -489,7 +490,7 @@ namespace { if (!(pos.pieces(PAWN) & kf)) score -= PawnlessFlank; - // Find the squares that opponent attacks in our king flank, and the squares + // Find the squares that opponent attacks in our king flank, and the squares // which are attacked twice in that flank but not defended by our pawns. b1 = attackedBy[Them][ALL_PIECES] & kf & Camp; b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; @@ -595,6 +596,17 @@ namespace { score += ThreatOnQueen * popcount(b & safeThreats); + // Bonus for knight threats on the next moves against enemy queen + if (pos.count(Them) == 1) + { + b = pos.attacks_from(pos.square(Them)) + & attackedBy[Us][KNIGHT] + & ~pos.pieces(Us, PAWN, KING) + & ~stronglyProtected; + + score += KnightOnQueen * popcount(b); + } + if (T) Trace::add(THREAT, Us, score); diff --git a/src/pawns.cpp b/src/pawns.cpp index 29a98751..67bf59d1 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -237,7 +237,7 @@ template Value Entry::shelter_storm(const Position& pos, Square ksq) { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); - constexpr Bitboard ShelterMask = + constexpr Bitboard ShelterMask = Us == WHITE ? make_bitboard(SQ_A2, SQ_B3, SQ_C2, SQ_F2, SQ_G3, SQ_H2) : make_bitboard(SQ_A7, SQ_B6, SQ_C7, SQ_F7, SQ_G6, SQ_H7); constexpr Bitboard StormMask = -- 2.39.2