stellar

UCI 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 2 3 #include "piece.hpp" 4 #include "random.hpp" 5 6 #include <algorithm> 7 #include <array> 8 #include <random> 9 10 class Board; 11 namespace zobrist { 12 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]; 17 18 const U64 keys_side = Random(C32(1699391443))(); 19 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 } 28 29 Random gen2(C32(337245213)); 30 for (int castle = 0; castle < 64; castle++) { 31 keys_enpassant[castle] = gen2(); 32 } 33 34 Random gen3(C32(3642040919)); 35 for (int castle = 0; castle < 16; castle++) { 36 keys_castle[castle] = gen3(); 37 } 38 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 }; 46 47 inline U64 hash(const Board &board); 48 inline U32 hash_pawn(const Board &board); 49 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 } 57 58 }; // namespace zobrist 59 60 #endif