diff options
Diffstat (limited to 'include/zobrist.c')
| -rw-r--r-- | include/zobrist.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/include/zobrist.c b/include/zobrist.c new file mode 100644 index 0000000..feff5fa --- /dev/null +++ b/include/zobrist.c @@ -0,0 +1,50 @@ +#include "zobrist.h" + +// =================================================================== +// Globals +// =================================================================== + +static uint64_t *zobrist; + +// =================================================================== +// Helpers +// =================================================================== + + +// =================================================================== +// Exported method implementations +// =================================================================== + +int +zobrist_init(void) { + if (zobrist != NULL) return EXIT_FAILURE; + + zobrist = malloc(sizeof(uint64_t)*board_size*board_size*(15*2*3)); + for (int k=0; k<board_size*board_size*(15*2*3); k++) { + XORSHIFT64; + zobrist[k] = RANDOM64; + } + + return EXIT_SUCCESS; +} + +void +zobrist_free(void) { + if (zobrist != NULL) { + free(zobrist); + zobrist = NULL; + } +} + +uint64_t +zobrist_compute(void) { + uint64_t hash = 0; + for (uint8_t l=0; l<board_size*board_size; l++) { + colour_stack_t c = colours[l]; + const uint8_t count = COUNT_AT(l); + enum STONE_VARIANT s = STONE_AT(l); + for (uint8_t h=0; h<count; h++, c >>= 1) + hash ^= zobrist[l*(15*2*3)+h*2*3+(c&1)*3+s]; + } + return hash; +} |
