Reinitialize repository and add working move generation for all pieces

This commit is contained in:
Moritz Eigenauer 2025-11-12 17:01:12 +01:00
commit 951a8bbec6
28 changed files with 3373 additions and 0 deletions

View file

@ -0,0 +1,110 @@
#!/usr/bin/env python3
def generate_premasks():
"""
Generiert relevante Belegungsmasken (relevant occupancy masks) für
Türme (Rooks) und Läufer (Bishops) auf allen 64 Feldern.
Diese Masken enthalten alle Felder zwischen der Figur und dem Rand,
ABER AUSSCHLIESSLICH der Randfelder selbst.
"""
all_rook_masks = []
all_bishop_masks = []
# Richtungen für beide Figurentypen
rook_directions = [
(1, 0), # Hoch
(-1, 0), # Runter
(0, 1), # Rechts
(0, -1) # Links
]
bishop_directions = [
(1, 1), # Hoch-Rechts
(1, -1), # Hoch-Links
(-1, 1), # Runter-Rechts
(-1, -1) # Runter-Links
]
for sq in range(64):
rook_mask_bb = 0
bishop_mask_bb = 0
rank = sq // 8
file = sq % 8
# --- 1. Turm (Rook) Masken-Generierung ---
# (Dies ist die korrigierte Logik)
for dr, df in rook_directions:
target_rank = rank + dr
target_file = file + df
# Schleife, solange wir auf dem Brett sind (0-7)
while 0 <= target_rank <= 7 and 0 <= target_file <= 7:
is_relevant = False
# Prüfen, ob das Feld *vor* dem Rand liegt.
if df != 0: # Horizontale Bewegung
if 1 <= target_file <= 6: # Files 'b' bis 'g'
is_relevant = True
elif dr != 0: # Vertikale Bewegung
if 1 <= target_rank <= 6: # Ranks 2 bis 7
is_relevant = True
if is_relevant:
target_sq = target_rank * 8 + target_file
rook_mask_bb |= (1 << target_sq)
# Zum nächsten Feld in dieser Richtung
target_rank += dr
target_file += df
all_rook_masks.append(rook_mask_bb)
# --- 2. Läufer (Bishop) Masken-Generierung ---
# (Diese Logik war in deinem "Rook"-Skript und ist hier korrekt)
for dr, df in bishop_directions:
target_rank = rank + dr
target_file = file + df
# Schleife, solange wir *von allen* Rändern entfernt sind (1-6)
while 1 <= target_rank <= 6 and 1 <= target_file <= 6:
target_sq = target_rank * 8 + target_file
bishop_mask_bb |= (1 << target_sq)
# Zum nächsten Feld in dieser Richtung
target_rank += dr
target_file += df
all_bishop_masks.append(bishop_mask_bb)
# Gibt beide Listen als Tupel zurück
return all_rook_masks, all_bishop_masks
def print_rust_array(attacks, const_name):
"""
Gibt die Liste der Bitboards als Rust-Array aus.
"""
print(f"pub const {const_name}: [u64; 64] = [")
for i, attacks_bb in enumerate(attacks):
# Formatieren als 64-Bit binärer String mit Nullen
raw_binary_string = f"{attacks_bb:064b}"
# Unterstriche alle 8 Bits zur Lesbarkeit einfügen
chunks = [raw_binary_string[j:j+8] for j in range(0, 64, 8)]
binary_string = f"0b{'_'.join(chunks)}"
# Index 'ABCDEFGH' korrekt zuordnen
print(f" {binary_string}, // Square {i} ({'ABCDEFGH'[i%8]}{i//8 + 1})")
print("];")
if __name__ == "__main__":
# Entpackt das Tupel mit beiden Masken-Listen
rook_masks, bishop_masks = generate_premasks()
print("--- ROOK MASKS ---")
print_rust_array(rook_masks, "ROOK_RELEVANT_OCCUPANCY")
print("\n--- BISHOP MASKS ---")
print_rust_array(bishop_masks, "BISHOP_RELEVANT_OCCUPANCY")