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 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])
- # pokud max=1001-k přiřaď nové ohodnocení jako 1000-k
- # pokud max=0 přiřad nové ohodnocení jako 0
- # tuto: pokud max=-1001+k, přiřaď nové ohodnocení jako -1000+k
- # # Výpočet nového hodnocení na základě následovníků
- # if max_eval == 1001-k:
- # AR[fen] = 1000 - k
- # changed = True
- # elif max_eval == -1001+k:
- # AR[fen] = -1000 + k
- if evaluations:
- max_eval = -min(evaluations)
- if max_eval == 1001-k:
- AR[fen] = 1000 - k
- changed = True
- elif max_eval == -1001+k:
- 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 != None:
- print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
- 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)
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement