aboutsummaryrefslogtreecommitdiff
path: root/src/zobrist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zobrist.cpp')
-rw-r--r--src/zobrist.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/zobrist.cpp b/src/zobrist.cpp
new file mode 100644
index 0000000..b41b6c6
--- /dev/null
+++ b/src/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 == NONE)
+ continue;
+
+ key ^= PieceKeys[p.color][p.type][square];
+ }
+
+ // side to move
+ if (b->turn)
+ key ^= SideKey;
+
+ // castling
+ int castle = 0;
+
+ if (b->castle.find('K') != std::string::npos)
+ castle |= 1;
+
+ if (b->castle.find('Q') != std::string::npos)
+ castle |= 2;
+
+ if (b->castle.find('k') != std::string::npos)
+ castle |= 4;
+
+ if (b->castle.find('q') != std::string::npos)
+ castle |= 8;
+
+ key ^= CastleKeys[castle];
+
+ // en passant
+ if (b->canEnpassant) {
+ key ^= EnPassantKeys[b->enPassant.file];
+ }
+
+ return key;
+}