aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/board.rs40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/board.rs b/src/board.rs
index 7d0d6c5..2afbe90 100644
--- a/src/board.rs
+++ b/src/board.rs
@@ -13,7 +13,7 @@ pub struct Board {
}
-#[derive(Debug, num_enum::FromPrimitive)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, num_enum::FromPrimitive)]
#[repr(usize)]
pub enum PieceType {
#[default]
@@ -200,33 +200,37 @@ impl Board {
/// *Blindlessly* apply a move without any validation
/// Move should be validated beforehand
- pub fn make_move(&mut self, mov: Move) {
+ pub fn make_move(&mut self, mov: Move) -> Option<PieceType> {
// Target
- match self.pieces
+ let captured_piece = match self.pieces
.iter()
.enumerate()
- .find(|(piece_type, p)| *p & mov.target.to_bitboard() > 0)
+ .find(|(piece_type, bitboard)| *bitboard & mov.target.to_bitboard() > 0)
{
- Some((piece, bitboard)) => {
- self.pieces[piece] ^= mov.target.to_bitboard();
+ Some((piece_type, _)) => {
+ self.pieces[piece_type] ^= mov.target.to_bitboard();
+ Some(PieceType::from(piece_type))
},
- None => {},
+ None => None,
};
// Source
match self.pieces
.iter()
.enumerate()
- .find(|(piece_type, p)| *p & mov.source.to_bitboard() > 0)
+ .find(|(piece_type, bitboard)| *bitboard & mov.source.to_bitboard() > 0)
{
- Some((piece, bitboard)) => {
- self.pieces[piece] ^= mov.source.to_bitboard();
- self.pieces[piece] |= mov.target.to_bitboard();
+ Some((piece_type, _)) => {
+ self.pieces[piece_type] ^= mov.source.to_bitboard();
+ self.pieces[piece_type] |= mov.target.to_bitboard();
},
None => panic!("Move is malformed: source piece not found"),
};
+ self.update_occupancy();
self.ply += 1;
+
+ captured_piece
}
}
@@ -305,7 +309,12 @@ mod tests {
let black_move = Move { source: Square::F7, target: Square::F5 };
println!("\n{:?}", black_move);
- board.make_move(black_move);
+
+ match board.make_move(black_move) {
+ Some(..) => panic!("No piece should have been captured"),
+ None => {},
+ };
+
board.print();
assert!(board.pieces[PieceType::PawnBlack as usize] & Square::F7.to_bitboard() == 0);
@@ -314,7 +323,12 @@ mod tests {
let white_move = Move { source: Square::D2, target: Square::A5 };
println!("\n{:?}", white_move);
- board.make_move(white_move);
+
+ match board.make_move(white_move) {
+ Some(captured) => assert!(captured == PieceType::PawnBlack),
+ None => panic!("A piece should have been captured"),
+ };
+
board.print();
assert!(board.pieces[PieceType::PawnBlack as usize] & Square::A5.to_bitboard() == 0, "Target piece should be captured");