Reinitialize repository and add working move generation for all pieces
This commit is contained in:
commit
951a8bbec6
28 changed files with 3373 additions and 0 deletions
110
helper_scripts/generate_premasks.py
Normal file
110
helper_scripts/generate_premasks.py
Normal 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")
|
||||
Loading…
Add table
Add a link
Reference in a new issue