Implement halfmove/fullmove counters

This commit is contained in:
stefiosif
2024-08-14 00:24:05 +03:00
parent 989a2e33c5
commit a07324d81d
2 changed files with 29 additions and 7 deletions

View File

@@ -125,8 +125,9 @@ impl Board {
Some(mv.src - 8), Some(mv.src - 8),
), ),
}; };
let pawn_move = Self::is_pawn_move(mv.src, &own_pieces[Kind::Pawn]);
Self::update_game_state(&mut self.state, mv.src, mv.dst, color); Self::update_game_state(&mut self.state, mv, color, pawn_move);
match &mv.move_type { match &mv.move_type {
MoveType::Quiet => { MoveType::Quiet => {
@@ -161,10 +162,12 @@ impl Board {
} }
} }
fn update_game_state(state: &mut State, src: usize, dst: usize, color: Color) { fn update_game_state(state: &mut State, mv: &Move, color: Color, pawn_move: bool) {
state.set_en_passant_target_square(None); state.set_en_passant_target_square(None);
state.update_castling_state_quiet(src, color); state.update_castling_state_quiet(mv.src, color);
state.update_castling_state_capture(dst, Color::opponent_color(color)); state.update_castling_state_capture(mv.dst, Color::opponent_color(color));
state.update_half_move(mv.move_type, pawn_move);
state.update_full_move(color);
state.change_side(); state.change_side();
} }
@@ -214,6 +217,10 @@ impl Board {
Self::remove_piece(piece_to_remove, pieces); Self::remove_piece(piece_to_remove, pieces);
} }
const fn is_pawn_move(square: usize, pawns: &Piece) -> bool {
have_common_bit(square_to_bitboard(square), pawns.bitboard)
}
} }
#[cfg(test)] #[cfg(test)]
@@ -257,7 +264,7 @@ mod tests {
const FEN_EN_PASSANT: [&str; 2] = [ const FEN_EN_PASSANT: [&str; 2] = [
"r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R b KQkq h3 0 1", "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R b KQkq h3 0 1",
"r3k2r/2p1p1qp/2npb3/1p3p2/p3P3/P1PB1Q1p/1P1PNPP1/R3K2R w KQkq - 0 1", "r3k2r/2p1p1qp/2npb3/1p3p2/p3P3/P1PB1Q1p/1P1PNPP1/R3K2R w KQkq - 0 2",
]; ];
#[test] #[test]
@@ -316,7 +323,7 @@ mod tests {
const FEN_CASTLE: [&str; 2] = [ const FEN_CASTLE: [&str; 2] = [
"r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R w KQkq - 0 1", "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R3K2R w KQkq - 0 1",
"r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R4RK1 b kq - 0 1", "r3k2r/2p1p1qp/2npb3/1p3p2/p3P1pP/P1PB1Q2/1P1PNPP1/R4RK1 b kq - 1 1",
]; ];
#[test] #[test]

View File

@@ -1,4 +1,4 @@
use crate::board::Color; use crate::{board::Color, r#move::MoveType};
#[derive(Debug, PartialEq, Eq, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct State { pub struct State {
@@ -80,6 +80,21 @@ impl State {
} }
} }
pub fn update_half_move(&mut self, move_type: MoveType, pawn_move: bool) {
if move_type == MoveType::Capture || pawn_move {
self.halfmove_clock = 0;
} else {
self.halfmove_clock += 1;
}
}
pub fn update_full_move(&mut self, color: Color) {
match color {
Color::White => (),
Color::Black => self.fullmove_counter += 1,
}
}
pub fn change_side(&mut self) { pub fn change_side(&mut self) {
self.side_to_move = match self.side_to_move { self.side_to_move = match self.side_to_move {
Color::White => Color::Black, Color::White => Color::Black,