aboutsummaryrefslogtreecommitdiff
path: root/src/zobrist
diff options
context:
space:
mode:
Diffstat (limited to 'src/zobrist')
-rw-r--r--src/zobrist/zobrist.cpp72
-rw-r--r--src/zobrist/zobrist.hpp11
2 files changed, 83 insertions, 0 deletions
diff --git a/src/zobrist/zobrist.cpp b/src/zobrist/zobrist.cpp
new file mode 100644
index 0000000..cfc7769
--- /dev/null
+++ b/src/zobrist/zobrist.cpp
@@ -0,0 +1,72 @@
+#include "zobrist.hpp"
+#include "board.hpp"
+
+#include <random>
+
+uint64_t PieceKeys[2][7][64];
+uint64_t SideKey;
+uint64_t CastleKeys[16];
+uint64_t EnPassantKeys[8];
+
+void InitZobrist() {
+ std::mt19937_64 rng(1234567); // fixed seed
+
+ for (int color = 0; color < 2; color++) {
+ for (int piece = 0; piece < 7; piece++) {
+ for (int square = 0; square < 64; square++) {
+ PieceKeys[color][piece][square] = rng();
+ }
+ }
+ }
+
+ SideKey = rng();
+
+ for (int i = 0; i < 16; i++) {
+ CastleKeys[i] = rng();
+ }
+
+ for (int i = 0; i < 8; i++) {
+ EnPassantKeys[i] = rng();
+ }
+}
+
+uint64_t GenerateZobristKey(Game *b) {
+ uint64_t key = 0;
+
+ for (int square = 0; square < 64; square++) {
+ Piece p = b->pieces[square];
+
+ if (p.type == NONEPIECE)
+ continue;
+
+ key ^= PieceKeys[p.color][p.type][square];
+ }
+
+ // side to move
+ if (b->turn)
+ key ^= SideKey;
+
+ // castling
+ int castle = 0;
+
+ if (b->whiteCastleKing)
+ castle |= 1;
+
+ if (b->whiteCastleQueen)
+ castle |= 2;
+
+ if (b->blackCastleKing)
+ castle |= 4;
+
+ if (b->blackCastleQueen)
+ castle |= 8;
+
+ key ^= CastleKeys[castle];
+
+ // en passant
+ if (b->canEnpassant) {
+ key ^= EnPassantKeys[b->enPassant.file];
+ }
+
+ return key;
+}
diff --git a/src/zobrist/zobrist.hpp b/src/zobrist/zobrist.hpp
new file mode 100644
index 0000000..8de9d42
--- /dev/null
+++ b/src/zobrist/zobrist.hpp
@@ -0,0 +1,11 @@
+#pragma once
+#include "board.hpp"
+#include <cstdint>
+
+extern uint64_t PieceKeys[2][7][64];
+extern uint64_t SideKey;
+extern uint64_t CastleKeys[16];
+extern uint64_t EnPassantKeys[8];
+
+void InitZobrist();
+uint64_t GenerateZobristKey(Game *b);