stellarUCI Chess engine written in C++20 |
git clone git://git.dimitrijedobrota.com/stellar.git |
Log | Files | Refs | README | LICENSE |
zobrist.hpp (1584B)
0 #ifndef STELLAR_ZOBRIST_H
1 #define STELLAR_ZOBRIST_H
3 #include "piece.hpp"
4 #include "random.hpp"
6 #include <algorithm>
7 #include <array>
8 #include <random>
10 class Board;
11 namespace zobrist {
13 extern U32 keys_pawn[2][64];
14 extern U64 keys_piece[2][12][64];
15 extern U64 keys_enpassant[64];
16 extern U64 keys_castle[16];
18 const U64 keys_side = Random(C32(1699391443))();
20 inline void init() {
21 Random gen1(C64(1804289383));
22 for (Type type = PAWN; type <= KING; ++type) {
23 for (int square = 0; square < 64; square++) {
24 keys_piece[WHITE][type][square] = gen1();
25 keys_piece[BLACK][type][square] = gen1();
26 }
27 }
29 Random gen2(C32(337245213));
30 for (int castle = 0; castle < 64; castle++) {
31 keys_enpassant[castle] = gen2();
32 }
34 Random gen3(C32(3642040919));
35 for (int castle = 0; castle < 16; castle++) {
36 keys_castle[castle] = gen3();
37 }
39 Random gen4(C32(3642040919));
40 for (int c = 0; c < 2; c++) {
41 for (int square = 0; square < 64; square++) {
42 keys_pawn[c][square] = gen4.get_U32();
43 }
44 }
45 };
47 inline U64 hash(const Board &board);
48 inline U32 hash_pawn(const Board &board);
50 inline U64 key_side() { return keys_side; }
51 inline U64 key_castle(int exp) { return keys_castle[exp]; }
52 inline U64 key_enpassant(Square square) { return keys_enpassant[square]; }
53 inline U64 key_pawn(Color color, Square square) { return keys_pawn[color][square]; }
54 inline U64 key_piece(Type type, Color color, Square square) {
55 return keys_piece[color][type][square];
56 }
58 }; // namespace zobrist
60 #endif