From 366f15ca1273eab7d16a7b6dd3fcc377dc439501 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 23 Dec 2023 09:31:41 -0700 Subject: [PATCH] [board] Implement placing a piece in a mutable position --- board/src/bitboard.rs | 4 +-- board/src/position.rs | 71 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/board/src/bitboard.rs b/board/src/bitboard.rs index 9b8580d..e5e126c 100644 --- a/board/src/bitboard.rs +++ b/board/src/bitboard.rs @@ -19,11 +19,11 @@ impl BitBoard { self.0 == 0 } - fn has_piece_at(&self, sq: &Square) -> bool { + pub fn has_piece_at(&self, sq: &Square) -> bool { (self.0 & (1 << sq.index)) > 0 } - fn place_piece_at(&mut self, sq: &Square) { + pub fn place_piece_at(&mut self, sq: &Square) { self.0 |= 1 << sq.index } diff --git a/board/src/position.rs b/board/src/position.rs index 6279c16..c9f33b0 100644 --- a/board/src/position.rs +++ b/board/src/position.rs @@ -1,6 +1,8 @@ // Eryn Wells use crate::bitboard::BitBoard; +use crate::piece::{Color, Piece, PiecePlacementError, PieceShape}; +use crate::square::Square; use std::fmt; mod color { @@ -80,11 +82,78 @@ impl Position { } } - fn piece_at_square(&self, sq: &str) {} + fn place_piece(&mut self, piece: &Piece, square: &Square) -> Result<(), PiecePlacementError> { + let mut bitboard = self.bitboard_for_piece_mut(piece); + + if bitboard.has_piece_at(&square) { + return Err(PiecePlacementError::PieceExistsOnSquare); + } + + bitboard.place_piece_at(&square); + + Ok(()) + } + + fn bitboard_for_piece(&self, piece: &Piece) -> &BitBoard { + let color_index: usize = match piece.color { + Color::White => 0, + Color::Black => 1, + }; + + let piece_index: usize = match piece.piece { + PieceShape::Pawn => 0, + PieceShape::Knight => 1, + PieceShape::Bishop => 2, + PieceShape::Rook => 3, + PieceShape::Queen => 4, + PieceShape::King => 5, + }; + + &self.pieces_per_type[color_index][piece_index] + } + + fn bitboard_for_piece_mut(&mut self, piece: &Piece) -> &mut BitBoard { + let color_index: usize = match piece.color { + Color::White => 0, + Color::Black => 1, + }; + + let piece_index: usize = match piece.piece { + PieceShape::Pawn => 0, + PieceShape::Knight => 1, + PieceShape::Bishop => 2, + PieceShape::Rook => 3, + PieceShape::Queen => 4, + PieceShape::King => 5, + }; + + &mut self.pieces_per_type[color_index][piece_index] + } } impl fmt::Display for Position { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "abcdefg") + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn place_piece_at() { + let mut position = Position::empty(); + + let piece = Piece::new(Color::White, PieceShape::Queen); + let square = Square::from_algebraic_string("e4").expect("Unable to get e4 square"); + + position + .place_piece(&piece, &square) + .expect("Unable to place white queen on e4"); + + position + .place_piece(&piece, &square) + .expect_err("Placed white queen on e4 a second time?!"); + + println!("{:?}", position); } }