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),
),
};
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 {
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.update_castling_state_quiet(src, color);
state.update_castling_state_capture(dst, Color::opponent_color(color));
state.update_castling_state_quiet(mv.src, 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();
}
@@ -214,6 +217,10 @@ impl Board {
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)]
@@ -257,7 +264,7 @@ mod tests {
const FEN_EN_PASSANT: [&str; 2] = [
"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]
@@ -316,7 +323,7 @@ mod tests {
const FEN_CASTLE: [&str; 2] = [
"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]

View File

@@ -1,4 +1,4 @@
use crate::board::Color;
use crate::{board::Color, r#move::MoveType};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
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) {
self.side_to_move = match self.side_to_move {
Color::White => Color::Black,