[board] Replace active player and move properties on Board with MoveCounter instance

This commit is contained in:
Eryn Wells 2025-05-02 15:18:37 -07:00
parent 58cbe07136
commit cd60a453aa
3 changed files with 24 additions and 49 deletions

View file

@ -1,7 +1,8 @@
// Eryn Wells <eryn@erynwells.me>
use crate::{
display::DiagramFormatter, piece_sets::PlacePieceError, Castle, EnPassant, Flags, PieceSet,
display::DiagramFormatter, piece_sets::PlacePieceError, Castle, EnPassant, Flags, MoveCounter,
PieceSet,
};
use chessfriend_bitboard::BitBoard;
use chessfriend_core::{Color, Piece, PlacedPiece, Shape, Square};
@ -9,12 +10,10 @@ use std::iter::Iterator;
#[derive(Clone, Debug, Eq)]
pub struct Board {
player_to_move: Color,
flags: Flags,
pieces: PieceSet,
en_passant: Option<EnPassant>,
half_move_counter: u16,
full_move_number: u16,
pub move_counter: MoveCounter,
}
impl Board {
@ -46,7 +45,6 @@ impl Board {
];
Self {
player_to_move: Color::White,
pieces: PieceSet::new([WHITE_PIECES, BLACK_PIECES]),
..Default::default()
}
@ -72,22 +70,7 @@ impl Board {
#[must_use]
pub fn player_to_move(&self) -> Color {
self.player_to_move
}
#[must_use]
pub fn move_number(&self) -> u16 {
self.full_move_number
}
#[must_use]
pub fn ply_counter(&self) -> u16 {
self.half_move_counter
}
#[must_use]
pub fn flags(&self) -> &Flags {
&self.flags
self.move_counter.active_color
}
/// Returns `true` if the player has the right to castle on the given side
@ -199,12 +182,10 @@ impl Board {
impl Default for Board {
fn default() -> Self {
Self {
player_to_move: Color::default(),
flags: Flags::default(),
pieces: PieceSet::default(),
en_passant: None,
half_move_counter: 0,
full_move_number: 1,
move_counter: MoveCounter::default(),
}
}
}
@ -212,9 +193,9 @@ impl Default for Board {
impl PartialEq for Board {
fn eq(&self, other: &Self) -> bool {
self.pieces == other.pieces
&& self.player_to_move == other.player_to_move
&& self.flags == other.flags
&& self.en_passant == other.en_passant
&& self.move_counter == other.move_counter
}
}

View file

@ -1,17 +1,15 @@
// Eryn Wells <eryn@erynwells.me>
use crate::{piece_sets::Mailbox, Board, Castle, EnPassant, Flags, PieceSet};
use crate::{piece_sets::Mailbox, Board, Castle, EnPassant, Flags, MoveCounter, PieceSet};
use chessfriend_core::{piece, Color, PlacedPiece, Rank, Shape, Square};
#[derive(Clone)]
pub struct Builder {
player_to_move: Color,
flags: Flags,
pieces: Mailbox,
kings: [Option<Square>; Color::NUM],
en_passant: Option<EnPassant>,
ply_counter: u16,
move_number: u16,
move_counter: MoveCounter,
}
impl Builder {
@ -28,28 +26,26 @@ impl Builder {
let black_king = board.king_square(Color::Black);
Self {
player_to_move: board.player_to_move(),
flags: *board.flags(),
pieces,
kings: [Some(white_king), Some(black_king)],
en_passant: board.en_passant(),
ply_counter: board.ply_counter(),
move_number: board.move_number(),
move_counter: board.move_counter,
}
}
pub fn to_move(&mut self, player: Color) -> &mut Self {
self.player_to_move = player;
self.move_counter.active_color = player;
self
}
pub fn ply_counter(&mut self, num: u16) -> &mut Self {
self.ply_counter = num;
pub fn fullmove_number(&mut self, num: u16) -> &mut Self {
self.move_counter.fullmove_number = num;
self
}
pub fn move_number(&mut self, num: u16) -> &mut Self {
self.move_number = num;
pub fn halfmove_number(&mut self, num: u16) -> &mut Self {
self.move_counter.halfmove_number = num;
self
}
@ -114,14 +110,12 @@ impl Builder {
}
}
Board::new(
self.player_to_move,
Board {
flags,
pieces,
self.en_passant,
self.ply_counter,
self.move_number,
)
move_counter: self.move_counter,
}
}
}
@ -149,13 +143,11 @@ impl Default for Builder {
]);
Self {
player_to_move: Color::White,
flags: Flags::default(),
pieces,
kings: [Some(white_king_square), Some(black_king_square)],
en_passant: None,
ply_counter: 0,
move_number: 1,
move_counter: MoveCounter::default(),
}
}
}

View file

@ -132,8 +132,10 @@ impl ToFenStr for Board {
)
.map_err(ToFenStrError::FmtError)?;
write!(fen_string, " {}", self.ply_counter()).map_err(ToFenStrError::FmtError)?;
write!(fen_string, " {}", self.move_number()).map_err(ToFenStrError::FmtError)?;
write!(fen_string, " {}", self.move_counter.halfmove_number)
.map_err(ToFenStrError::FmtError)?;
write!(fen_string, " {}", self.move_counter.fullmove_number)
.map_err(ToFenStrError::FmtError)?;
Ok(fen_string)
}
@ -246,7 +248,7 @@ impl FromFenStr for Board {
let half_move_clock: u16 = half_move_clock
.parse()
.map_err(FromFenStrError::ParseIntError)?;
builder.ply_counter(half_move_clock);
builder.halfmove_number(half_move_clock);
let full_move_counter = fields
.next()
@ -254,7 +256,7 @@ impl FromFenStr for Board {
let full_move_counter: u16 = full_move_counter
.parse()
.map_err(FromFenStrError::ParseIntError)?;
builder.move_number(full_move_counter);
builder.fullmove_number(full_move_counter);
debug_assert_eq!(fields.next(), None);