#include "zobrist.hpp" #include "board/board.hpp" #include 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; }