From 9e552430fa77241db036244001e6bf466996de7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Macio=C5=82ek?= Date: Tue, 9 Jul 2024 23:29:44 +0200 Subject: [PATCH] generate pawn moves p3 --- src/board.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/board.rs b/src/board.rs index 0406272..51990ae 100644 --- a/src/board.rs +++ b/src/board.rs @@ -221,17 +221,26 @@ impl Board { }; } - fn is_starting_position(&self, color: Color, position: usize) -> bool { + /// Check if pawn position is starting position + fn is_pawn_starting_position(&self, color: Color, position: usize) -> bool { match color { Color::White => (8..16).contains(&position), Color::Black => (48..56).contains(&position), } } + /// Check is square is empty fn is_square_empty(&self, index: usize, occupancy: Bitboard) -> bool { !occupancy.is_set(index) } + fn is_square_enemy(&self, color: Color, position: usize) -> bool { + match color { + Color::White => self.black_occupancy.is_set(position), + Color::Black => self.white_occupancy.is_set(position), + } + } + /// Generate all possible moves at the specified square index pub fn generate_moves(&self, index: usize) -> Vec { let mut moves = Vec::new(); @@ -255,11 +264,20 @@ impl Board { moves.push(single_forward as usize); } - if self.is_starting_position(self.turn, position) { + if self.is_pawn_starting_position(self.turn, position) { let double_forward = single_forward + direction; if self.is_square_empty(double_forward as usize, occupancy) { moves.push(double_forward as usize); } } + + let left_capture = single_forward - 1; + let right_capture = single_forward + 1; + if self.is_square_enemy(self.turn, left_capture as usize) { + moves.push(left_capture as usize); + } + if self.is_square_enemy(self.turn, right_capture as usize) { + moves.push(right_capture as usize); + } } }