diff options
Diffstat (limited to 'src/zobrist/zobrist.cpp')
| -rw-r--r-- | src/zobrist/zobrist.cpp | 72 |
1 files changed, 72 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; +} |
