Compare commits

...

2 commits

Author SHA1 Message Date
Bruno BELANYI f9ba6fa680 Refactor castling right management in 'do_move'
All checks were successful
ci/woodpecker/push/check Pipeline was successful
I find it more readable.
2024-04-06 00:20:17 +01:00
Bruno BELANYI 9507432bd3 Modify castling rights after rook capture 2024-04-06 00:18:01 +01:00

View file

@ -170,21 +170,24 @@ impl ChessBoard {
} else {
self.en_passant = None;
}
if move_piece == Piece::King {
*self.castle_rights_mut(self.current_player()) = CastleRights::NoSide;
}
if move_piece == Piece::Rook {
let castle_rights = self.castle_rights_mut(self.current_player());
*castle_rights = match chess_move.start().file() {
File::A => castle_rights.without_queen_side(),
File::H => castle_rights.without_king_side(),
_ => *castle_rights,
}
}
let castle_rights = self.castle_rights_mut(self.current_player());
*castle_rights = match (move_piece, chess_move.start().file()) {
(Piece::Rook, File::A) => castle_rights.without_queen_side(),
(Piece::Rook, File::H) => castle_rights.without_king_side(),
(Piece::King, _) => CastleRights::NoSide,
_ => *castle_rights,
};
if let Some(piece) = captured_piece {
*self.piece_occupancy_mut(piece) ^= chess_move.destination();
*self.color_occupancy_mut(opponent) ^= chess_move.destination();
self.combined_occupancy ^= chess_move.destination();
// If a rook is captured, it loses its castling rights
let castle_rights = self.castle_rights_mut(opponent);
*castle_rights = match (piece, chess_move.destination().file()) {
(Piece::Rook, File::A) => castle_rights.without_queen_side(),
(Piece::Rook, File::H) => castle_rights.without_king_side(),
_ => *castle_rights,
};
}
// Revertible state modification
@ -768,6 +771,17 @@ mod test {
);
}
#[test]
fn do_move_capture_changes_castling() {
let mut position = ChessBoard::from_fen("r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1").unwrap();
let expected = ChessBoard::from_fen("r3k2R/8/8/8/8/8/8/R3K3 b Qq - 0 1").unwrap();
let capture = Move::new(Square::H1, Square::H8, None);
position.do_move(capture);
assert_eq!(position, expected);
}
#[test]
fn do_move_and_undo() {
// Start from default position