mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Fix small bug in move_attacks_square()
We test if the piece moved in 'to' attacks the square 's' with: bit_is_set(attacks_from(piece, to), s)) But we should instead consider the new occupancy, changed after the piece is moved, and so test with: bit_is_set(attacks_from(piece, to, occ), s)) Otherwise we can miss some cases, for instance a queen in b1 that moves in c1 is not detected to attack a1 while instead she does. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
29be28e1a2
commit
c6f497f09d
1 changed files with 15 additions and 12 deletions
|
@ -377,7 +377,7 @@ template Bitboard Position::hidden_checkers<true>() const;
|
||||||
template Bitboard Position::hidden_checkers<false>() const;
|
template Bitboard Position::hidden_checkers<false>() const;
|
||||||
|
|
||||||
|
|
||||||
/// Position::attackers_to() computes a bitboard of all pieces which attacks a
|
/// Position::attackers_to() computes a bitboard of all pieces which attack a
|
||||||
/// given square. Slider attacks use occ bitboard as occupancy.
|
/// given square. Slider attacks use occ bitboard as occupancy.
|
||||||
|
|
||||||
Bitboard Position::attackers_to(Square s, Bitboard occ) const {
|
Bitboard Position::attackers_to(Square s, Bitboard occ) const {
|
||||||
|
@ -417,22 +417,25 @@ bool Position::move_attacks_square(Move m, Square s) const {
|
||||||
assert(square_is_ok(s));
|
assert(square_is_ok(s));
|
||||||
|
|
||||||
Bitboard occ, xray;
|
Bitboard occ, xray;
|
||||||
Square f = move_from(m), t = move_to(m);
|
Square from = move_from(m);
|
||||||
|
Square to = move_to(m);
|
||||||
|
Piece piece = piece_on(from);
|
||||||
|
|
||||||
assert(!square_is_empty(f));
|
assert(!square_is_empty(from));
|
||||||
|
|
||||||
if (bit_is_set(attacks_from(piece_on(f), t), s))
|
// Update occupancy as if the piece is moving
|
||||||
|
occ = occupied_squares();
|
||||||
|
do_move_bb(&occ, make_move_bb(from, to));
|
||||||
|
|
||||||
|
// The piece moved in 'to' attacks the square 's' ?
|
||||||
|
if (bit_is_set(attacks_from(piece, to, occ), s))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Move the piece and scan for X-ray attacks behind it
|
// Scan for possible X-ray attackers behind the moved piece
|
||||||
occ = occupied_squares();
|
xray = (rook_attacks_bb(s, occ) & pieces(ROOK, QUEEN, color_of(piece)))
|
||||||
do_move_bb(&occ, make_move_bb(f, t));
|
|(bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN, color_of(piece)));
|
||||||
xray = ( (rook_attacks_bb(s, occ) & pieces(ROOK, QUEEN))
|
|
||||||
|(bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN)))
|
|
||||||
& pieces(color_of(piece_on(f)));
|
|
||||||
|
|
||||||
// If we have attacks we need to verify that are caused by our move
|
// Verify attackers are triggered by our move and not already existing
|
||||||
// and are not already existent ones.
|
|
||||||
return xray && (xray ^ (xray & attacks_from<QUEEN>(s)));
|
return xray && (xray ^ (xray & attacks_from<QUEEN>(s)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue