From 21a2a37e1f843684aa589c809db23df441c01edb Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Wed, 2 Jul 2025 18:30:13 -0700 Subject: [PATCH] [board] Implement Board::is_king_attacked_from_square Calculate whether the active color's king is attacked from the provided Square. --- board/src/check.rs | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/board/src/check.rs b/board/src/check.rs index 6d8ceba..e905498 100644 --- a/board/src/check.rs +++ b/board/src/check.rs @@ -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) -> 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)); + } }