[board] Implement placing a piece in a mutable position
This commit is contained in:
		
							parent
							
								
									153e21b693
								
							
						
					
					
						commit
						366f15ca12
					
				
					 2 changed files with 72 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
// Eryn Wells <eryn@erynwells.me>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue