Advertisement
max2201111

petr good minimax jen -1000

Mar 24th, 2024
672
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.09 KB | Science | 0 0
  1. import chess
  2.  
  3. def simplify_fen_string(fen):
  4.     parts = fen.split(' ')
  5.     simplified_fen = ' '.join(parts[:4])  # Zachováváme pouze informace o pozici
  6.     return simplified_fen
  7.  
  8. def evaluate_position(board):
  9.     if board.is_checkmate():
  10.         return -1000  # Mat protihráči
  11.     elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_draw():
  12.         return 0  # Remíza
  13.     else:
  14.         return None  # Hra pokračuje
  15.  
  16. def update_AR_for_mate_in_k(board, AR, max_k=1000):
  17.     k = 0
  18.     while True:
  19.         k += 1
  20.         changed = False
  21.         for _ in range(2):  # Dvakrát pro každou hodnotu k
  22.             for fen in list(AR.keys()):
  23.                 board.set_fen(fen)
  24.                 if AR[fen] is not None:
  25.                     continue  # Tato pozice již byla ohodnocena
  26.  
  27.                 evaluations = []
  28.                 for move in board.legal_moves:
  29.                     board.push(move)
  30.                     next_fen = simplify_fen_string(board.fen())
  31.                     if next_fen not in AR:
  32.                         AR[next_fen] = evaluate_position(board)  # Přidání nových pozic do AR
  33.                     board.pop()
  34.  
  35.                     if AR[next_fen] is not None:
  36.                         evaluations.append(AR[next_fen])
  37. #  pokud max=1001-k přiřaď nové ohodnocení jako 1000-k
  38.  
  39. # pokud max=0 přiřad nové ohodnocení jako 0
  40.  
  41. # tuto: pokud max=-1001+k, přiřaď nové ohodnocení jako -1000+k
  42. #                 # Výpočet nového hodnocení na základě následovníků
  43.  
  44. # if max_eval == 1001-k:
  45. #                         AR[fen] = 1000 - k
  46. #                         changed = True
  47. #                     elif max_eval == -1001+k:
  48. #                         AR[fen] = -1000 + k
  49.  
  50.  
  51.                 if evaluations:
  52.                     max_eval = -min(evaluations)
  53.                     if max_eval == 1001-k:
  54.                         AR[fen] = 1000 - k
  55.                         changed = True
  56.                     elif max_eval == -1001+k:
  57.                         AR[fen] = -1000 + k
  58.                         changed = True
  59.                     elif 0 in evaluations:
  60.                         AR[fen] = 0
  61.                         changed = True
  62.  
  63.             if not changed:
  64.                 break  # Konec cyklu, pokud nedošlo k žádné změně
  65.  
  66.         if k >= max_k or not changed:
  67.             break  # Konec hlavního cyklu, pokud dosáhneme max_k nebo nedošlo k žádné změně
  68.  
  69.            
  70. def print_draw_positions(AR):
  71.     """
  72.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  73.    """
  74.     print("Remízové pozice:")
  75.     for fen, value in AR.items():
  76.         if value != None:
  77.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  78.            
  79.            
  80. def main():
  81.     initial_fen = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  82.     board = chess.Board(initial_fen)
  83.     AR = {simplify_fen_string(initial_fen): None}  # Inicializace AR s počáteční pozicí
  84.    
  85.     update_AR_for_mate_in_k(board, AR, max_k=50)  # Aktualizace AR
  86.     print_draw_positions(AR)
  87.    
  88.    
  89.  
  90. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement