Code: Select all
# zobrist_gen.py
# Generator of Zobrist table for Micro-Max on STM32
# 781 unique 64-bit numbers, seed = 0x54321F00D
import random
SEED = 0x54321F00D
OUTPUT_FILE = "zobrist_table.h"
NUM_ENTRIES = 781
def main():
random.seed(SEED)
numbers = []
seen = set()
while len(numbers) < NUM_ENTRIES:
n = random.getrandbits(64)
if n not in seen:
seen.add(n)
numbers.append(n)
assert len(numbers) == NUM_ENTRIES
assert len(set(numbers)) == NUM_ENTRIES
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
f.write("#ifndef ZOBRIST_TABLE_H\n")
f.write("#define ZOBRIST_TABLE_H\n\n")
f.write("#include <stdint.h>\n\n")
f.write("/* Zobrist table: 781 random 64-bit numbers, seed 0x54321F00D */\n")
f.write("/* Index: color*384 + (ptype-1)*64 + sq (sq: a1=0, h8=63) */\n")
f.write("/* color: 0=white, 1=black; ptype: 1=P,2=N,3=B,4=R,5=Q,6=K */\n")
f.write("/* 768: side to move (XOR if black) */\n")
f.write("/* 769-772: castling (WK, WQ, BK, BQ) */\n")
f.write("/* 773-780: en passant files (a..h) */\n\n")
f.write("const uint64_t ZobristTable[781] = {\n")
for i in range(0, NUM_ENTRIES, 3):
chunk = numbers[i:i+3]
parts = ["0x{:016X}ULL".format(n) for n in chunk]
line = " " + ", ".join(parts)
if i + 3 < NUM_ENTRIES:
line += ","
f.write(line + "\n")
f.write("};\n\n")
f.write("#endif // ZOBRIST_TABLE_H\n")
print("Done! Generated {} unique 64-bit numbers".format(NUM_ENTRIES))
print("Saved to {}".format(OUTPUT_FILE))
if __name__ == "__main__":
main()