diff --git a/position/src/position.rs b/position/src/position.rs index 6c7bfca..f72a27d 100644 --- a/position/src/position.rs +++ b/position/src/position.rs @@ -1,5 +1,6 @@ // Eryn Wells +mod captures; mod make_move; mod position; diff --git a/position/src/position/captures.rs b/position/src/position/captures.rs new file mode 100644 index 0000000..d6ce3e2 --- /dev/null +++ b/position/src/position/captures.rs @@ -0,0 +1,42 @@ +// Eryn Wells + +use std::fmt::Display; + +use chessfriend_core::{Color, Piece}; + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub(crate) struct CapturesList([Vec; Color::NUM]); + +impl CapturesList { + pub fn push(&mut self, color: Color, piece: Piece) { + self.0[color as usize].push(piece); + } + + pub fn is_empty(&self) -> bool { + self.0.iter().all(Vec::is_empty) + } +} + +impl Display for CapturesList { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut is_first = true; + for color in Color::into_iter() { + if is_first { + is_first = false; + } else { + writeln!(f)?; + } + + write!(f, "{color}: ")?; + + let captures = &self.0[color as usize]; + for piece in captures { + write!(f, "{piece}")?; + } + + write!(f, "")?; + } + + Ok(()) + } +} diff --git a/position/src/position/make_move.rs b/position/src/position/make_move.rs index e944e3f..67502ea 100644 --- a/position/src/position/make_move.rs +++ b/position/src/position/make_move.rs @@ -172,7 +172,7 @@ impl Position { .ok_or(MakeMoveError::NoCapturePiece(capture_square))?; // Register the capture - self.captures[piece.color as usize].push(captured_piece); + self.captures.push(piece.color, captured_piece); self.remove_piece(origin_square).unwrap(); diff --git a/position/src/position/position.rs b/position/src/position/position.rs index 9fe5e26..8abfa4a 100644 --- a/position/src/position/position.rs +++ b/position/src/position/position.rs @@ -1,5 +1,6 @@ // Eryn Wells +use super::captures::CapturesList; use crate::move_record::MoveRecord; use chessfriend_bitboard::BitBoard; use chessfriend_board::{ @@ -13,7 +14,7 @@ use std::{cell::OnceCell, fmt}; pub struct Position { pub board: Board, pub(crate) moves: Vec, - pub(crate) captures: [Vec; Color::NUM], + pub(crate) captures: CapturesList, } impl Position { @@ -197,7 +198,13 @@ impl PartialEq for Position { impl fmt::Display for Position { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.board.display()) + write!(f, "{}", self.board.display())?; + + if !self.captures.is_empty() { + write!(f, "\n\n{}", self.captures)?; + } + + Ok(()) } }