diff options
| author | tslil clingman <tslil@posteo.de> | 2021-01-28 13:54:10 -0500 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2021-01-28 13:54:10 -0500 |
| commit | 6f17337761f6a196e89c5462a2ba53c8432b1a5d (patch) | |
| tree | 15322705ce1dd73c1eb863678360a0e403490337 /include/zobrist.c | |
| parent | 99e3497414754fe6a333d87e5f6a2a716e5f073a (diff) | |
| parent | d01b06cb80918e56ff99addd9f311331da35696d (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; +} |
