Implement halfmove/fullmove counters
This commit is contained in:
19
src/move.rs
19
src/move.rs
@@ -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]
|
||||
|
||||
17
src/state.rs
17
src/state.rs
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user