summaryrefslogtreecommitdiff
path: root/model/src
diff options
context:
space:
mode:
authorMike White <botahamec@outlook.com>2021-09-18 22:49:34 -0400
committerMike White <botahamec@outlook.com>2021-09-18 22:49:34 -0400
commit86273330cd6e09b1fe4b9c6efbfb9c56033e28bd (patch)
tree9013aa83df8edf4da89837a0732e13903a7ea898 /model/src
parentf0f18161c6a20db901cfd285491b8677e4c41851 (diff)
Created a transposition table and fixed some bugs
Diffstat (limited to 'model/src')
-rw-r--r--model/src/board.rs8
-rw-r--r--model/src/possible_moves.rs23
2 files changed, 15 insertions, 16 deletions
diff --git a/model/src/board.rs b/model/src/board.rs
index f95d837..a6eba23 100644
--- a/model/src/board.rs
+++ b/model/src/board.rs
@@ -51,7 +51,7 @@ impl PartialEq for CheckersBitBoard {
impl Hash for CheckersBitBoard {
/// Hashes with only the pieces part, to ensure correctness and efficiency
fn hash<H: Hasher>(&self, hasher: &mut H) {
- self.pieces.hash(hasher)
+ self.hash_code().hash(hasher)
}
}
@@ -98,6 +98,11 @@ impl CheckersBitBoard {
STARTING_BITBOARD
}
+ #[must_use]
+ pub const fn hash_code(self) -> u64 {
+ (((self.color & self.pieces) as u64) << 32) | (self.pieces as u64)
+ }
+
/// Gets the bits that represent where pieces are on the board
#[must_use]
pub const fn pieces_bits(self) -> u32 {
@@ -634,6 +639,7 @@ impl CheckersBitBoard {
.clear_piece(value.wrapping_sub(7) & 31);
const KING_MASK: u32 = 0b00000100000100000100000100000000;
+ // TODO double jump should only apply to the piece that just moved
if (is_king || (((1 << value) & KING_MASK) == 0))
&& PossibleMoves::has_jumps(board.flip_turn())
{
diff --git a/model/src/possible_moves.rs b/model/src/possible_moves.rs
index 7d32a27..03950c2 100644
--- a/model/src/possible_moves.rs
+++ b/model/src/possible_moves.rs
@@ -370,18 +370,14 @@ impl PossibleMoves {
let friendly_pieces = board.pieces_bits() & board.color_bits();
let friendly_kings = friendly_pieces & board.king_bits();
- let forward_left_movers =
- not_occupied.rotate_right(7) & friendly_pieces & FORWARD_LEFT_MASK;
- let forward_right_movers =
- not_occupied.rotate_right(1) & friendly_pieces & FORWARD_RIGHT_MASK;
+ let forward_left_movers = not_occupied.rotate_right(7) & friendly_pieces;
+ let forward_right_movers = not_occupied.rotate_right(1) & friendly_pieces;
let backward_left_movers;
let backward_right_movers;
if friendly_kings > 0 {
- backward_left_movers =
- not_occupied.rotate_left(1) & friendly_kings & BACKWARD_LEFT_MASK;
- backward_right_movers =
- not_occupied.rotate_left(7) & friendly_kings & BACKWARD_RIGHT_MASK;
+ backward_left_movers = not_occupied.rotate_left(1) & friendly_kings;
+ backward_right_movers = not_occupied.rotate_left(7) & friendly_kings;
} else {
backward_left_movers = 0;
backward_right_movers = 0;
@@ -405,17 +401,14 @@ impl PossibleMoves {
let friendly_pieces = board.pieces_bits() & !board.color_bits();
let friendly_kings = friendly_pieces & board.king_bits();
- let backward_left_movers =
- not_occupied.rotate_left(1) & friendly_pieces & BACKWARD_LEFT_MASK;
- let backward_right_movers =
- not_occupied.rotate_left(7) & friendly_pieces & BACKWARD_RIGHT_MASK;
+ let backward_left_movers = not_occupied.rotate_left(1) & friendly_pieces;
+ let backward_right_movers = not_occupied.rotate_left(7) & friendly_pieces;
let forward_left_movers;
let forward_right_movers;
if friendly_kings > 0 {
- forward_left_movers = not_occupied.rotate_right(7) & friendly_kings & FORWARD_LEFT_MASK;
- forward_right_movers =
- not_occupied.rotate_right(1) & friendly_kings & FORWARD_RIGHT_MASK;
+ forward_left_movers = not_occupied.rotate_right(7) & friendly_kings;
+ forward_right_movers = not_occupied.rotate_right(1) & friendly_kings;
} else {
forward_left_movers = 0;
forward_right_movers = 0;