summaryrefslogtreecommitdiff
path: root/model/src/board.rs
diff options
context:
space:
mode:
authorMicha White <botahamec@outlook.com>2023-12-29 00:05:43 -0500
committerMicha White <botahamec@outlook.com>2023-12-29 00:05:43 -0500
commit93461aa9399d981db7d8611b3eb166636de4d971 (patch)
tree729f46ce3ca70c13e4fd685c764afd1837e7d400 /model/src/board.rs
parenta3794530958ccd8bc6d8a7ed90edf3d1fd91bc54 (diff)
BIG BUG: board didn't require double jumps to use same piece
Diffstat (limited to 'model/src/board.rs')
-rw-r--r--model/src/board.rs31
1 files changed, 27 insertions, 4 deletions
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
}