diff options
| author | tslil clingman <tslil@posteo.de> | 2021-01-28 13:54:10 -0500 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-08-28 19:37:41 +0100 |
| commit | 6e6cdc4d9f0d7e4afdda67c97e7d7f13959e6134 (patch) | |
| tree | 15322705ce1dd73c1eb863678360a0e403490337 /include/zobrist.c | |
| parent | 55b45cc666c2ef883efe3831b96ac40623622582 (diff) | |
| parent | 1be9fac33c8227564079356c63840d227c88725f (diff) | |
Merge branch 'zobrist'
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; +} |
