Reduce bitboards from 12 to 8, add color info in mailbox representation

This commit is contained in:
stefiosif
2025-01-12 20:02:16 +02:00
parent f7604b27a5
commit d9e76a224f
11 changed files with 238 additions and 331 deletions

View File

@@ -15,8 +15,8 @@ use super::{
impl PartialEq for Game {
fn eq(&self, other: &Self) -> bool {
self.board.white_pieces == other.board.white_pieces
&& self.board.black_pieces == other.board.black_pieces
self.board.pieces == other.board.pieces
&& self.board.color == other.board.color
&& self.board.state == other.board.state
}
}
@@ -47,6 +47,10 @@ impl Game {
self.board.state.current_player()
}
pub const fn next_player(&self) -> Color {
self.board.state.next_player()
}
pub fn make_move(&mut self, mv: &Move) {
self.history
.push_move_parameters(MoveParameters::build(self, mv));
@@ -66,20 +70,20 @@ impl Game {
let piece_at_src = mailbox
.piece_at(mv.src)
.expect("Expected piece at: {mv.src}");
.unwrap_or_else(|| panic!("Expected piece at: {}", mv.src));
let piece_at_dst = mailbox.piece_at(mv.dst);
match &mv.move_type {
MoveType::Quiet => {
board.move_piece(mv.src, mv.dst, piece_at_src);
hash.update_quiet(mv.src, mv.dst, piece_at_src, color);
board.move_piece(mv.src, mv.dst, piece_at_src.0);
hash.update_quiet(mv.src, mv.dst, piece_at_src.0, color);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(piece_at_src));
}
MoveType::Capture => {
let piece_at_dst = piece_at_dst.expect("Expected piece at: {mv.dst}");
board.move_piece(mv.src, mv.dst, piece_at_src);
board.remove_opponent_piece(mv.dst, piece_at_dst);
hash.update_capture(mv.src, mv.dst, piece_at_src, piece_at_dst, color);
board.remove_opponent_piece(mv.dst, piece_at_dst.0);
hash.update_capture(mv.src, mv.dst, piece_at_src.0, piece_at_dst.0, color);
board.move_piece(mv.src, mv.dst, piece_at_src.0);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(piece_at_src));
}
@@ -88,11 +92,11 @@ impl Game {
board.remove_opponent_piece(ep_capture, PieceType::Pawn);
hash.update_en_passant(mv.src, mv.dst, ep_capture, color);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(PieceType::Pawn));
mailbox.set_piece_at(mv.dst, Some((PieceType::Pawn, color)));
mailbox.set_piece_at(ep_capture, None);
}
MoveType::DoublePush => {
board.move_piece(mv.src, mv.dst, piece_at_src);
board.move_piece(mv.src, mv.dst, piece_at_src.0);
en_passant_square = match color {
Color::White => Some(mv.src + 8),
Color::Black => Some(mv.src.saturating_sub(8)),
@@ -102,23 +106,23 @@ impl Game {
mailbox.set_piece_at(mv.dst, Some(piece_at_src));
}
MoveType::Promotion(promote) => {
board.remove_own_piece(mv.src, piece_at_src);
board.remove_own_piece(mv.src, piece_at_src.0);
board.promote_piece(mv.dst, promote);
hash.update_promotion(mv.src, mv.dst, promote, color);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(promote.into_piece_type()));
mailbox.set_piece_at(mv.dst, Some((promote.into_piece_type(), color)));
}
MoveType::PromotionCapture(promote) => {
let piece_at_dst = piece_at_dst.expect("Expected piece at dst: {mv.dst}");
board.remove_own_piece(mv.src, piece_at_src);
board.remove_opponent_piece(mv.dst, piece_at_dst);
board.remove_own_piece(mv.src, piece_at_src.0);
board.remove_opponent_piece(mv.dst, piece_at_dst.0);
board.promote_piece(mv.dst, promote);
hash.update_promotion_capture(mv.src, mv.dst, piece_at_dst, promote, color);
hash.update_promotion_capture(mv.src, mv.dst, piece_at_dst.0, promote, color);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(promote.into_piece_type()));
mailbox.set_piece_at(mv.dst, Some((promote.into_piece_type(), color)));
}
MoveType::Castle => {
board.move_piece(mv.src, mv.dst, piece_at_src);
board.move_piece(mv.src, mv.dst, piece_at_src.0);
let (rook_src, rook_dst) = match mv.dst {
Square::C1 | Square::C8 => (mv.dst - 2, mv.dst + 1),
Square::G1 | Square::G8 => (mv.dst + 1, mv.dst - 1),
@@ -126,11 +130,11 @@ impl Game {
};
board.move_piece(rook_src, rook_dst, PieceType::Rook);
board.state.set_castling_ability(color, Castle::None);
hash.update_castle(mv.src, mv.dst, piece_at_src, rook_src, rook_dst, color);
hash.update_castle(mv.src, mv.dst, piece_at_src.0, rook_src, rook_dst, color);
hash.drop_en_passant_hash(board.state.en_passant_square());
mailbox.set_piece_at(mv.dst, Some(piece_at_src));
mailbox.set_piece_at(rook_src, None);
mailbox.set_piece_at(rook_dst, Some(PieceType::Rook));
mailbox.set_piece_at(rook_dst, Some((PieceType::Rook, color)));
}
}
@@ -172,7 +176,7 @@ impl Game {
let piece_at_dst = mailbox.piece_at(mv.dst).expect("Expected set piece");
match &mv.move_type {
MoveType::Quiet | MoveType::DoublePush => {
board.move_piece(mv.dst, mv.src, piece_at_dst);
board.move_piece(mv.dst, mv.src, piece_at_dst.0);
mailbox.set_piece_at(mv.src, mailbox.piece_at(mv.dst));
mailbox.set_piece_at(mv.dst, None);
}
@@ -180,19 +184,19 @@ impl Game {
let captured_piece = move_parameters
.captured_piece
.expect("Expected captured piece to unmake Capture");
board.move_piece(mv.dst, mv.src, piece_at_dst);
board.insert_opponent_piece(mv.dst, captured_piece);
mailbox.set_piece_at(mv.src, move_parameters.moved_piece);
board.move_piece(mv.dst, mv.src, piece_at_dst.0);
board.insert_opponent_piece(mv.dst, captured_piece.0);
mailbox.set_piece_at(mv.src, move_parameters.moving_piece);
mailbox.set_piece_at(mv.dst, Some(captured_piece));
}
MoveType::Promotion(_) => {
let promoted_piece = move_parameters
.promoted_piece
.expect("Expected promoted piece to unmake Promotion");
board.remove_own_piece(mv.dst, promoted_piece);
board.remove_own_piece(mv.dst, promoted_piece.0);
board.insert_own_piece(mv.src, PieceType::Pawn);
mailbox.set_piece_at(mv.src, Some(PieceType::Pawn));
mailbox.set_piece_at(mv.src, Some((PieceType::Pawn, color_before_move)));
mailbox.set_piece_at(mv.dst, None);
}
MoveType::PromotionCapture(_) => {
@@ -202,10 +206,10 @@ impl Game {
let captured_piece = move_parameters
.captured_piece
.expect("Expected captured piece to unmake PromotionCapture");
board.remove_own_piece(mv.dst, promoted_piece);
board.insert_opponent_piece(mv.dst, captured_piece);
board.remove_own_piece(mv.dst, promoted_piece.0);
board.insert_opponent_piece(mv.dst, captured_piece.0);
board.insert_own_piece(mv.src, PieceType::Pawn);
mailbox.set_piece_at(mv.src, Some(PieceType::Pawn));
mailbox.set_piece_at(mv.src, Some((PieceType::Pawn, color_before_move)));
mailbox.set_piece_at(mv.dst, Some(captured_piece));
}
MoveType::EnPassant => {
@@ -213,10 +217,13 @@ impl Game {
Color::White => mv.dst - 8,
Color::Black => mv.dst + 8,
};
board.move_piece(mv.dst, mv.src, piece_at_dst);
board.move_piece(mv.dst, mv.src, piece_at_dst.0);
board.insert_opponent_piece(enemy_pawn_square, PieceType::Pawn);
mailbox.set_piece_at(mv.src, Some(PieceType::Pawn));
mailbox.set_piece_at(enemy_pawn_square, Some(PieceType::Pawn));
mailbox.set_piece_at(mv.src, Some((PieceType::Pawn, color_before_move)));
mailbox.set_piece_at(
enemy_pawn_square,
Some((PieceType::Pawn, color_before_move.opponent())),
);
}
MoveType::Castle => {
let (rook_src, rook_dst) = match mv.dst {
@@ -224,12 +231,12 @@ impl Game {
Square::G1 | Square::G8 => (mv.dst + 1, mv.dst - 1),
_ => return,
};
board.move_piece(mv.dst, mv.src, piece_at_dst);
board.move_piece(mv.dst, mv.src, piece_at_dst.0);
board.remove_own_piece(rook_dst, PieceType::Rook);
board.insert_own_piece(rook_src, PieceType::Rook);
mailbox.set_piece_at(mv.src, mailbox.piece_at(mv.dst));
mailbox.set_piece_at(mv.dst, None);
mailbox.set_piece_at(rook_src, Some(PieceType::Rook));
mailbox.set_piece_at(rook_src, Some((PieceType::Rook, color_before_move)));
mailbox.set_piece_at(rook_dst, None);
}
}