Advertisement
max2201111

correct draw incorrect win

Apr 9th, 2024
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.13 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:
  55.                         evaluations.append(AR[next_fen]['result'])
  56.                        
  57.                 # Aktualizujte výsledek na základě evaluací
  58.                 if evaluations:
  59.                     max_eval = -min(evaluations)
  60.                     if max_eval == -1001 + k:
  61.                         AR[fen]['result'] = 1000 - k
  62.                         changed = True
  63.                     elif max_eval == 1001 - k:
  64.                         AR[fen]['result'] = -1000 + k
  65.                         changed = True
  66.                     elif max_eval == 0:
  67.                         AR[fen]['result'] = 0
  68.                         changed = True
  69.  
  70.             if not changed:
  71.                 break  # Konec cyklu, pokud nedošlo k žádné změně
  72.  
  73.         if not changed:
  74.             break  # Konec hlavního cyklu, pokud dosáhneme max_k nebo nedošlo k žádné změně
  75.  
  76.  
  77. def print_draw_positions(AR):
  78.     """
  79.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  80.    """
  81.     print("Remízové pozice:")
  82.     for fen, value in AR.items():
  83.         if True or (value > 990 and value < 1000):
  84.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  85.  
  86. def find_path_to_end(AR, fen):
  87.     if AR[fen]['result'] is None:
  88.         print(f"Unfortunately, there is no path that is known to be the best")
  89.    
  90.     fen_i = fen
  91.     print(chess.Board(fen_i),"\n<")
  92.     path = fen
  93.     while AR[fen_i]['best_child'] is not None:
  94.         fen_i = AR[fen_i]['best_child']
  95.         print(chess.Board(fen_i),"\n<")
  96.        
  97.         path = path + ", " + fen_i
  98.    
  99.     print(f"Path is: {path}")
  100.    
  101.  
  102.            
  103. def main():
  104.  
  105.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  106.     initial_fen_original = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  107.     initial_fen_mate_in_one_aka_one_ply = "3r1k2/5r1p/5Q1K/2p3p1/1p4P1/8/8/8 w - - 2 56"
  108.     initial_fen_mate_in_two_aka_three_plies = "r5k1/2r3p1/pb6/1p2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 b - - 4 28"
  109.     initial_fen_mated_in_two_plies = "r5k1/2r3p1/p7/bp2P1N1/3PbB1P/3pP3/PP1K1P2/3R2R1 w - - 5 29"
  110.    
  111.     mate_in_two_aka_three_plies_simple = "8/8/8/8/3R4/5K2/8/4k3 w - - 0 1"
  112.     mated_in_one_aka_two_plies_simple = "8/8/3R4/8/8/5K2/8/4k3 b - - 1 1"
  113.     mate_in_one_aka_one_ply_simple = "8/8/3R4/8/8/5K2/8/5k2 w - - 2 2"
  114.  
  115.     initial_fen = mate_in_two_aka_three_plies_simple
  116.    
  117.    
  118.     initial_fen = "1k6/5P2/2K5/8/8/8/8/8 w - - 0 1"
  119.     initial_fen = "1k6/8/2K5/8/8/8/8/8 w - - 0 1"
  120.     initial_fen = "8/8/8/8/8/7N/1k5K/6B1 w - - 0 1"
  121.     initial_fen = "7K/8/k1P5/7p/8/8/8/8 w - - 0 1"
  122.     initial_fen = "8/3k4/8/2K2R2/8/8/8/8 w - - 0 1"
  123.    
  124.     initial_fen = "8/2k5/8/8/3K4/8/8/8 w - - 0 1"
  125.    
  126.     simplified_fen = simplify_fen_string(initial_fen)
  127.    
  128.     board = chess.Board(initial_fen)
  129.     AR = {simplified_fen: {"result": None, "last_move": None, "children": None, "best_child": None}}  # Inicializace AR s počáteční pozicí
  130.    
  131.     #update_AR_for_mate_in_k(board, AR, simplified_fen, max_k=58)  # Aktualizace AR
  132.     update_AR_for_mate_in_k(board, AR, max_k=1000)
  133.     # Tělo funkce zůstává stejné...
  134.  
  135.    
  136.     #print_draw_positions(AR)
  137.     print(f"AR for initial fen is = {AR[simplified_fen]}")
  138.     find_path_to_end(AR, simplified_fen)
  139.    
  140.  
  141. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement