[board] Implement Board::is_king_attacked_from_square

Calculate whether the active color's king is attacked from the provided Square.
This commit is contained in:
Eryn Wells 2025-07-02 18:30:13 -07:00
parent 89a9588e69
commit 21a2a37e1f

View file

@ -2,19 +2,34 @@
use crate::Board;
use chessfriend_bitboard::BitBoard;
use chessfriend_core::{Color, Piece};
use chessfriend_core::{Color, Piece, Square};
impl Board {
/// Return whether the active color is in check.
#[must_use]
pub fn is_in_check(&self) -> bool {
let color = self.active_color();
let king = self.king_bitboard(color);
let king = self.king_bitboard_active();
let opposing_sight = self.opposing_sight(color);
(king & opposing_sight).is_populated()
}
fn king_bitboard(&self, color: Color) -> BitBoard {
fn is_king_attacked_from_square(&self, square: Square) -> bool {
let active_king = self.king_bitboard_active();
let sight_from_square = self.sight_piece(square);
(active_king & sight_from_square).is_populated()
}
fn king_bitboard(&self, color: Option<Color>) -> BitBoard {
self.king_bitboard_unwrapped(self.unwrap_color(color))
}
fn king_bitboard_active(&self) -> BitBoard {
self.king_bitboard_unwrapped(self.active_color())
}
fn king_bitboard_unwrapped(&self, color: Color) -> BitBoard {
self.find_pieces(Piece::king(color))
}
}
@ -22,7 +37,7 @@ impl Board {
#[cfg(test)]
mod tests {
use crate::test_board;
use chessfriend_core::Color;
use chessfriend_core::Square;
#[test]
fn active_color_is_in_check() {
@ -43,4 +58,17 @@ mod tests {
assert!(!board.is_in_check());
}
#[test]
fn king_is_attacked_from_square() {
let board = test_board!(
White King on D3,
Black Rook on H3,
Black Queen on F4
);
assert!(board.is_king_attacked_from_square(Square::H3));
assert!(!board.is_king_attacked_from_square(Square::F4));
assert!(!board.is_king_attacked_from_square(Square::A3));
}
}