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 evaluate_position(board): if board.is_checkmate(): return -1000 # Mat protihráči elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_draw(): return 0 # Remíza else: return None # Hra pokračuje def update_AR_for_mate_in_k(board, AR, max_k=1000): k = 0 while True: k += 1 changed = False for _ in range(2): # Dvakrát pro každou hodnotu k for fen in list(AR.keys()): board.set_fen(fen) if AR[fen] is not None: continue # Tato pozice již byla ohodnocena evaluations = [] for move in board.legal_moves: board.push(move) next_fen = simplify_fen_string(board.fen()) if next_fen not in AR: AR[next_fen] = evaluate_position(board) # Přidání nových pozic do AR board.pop() if AR[next_fen] is not None: evaluations.append(AR[next_fen]) # Výpočet nového hodnocení na základě následovníků if evaluations: max_eval = max(evaluations) if max_eval == -1000: AR[fen] = 1000 - k changed = True elif 0 in evaluations: AR[fen] = 0 changed = True if not changed: break # Konec cyklu, pokud nedošlo k žádné změně if k >= max_k or not changed: break # Konec hlavního cyklu, pokud dosáhneme max_k nebo nedošlo k žádné změně def print_draw_positions(AR): """ Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR. """ print("Remízové pozice:") for fen, value in AR.items(): if value == 997: print(f"FEN: {fen}, Hodnota: {value}") def main(): initial_fen = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1" board = chess.Board(initial_fen) AR = {simplify_fen_string(initial_fen): None} # Inicializace AR s počáteční pozicí update_AR_for_mate_in_k(board, AR, max_k=50) # Aktualizace AR print_draw_positions(AR) # # Výpis aktualizovaných hodnocení # for fen, value in AR.items(): # if value == -999: # print(f"FEN: {fen}, Hodnota: {value}") main()