From 93461aa9399d981db7d8611b3eb166636de4d971 Mon Sep 17 00:00:00 2001 From: Micha White Date: Fri, 29 Dec 2023 00:05:43 -0500 Subject: BIG BUG: board didn't require double jumps to use same piece --- model/src/board.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'model/src/board.rs') diff --git a/model/src/board.rs b/model/src/board.rs index 52d2b44..b722fd6 100644 --- a/model/src/board.rs +++ b/model/src/board.rs @@ -30,6 +30,10 @@ pub struct CheckersBitBoard { pub kings: u32, /// The player who has the next turn pub turn: PieceColor, + /// The player with the previous turn + pub previous_turn: PieceColor, + /// Where the most recent move was to + pub previous_move_to: u8, } impl Default for CheckersBitBoard { @@ -83,6 +87,9 @@ impl CheckersBitBoard { color, kings, turn, + previous_turn: turn.flip(), + // this field is only used if previous_turn == turn + previous_move_to: 0, } } @@ -330,6 +337,18 @@ impl CheckersBitBoard { CheckersBitBoard::new(self.pieces, self.color, self.kings, self.turn.flip()) } + /// Change whose turn it was previously to the current player + pub const fn set_previous_turn(self, dest: usize) -> Self { + CheckersBitBoard { + pieces: self.pieces, + color: self.color, + kings: self.kings, + turn: self.turn, + previous_turn: self.turn, + previous_move_to: dest as u8, + } + } + /// Moves a piece from `start` to `dest`. The original location will be empty. /// This does not mutate the original board. /// If a piece already exists at `dest`, it will be overwritten. @@ -543,7 +562,7 @@ impl CheckersBitBoard { if (is_king || (((1 << value) & KING_MASK) == 0)) && PossibleMoves::has_jumps_at(board.flip_turn(), (value + 14) & 31) { - board.flip_turn() + board.flip_turn().set_previous_turn((value + 14) & 31) } else { board } @@ -576,7 +595,7 @@ impl CheckersBitBoard { if (is_king || (((1 << value) & KING_MASK) == 0)) && PossibleMoves::has_jumps_at(board.flip_turn(), (value + 2) & 31) { - board.flip_turn() + board.flip_turn().set_previous_turn((value + 2) & 31) } else { board } @@ -609,7 +628,9 @@ impl CheckersBitBoard { if (is_king || (((1 << value) & KING_MASK) == 0)) && PossibleMoves::has_jumps_at(board.flip_turn(), value.wrapping_sub(2) & 31) { - board.flip_turn() + board + .flip_turn() + .set_previous_turn((value.wrapping_sub(2)) & 31) } else { board } @@ -642,7 +663,9 @@ impl CheckersBitBoard { if (is_king || (((1 << value) & KING_MASK) == 0)) && PossibleMoves::has_jumps_at(board.flip_turn(), value.wrapping_sub(14) & 31) { - board.flip_turn() + board + .flip_turn() + .set_previous_turn((value.wrapping_sub(14)) & 31) } else { board } -- cgit v1.2.3