Remove duplications and rewrite fn make_move
This commit is contained in:
76
src/move.rs
76
src/move.rs
@@ -1,10 +1,10 @@
|
||||
use core::fmt;
|
||||
|
||||
use crate::{
|
||||
bitboard::{have_common_bit, lsb, square_to_bitboard},
|
||||
bitboard::{have_common_bit, square_to_bitboard},
|
||||
board::{Board, Color, Kind, Piece},
|
||||
square::{coords_to_square, square_to_algebraic, Square},
|
||||
state::Castle,
|
||||
state::{Castle, State},
|
||||
};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
|
||||
@@ -108,72 +108,66 @@ impl Move {
|
||||
}
|
||||
|
||||
impl Board {
|
||||
pub fn make_move(&mut self, mv: Move, color: Color) -> bool {
|
||||
self.update_board_state(&mv, color);
|
||||
|
||||
let pieces = match color {
|
||||
Color::White => &self.white_pieces,
|
||||
Color::Black => &self.black_pieces,
|
||||
};
|
||||
|
||||
self.state.update_castling_state_quiet(mv.src, color);
|
||||
self.state
|
||||
.update_castling_state_capture(mv.dst, Color::opponent_color(color));
|
||||
self.state.change_side();
|
||||
|
||||
let own_king_square = lsb(pieces[Kind::King].bitboard);
|
||||
self.is_move_legit(own_king_square, Color::opponent_color(color))
|
||||
pub fn make_move(&mut self, mv: &Move, color: Color) {
|
||||
self.update_board_state(mv, color);
|
||||
}
|
||||
|
||||
pub fn update_board_state(&mut self, mv: &Move, color: Color) {
|
||||
let (own_pieces, opponent_pieces) = match color {
|
||||
Color::White => (&mut self.white_pieces, &mut self.black_pieces),
|
||||
Color::Black => (&mut self.black_pieces, &mut self.white_pieces),
|
||||
let (own_pieces, opponent_pieces, en_passant_square) = match color {
|
||||
Color::White => (
|
||||
&mut self.white_pieces,
|
||||
&mut self.black_pieces,
|
||||
Some(mv.src + 8),
|
||||
),
|
||||
Color::Black => (
|
||||
&mut self.black_pieces,
|
||||
&mut self.white_pieces,
|
||||
Some(mv.src - 8),
|
||||
),
|
||||
};
|
||||
|
||||
Self::update_game_state(&mut self.state, mv.src, mv.dst, color);
|
||||
|
||||
match &mv.move_type {
|
||||
MoveType::Quiet => {
|
||||
Self::move_piece(mv.src, mv.dst, own_pieces);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
}
|
||||
MoveType::Capture => {
|
||||
Self::move_piece(mv.src, mv.dst, own_pieces);
|
||||
Self::remove_piece(mv.dst, opponent_pieces);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
}
|
||||
MoveType::EnPassant => {
|
||||
Self::move_piece(mv.src, mv.dst, own_pieces);
|
||||
Self::remove_pawn_enpassant(mv.dst, opponent_pieces, color);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
}
|
||||
MoveType::DoublePush => {
|
||||
Self::move_piece(mv.src, mv.dst, own_pieces);
|
||||
let en_passant = match color {
|
||||
Color::White => Some(mv.src + 8),
|
||||
Color::Black => Some(mv.src - 8),
|
||||
};
|
||||
self.state.set_en_passant_target_square(en_passant);
|
||||
self.state.set_en_passant_target_square(en_passant_square);
|
||||
}
|
||||
MoveType::Promotion(promote) => {
|
||||
Self::remove_piece(mv.src, own_pieces);
|
||||
Self::promote_piece(mv.dst, own_pieces, *promote);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
Self::promote_piece(mv.dst, own_pieces, promote);
|
||||
}
|
||||
MoveType::PromotionCapture(promote) => {
|
||||
Self::remove_piece(mv.src, own_pieces);
|
||||
Self::remove_piece(mv.dst, opponent_pieces);
|
||||
Self::promote_piece(mv.dst, own_pieces, *promote);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
Self::promote_piece(mv.dst, own_pieces, promote);
|
||||
}
|
||||
MoveType::Castle => {
|
||||
Self::move_piece(mv.src, mv.dst, own_pieces);
|
||||
Self::move_rook_castle(mv.dst, own_pieces);
|
||||
self.state.set_en_passant_target_square(None);
|
||||
self.state.set_castling_ability(color, Castle::None)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn update_game_state(state: &mut State, src: usize, dst: usize, color: Color) {
|
||||
state.set_en_passant_target_square(None);
|
||||
state.update_castling_state_quiet(src, color);
|
||||
state.update_castling_state_capture(dst, Color::opponent_color(color));
|
||||
state.change_side();
|
||||
}
|
||||
|
||||
fn move_piece(src: usize, dst: usize, pieces: &mut [Piece; 6]) {
|
||||
for p in pieces.iter_mut() {
|
||||
if have_common_bit(p.bitboard, square_to_bitboard(src)) {
|
||||
@@ -194,7 +188,7 @@ impl Board {
|
||||
Self::move_piece(rook_src, rook_dst, pieces);
|
||||
}
|
||||
|
||||
fn promote_piece(square: usize, pieces: &mut [Piece; 6], promote: Promote) {
|
||||
fn promote_piece(square: usize, pieces: &mut [Piece; 6], promote: &Promote) {
|
||||
match promote {
|
||||
Promote::Knight => pieces[Kind::Knight].bitboard |= square_to_bitboard(square),
|
||||
Promote::Bishop => pieces[Kind::Bishop].bitboard |= square_to_bitboard(square),
|
||||
@@ -240,7 +234,7 @@ mod tests {
|
||||
fn test_make_move_quiet() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_QUIET[0])?;
|
||||
let mv = Move::new_with_type(9, 25, MoveType::DoublePush);
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_QUIET[1])?);
|
||||
|
||||
Ok(())
|
||||
@@ -255,7 +249,7 @@ mod tests {
|
||||
fn test_make_move_capture() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_CAPTURE[0])?;
|
||||
let mv = Move::new_with_type(21, 37, MoveType::Capture);
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_CAPTURE[1])?);
|
||||
|
||||
Ok(())
|
||||
@@ -270,7 +264,7 @@ mod tests {
|
||||
fn test_make_move_en_passant() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_EN_PASSANT[0])?;
|
||||
let mv = Move::new_with_type(30, 23, MoveType::EnPassant);
|
||||
game.board.make_move(mv, Color::Black);
|
||||
game.board.make_move(&mv, Color::Black);
|
||||
assert_eq!(game, from_fen(FEN_EN_PASSANT[1])?);
|
||||
|
||||
Ok(())
|
||||
@@ -285,7 +279,7 @@ mod tests {
|
||||
fn test_make_move_double_push() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_DOUBLE_PUSH[0])?;
|
||||
let mv = Move::new_with_type(10, 26, MoveType::DoublePush);
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_DOUBLE_PUSH[1])?);
|
||||
Ok(())
|
||||
}
|
||||
@@ -299,7 +293,7 @@ mod tests {
|
||||
fn test_make_move_promotion() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_PROMOTION[0])?;
|
||||
let mv = Move::new_with_type(54, 62, MoveType::Promotion(Promote::Queen));
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_PROMOTION[1])?);
|
||||
|
||||
Ok(())
|
||||
@@ -314,7 +308,7 @@ mod tests {
|
||||
fn test_make_move_promotion_capture() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_PROMOTION_CAPTURE[0])?;
|
||||
let mv = Move::new_with_type(54, 61, MoveType::PromotionCapture(Promote::Queen));
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_PROMOTION_CAPTURE[1])?);
|
||||
|
||||
Ok(())
|
||||
@@ -329,7 +323,7 @@ mod tests {
|
||||
fn test_make_move_castle() -> Result<(), String> {
|
||||
let mut game = from_fen(FEN_CASTLE[0])?;
|
||||
let mv = Move::new_with_type(4, 6, MoveType::Castle);
|
||||
game.board.make_move(mv, Color::White);
|
||||
game.board.make_move(&mv, Color::White);
|
||||
assert_eq!(game, from_fen(FEN_CASTLE[1])?);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user