110 lines
No EOL
3.5 KiB
Python
110 lines
No EOL
3.5 KiB
Python
#!/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") |