Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import chess
- def simplify_fen_string(fen):
- parts = fen.split(' ')
- simplified_fen = ' '.join(parts[:4]) # Zachováváme pouze informace o pozici
- return simplified_fen
- def generate_positions(initial_fen):
- board = chess.Board(initial_fen)
- queue = [(board, None, 0)] # Přidáváme hloubku jako třetí prvek v tuple
- AR = {}
- depths_reached = [] # Seznam dosažených hloubek
- positions_visited = 0 # Počet projitých pozic
- target_position_fen = "8/8/4k3/8/8/2K5/8/7Q" # Cílová pozice
- target_position_reached = False
- while queue:
- current_board, parent_fen, depth = queue.pop(0)
- current_simplified_fen = simplify_fen_string(current_board.fen())
- positions_visited += 1
- if target_position_fen in current_simplified_fen and not target_position_reached:
- print("Cílová pozice dosažena!")
- target_position_reached = False
- if positions_visited % 100000 == 0: # Vypisujeme po každých 100 000 projitých pozicích
- print(f"Počet projitých pozic: {positions_visited}")
- if current_simplified_fen not in AR:
- AR[current_simplified_fen] = {
- 'fen': current_simplified_fen,
- 'parent': parent_fen,
- 'color': chess.WHITE if 'w' in current_board.fen() else chess.BLACK,
- 'children': [],
- 'result': None,
- 'sequence': [],
- 'to_end': None,
- 'depth_first_reached': depth # Přidáváme hloubku, ve které byla pozice poprvé dosažena
- }
- # Pokud jsme dosáhli nové hloubky, vytiskneme to
- if depth not in depths_reached:
- depths_reached.append(depth)
- print(f"Hloubka {depth} poprvé dosažena")
- # Kontrola matu nebo remízy
- if current_board.is_checkmate():
- AR[current_simplified_fen]['result'] = 1000 if current_board.turn == chess.WHITE else -1000
- elif current_board.is_stalemate() or current_board.is_insufficient_material():
- AR[current_simplified_fen]['result'] = 0
- # Generujeme tahy pouze pokud nejsme v koncové pozici
- if AR[current_simplified_fen]['result'] is None:
- unique_moves = set() # Uchováváme unikátní tahy
- for move in current_board.legal_moves:
- if move not in unique_moves: # Pokud tah ještě nebyl proveden
- unique_moves.add(move) # Přidáme ho do seznamu unikátních tahů
- current_board.push(move)
- queue.append((current_board.copy(), current_simplified_fen, depth + 1)) # Zvyšujeme hloubku pro potomky
- current_board.pop()
- return AR, positions_visited
- # Inicializace šachové desky
- initial_fen = "1k6/3K1Q2/8/8/8/8/8/8 w - - 0 1"
- ar_dict, positions_visited = generate_positions(initial_fen)
- # Výpis výsledků pro počáteční FEN
- initial_simplified_fen = simplify_fen_string(initial_fen)
- print(f"Slovník pro initial_fen: {ar_dict[initial_simplified_fen]}")
- print(f"Počet projitých pozic: {positions_visited}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement