Initial implementation of CheckingPieces and Position::checking_pieces()

This commit is contained in:
Eryn Wells 2024-01-28 09:51:58 -08:00
parent 26aedd8899
commit 8aa5dacfc8
3 changed files with 68 additions and 0 deletions

29
position/src/check.rs Normal file
View file

@ -0,0 +1,29 @@
// Eryn Wells <eryn@erynwells.me>
use chessfriend_bitboard::BitBoard;
pub struct CheckingPieces {
pawn: BitBoard,
knight: BitBoard,
bishop: BitBoard,
rook: BitBoard,
queen: BitBoard,
}
impl CheckingPieces {
pub(crate) fn new(
pawn: BitBoard,
knight: BitBoard,
bishop: BitBoard,
rook: BitBoard,
queen: BitBoard,
) -> CheckingPieces {
CheckingPieces {
pawn,
knight,
bishop,
rook,
queen,
}
}
}

View file

@ -2,6 +2,7 @@
pub mod fen;
mod check;
mod display;
mod r#move;
mod move_generator;

View file

@ -249,6 +249,44 @@ impl Position {
.next()
.unwrap()
}
pub(crate) fn checking_pieces(&self) -> CheckingPieces {
let opponent = self.color_to_move.other();
let king_square = self.king_square(self.color_to_move);
let checking_pawns = {
// The current player's pawn attack moves *from* this square are the
// same as the pawn moves for the opposing player attacking this square.
let pawn_moves_to_king_square = BitBoard::pawn_attacks(king_square, self.color_to_move);
let opposing_pawn = Piece::pawn(opponent);
let opposing_pawns = self.pieces.bitboard_for_piece(&opposing_pawn);
pawn_moves_to_king_square & opposing_pawns
};
macro_rules! checking_piece {
($moves_bb_fn:path, $piece_fn:path) => {{
let moves_from_opposing_square = $moves_bb_fn(king_square);
let piece = $piece_fn(opponent);
let opposing_pieces = self.pieces.bitboard_for_piece(&piece);
moves_from_opposing_square & opposing_pieces
}};
}
let checking_knights = checking_piece!(BitBoard::knight_moves, Piece::knight);
let checking_bishops = checking_piece!(BitBoard::bishop_moves, Piece::bishop);
let checking_rooks = checking_piece!(BitBoard::rook_moves, Piece::rook);
let checking_queens = checking_piece!(BitBoard::queen_moves, Piece::queen);
CheckingPieces::new(
checking_pawns,
checking_knights,
checking_bishops,
checking_rooks,
checking_queens,
)
}
}
// crate::position methods