Advertisement
max2201111

last none

Apr 9th, 2024
786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.19 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.     #print(f"Position: {board.fen()}")
  10.     if board.is_checkmate():
  11.      ###   print(f"Position: {board.fen()}, return -1000")
  12.         return -1000  # Mat protihráči
  13.     elif board.is_stalemate() or board.is_insufficient_material() or board.can_claim_draw():
  14.      ###   print(f"Position: {board.fen()}, return 0")
  15.  
  16.         return 0  # Remíza
  17.     else:
  18.         #print(f"Position: {board.fen()}, return None")
  19.         return None  # Hra pokračuje
  20.  
  21.  
  22. def create_AR_entry(result, children, last_move):
  23.     return {"result": result, "children": children, "last_move": last_move, "best_child": None}
  24.  
  25.  
  26. def update_best_case(best_case):
  27.     if best_case == 0:
  28.         return best_case
  29.     if best_case > 0:
  30.         return best_case - 1
  31.     else:
  32.         return best_case + 1
  33.  
  34.  
  35.  
  36. def update_AR_for_mate_in_k(board, AR, max_k=1000):
  37.     for k in range(1, max_k + 1):
  38.         changed = False
  39.       #  for _ in range(2):  # Dvakrát pro každou hodnotu k
  40.         for fen in list(AR.keys()):
  41.             board.set_fen(fen)
  42.             if AR[fen].get('result') is not None:
  43.                 continue  # Tato pozice již byla ohodnocena
  44.  
  45.             evaluations = []
  46.             for move in board.legal_moves:
  47.                 board.push(move)
  48.                 next_fen = simplify_fen_string(board.fen())
  49.                 if next_fen not in AR:
  50.                     result = evaluate_position(board)
  51.                     AR[next_fen] = create_AR_entry(result, [], move)
  52.                 board.pop()  # Vracíme šachovnici do původního stavu
  53.  
  54.                 if AR[next_fen].get('result') is not None or True:
  55.                     evaluations.append(AR[next_fen]['result'])
  56.  
  57.             # Aktualizujte výsledek na základě evaluací
  58.             if evaluations:
  59.                 if all(item is not None for item in evaluations):
  60.                     max_eval = -min(evaluations)
  61.                 if all(item is not None for item in evaluations) and max_eval == -1001 + k:
  62.                     AR[fen]['result'] = 1000 - k
  63.                     changed = True
  64.                 elif all(item is not None for item in evaluations) and max_eval == 1001 - k:
  65.                     AR[fen]['result'] = -1000 + k
  66.                     changed = True
  67.                 elif all(item is not None for item in evaluations) and max_eval == 0:
  68.                     AR[fen]['result'] = 0
  69.                     changed = True
  70.  
  71.         if not changed:
  72.             break  # Konec cyklu, pokud nedošlo k žádné změně
  73.  
  74.         if not changed:
  75.             break  # Konec hlavního cyklu, pokud dosáhneme max_k nebo nedošlo k žádné změně
  76.  
  77.  
  78. def print_draw_positions(AR):
  79.     """
  80.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  81.    """
  82.     print("Remízové pozice:")
  83.     for fen, value in AR.items():
  84.         if True or (value > 990 and value < 1000):
  85.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  86.  
  87. def find_path_to_end(AR, fen):
  88.     if AR[fen]['result'] is None:
  89.         print(f"Unfortunately, there is no path that is known to be the best")
  90.    
  91.     fen_i = fen
  92.     print(chess.Board(fen_i),"\n<")
  93.     path = fen
  94.     while AR[fen_i]['best_child'] is not None:
  95.         fen_i = AR[fen_i]['best_child']
  96.         print(chess.Board(fen_i),"\n<")
  97.        
  98.         path = path + ", " + fen_i
  99.    
  100.     print(f"Path is: {path}")
  101.    
  102.  
  103.            
  104. def main():
  105.  
  106.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  107.     initial_fen_original = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  108.     initial_fen_mate_in_one_aka_one_ply = "3r1k2/5r1p/5Q1K/2p3p1/1p4P1/8/8/8 w - - 2 56"
  109.     initial_fen_mate_in_two_aka_three_plies = "r5k1/2r3p1/pb6/1p2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 b - - 4 28"
  110.     initial_fen_mated_in_two_plies = "r5k1/2r3p1/p7/bp2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 w - - 5 29"
  111.    
  112.     mate_in_two_aka_three_plies_simple = "8/8/8/8/3R4/5K2/8/4k3 w - - 0 1"
  113.     mated_in_one_aka_two_plies_simple = "8/8/3R4/8/8/5K2/8/4k3 b - - 1 1"
  114.     mate_in_one_aka_one_ply_simple = "8/8/3R4/8/8/5K2/8/5k2 w - - 2 2"
  115.  
  116.     initial_fen = mate_in_two_aka_three_plies_simple
  117.    
  118.    
  119.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  120.     initial_fen = "1k6/8/2K5/8/8/8/8/8 w - - 0 1"
  121.     initial_fen = "8/8/8/8/8/7N/1k5K/6B1 w - - 0 1"
  122.     initial_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  123.     initial_fen = "8/3k4/8/2K2R2/8/8/8/8 w - - 0 1"
  124.    
  125.  #   initial_fen = "8/2k5/8/8/3K4/8/8/8 w - - 0 1"
  126.    
  127.     simplified_fen = simplify_fen_string(initial_fen)
  128.    
  129.     board = chess.Board(initial_fen)
  130.     AR = {simplified_fen: {"result": None, "last_move": None, "children": None, "best_child": None}}  # Inicializace AR s počáteční pozicí
  131.    
  132.     #update_AR_for_mate_in_k(board, AR, simplified_fen, max_k=58)  # Aktualizace AR
  133.     update_AR_for_mate_in_k(board, AR, max_k=1000)
  134.     # Tělo funkce zůstává stejné...
  135.  
  136.    
  137.     #print_draw_positions(AR)
  138.     print(f"AR for initial fen is = {AR[simplified_fen]}")
  139.     find_path_to_end(AR, simplified_fen)
  140.    
  141.  
  142. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement