Move Generation: Castling - micro-Max by H.G. Muller

Discussion of chess software programming and technical issues.

Moderator: Ras

Alexlaw1964
Posts: 34
Joined: Fri Jan 03, 2025 6:36 am
Full name: alex lobov

Re: Move Generation: Castling - micro-Max by H.G. Muller

Post by Alexlaw1964 »

zobrist_gen.py

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()