From 4a2a4c81c54f4725e1ff067dcb2688fb0168ae37 Mon Sep 17 00:00:00 2001 From: "Aode (lion)" Date: Fri, 31 Dec 2021 16:51:12 -0600 Subject: [PATCH] Add 'in check' logic --- src/board_state.rs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/board_state.rs b/src/board_state.rs index cf703d4..56a47a8 100644 --- a/src/board_state.rs +++ b/src/board_state.rs @@ -75,23 +75,38 @@ impl BoardState { } } - if (moving_color == Color::White && proposed.is_white_in_check()) - || (moving_color == Color::Black && proposed.is_black_in_check()) - { + if proposed.is_in_check(moving_color) { return; } *self = proposed; } - // TODO: this - fn is_black_in_check(&self) -> bool { - false - } + fn is_in_check(&self, color: Color) -> bool { + let mut tmp_board = self.clone(); - // TODO: this - fn is_white_in_check(&self) -> bool { - false + let king = Piece { + kind: PieceKind::King, + color: color.clone(), + }; + + let king_opt = self + .inner + .iter() + .find(|(_, piece_state)| piece_state.piece == king); + + if let Some((king_coords, _)) = king_opt { + self.inner + .iter() + .filter(|(_, piece_state)| piece_state.piece.color != color) + .any(|(coords, piece_state)| { + piece_state + .clone() + .can_move_to(coords, king_coords, &mut tmp_board) + }) + } else { + false + } } }