Reduce bitboards from 12 to 8, add color info in mailbox representation
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user