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),
|
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]
|
||||||
|
|||||||
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)]
|
#[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,
|
||||||
|
|||||||
Reference in New Issue
Block a user