aboutsummaryrefslogtreecommitdiff
path: root/include/zobrist.c
diff options
context:
space:
mode:
authortslil clingman <tslil@posteo.de>2021-01-28 13:54:10 -0500
committertslil <tslil@posteo.de>2026-08-28 19:37:41 +0100
commit6e6cdc4d9f0d7e4afdda67c97e7d7f13959e6134 (patch)
tree15322705ce1dd73c1eb863678360a0e403490337 /include/zobrist.c
parent55b45cc666c2ef883efe3831b96ac40623622582 (diff)
parent1be9fac33c8227564079356c63840d227c88725f (diff)
Merge branch 'zobrist'
Diffstat (limited to 'include/zobrist.c')
-rw-r--r--include/zobrist.c50
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;
+}