Advertisement
max2201111

raven

Mar 25th, 2024
710
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.21 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. #     for k in range(1, max_k + 1):
  18. #         changed = False
  19. #         for fen in list(AR.keys()):
  20. #             board.set_fen(fen)
  21. #             if AR[fen] is not None:
  22. #                 continue
  23.  
  24. #             position_evaluated = False
  25. #             for move in board.legal_moves:
  26. #                 board.push(move)
  27. #                 next_fen = simplify_fen_string(board.fen())
  28. #                 board.pop()
  29.                
  30. #                 if next_fen not in AR:
  31. #                     AR[next_fen] = evaluate_position(board)
  32.                
  33. #                 next_eval = AR[next_fen]
  34. #                 if next_eval is not None:
  35. #                     if next_eval == -1000:
  36. #                         # Pokud z některého tahu plyne mat, znamená to vítězství
  37. #                         AR[fen] = 1000 - k
  38. #                         changed = True
  39. #                         position_evaluated = True
  40. #                         break
  41. #                     elif next_eval == 0:
  42. #                         # Pokud je možná remíza, nastavíme hodnotu na 0
  43. #                         AR[fen] = 0
  44. #                         changed = True
  45. #                         position_evaluated = True
  46. #                         break
  47.  
  48. #             if not position_evaluated and AR[fen] is None:
  49. #                 # Pokud není možné matovat nebo remizovat, značíme pozici jako -1000 + k
  50. #                 AR[fen] = -1000 + k
  51. #                 changed = True
  52.  
  53. #         if not changed:
  54. #             break
  55.  
  56. # def update_AR_for_mate_in_k(board, AR, max_k=1000):
  57. #     for k in range(1, max_k + 1):
  58. #         for _ in range(2):  # Pro každé k provádíme aktualizaci dvakrát
  59. #             changed = False
  60. #             for fen in list(AR.keys()):
  61. #                 board.set_fen(fen)
  62. #                 if AR[fen] is not None:
  63. #                     continue  # Tato pozice již byla ohodnocena
  64.  
  65. #                 position_evaluated = False
  66. #                 for move in board.legal_moves:
  67. #                     board.push(move)
  68. #                     next_fen = simplify_fen_string(board.fen())
  69. #                     board.pop()
  70.                    
  71. #                     if next_fen not in AR:
  72. #                         AR[next_fen] = evaluate_position(board)
  73.                    
  74. #                     next_eval = AR[next_fen]
  75. #                     if next_eval is not None:
  76. #                         if next_eval == -1000:
  77. #                             # Pokud z některého tahu plyne mat, znamená to vítězství
  78. #                             AR[fen] = 1000 - k
  79. #                             changed = True
  80. #                             position_evaluated = True
  81. #                             break
  82. #                         elif next_eval == 0:
  83. #                             # Pokud je možná remíza, nastavíme hodnotu na 0
  84. #                             AR[fen] = 0
  85. #                             changed = True
  86. #                             position_evaluated = True
  87. #                             break
  88.  
  89. #                 if not position_evaluated and AR[fen] is None:
  90. #                     # Pokud není možné matovat nebo remizovat, značíme pozici jako -1000 + k
  91. #                     AR[fen] = -1000 + k
  92. #                     changed = True
  93.  
  94. #             if not changed:
  95. #                 break  # Pokud nedošlo k žádné změně během obou iterací pro dané k, ukončíme smyčku
  96.  
  97. def update_AR_for_mate_in_k(board, AR, max_k=1000):
  98.     for k in range(1, max_k + 1):
  99.         changed = False
  100.         for _ in range(2):  # Zajistíme, že pro každé k proběhne aktualizace dvakrát
  101.             for fen in list(AR.keys()):
  102.                 board.set_fen(fen)
  103.                
  104.                 if AR[fen] is not None:
  105.                     continue  # Pokud již máme hodnocení, přeskočíme
  106.                
  107.                 # Získáme výchozí hodnoty pro nejlepší a nejhorší scénář
  108.                 best_case = float("-inf")
  109.                 worst_case = float("inf")
  110.  
  111.                 for move in board.legal_moves:
  112.                     board.push(move)
  113.                     next_fen = simplify_fen_string(board.fen())
  114.                     board.pop()
  115.                    
  116.                     if next_fen not in AR:
  117.                         AR[next_fen] = evaluate_position(board)
  118.                    
  119.                     next_eval = AR[next_fen]
  120.                     if next_eval is not None:
  121.                         best_case = max(best_case, next_eval)
  122.                         worst_case = min(worst_case, next_eval)
  123.  
  124.                 # Aktualizace hodnocení podle nejlepšího a nejhoršího scénáře
  125.                 if worst_case == -1000:
  126.                     # Pokud všechny tahy vedou k matu, hráč na tahu může být matován v k tazích
  127.                     AR[fen] = -1000 + k
  128.                     changed = True
  129.                 elif best_case <= 0:
  130.                     # Pokud nejlepší scénář není lepší než remíza, znamená to remízu nebo prohru
  131.                     AR[fen] = max(best_case, 0)  # Zabráníme nastavení hodnoty méně než 0, pokud je remíza možná
  132.                     changed = True
  133.                 elif best_case == 1000:
  134.                     # Pokud existuje alespoň jeden tah, který vede k matu protihráče, hráč na tahu může vynutit mat v k tazích
  135.                     AR[fen] = 1000 - k
  136.                     changed = True
  137.  
  138.             if not changed:
  139.                 break  # Pokud nedošlo k žádné změně, ukončíme smyčku
  140.  
  141.         if not changed:
  142.             break  # Ukončíme hlavní smyčku, pokud nedošlo ke změně v poslední iteraci
  143.  
  144.  
  145. # def print_positions(AR):
  146. #     for fen, value in AR.items():
  147. #         if value < -990:
  148. #             print(f"FEN: {fen}, Hodnota: {value}")
  149.  
  150. # def main():
  151. #     initial_fen = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  152. #     board = chess.Board(initial_fen)
  153. #     AR = {simplify_fen_string(initial_fen): evaluate_position(board)}
  154.    
  155. #     update_AR_for_mate_in_k(board, AR, max_k=50)
  156. #     print_positions(AR)
  157.  
  158. # main()
  159.  
  160. def print_draw_positions(AR):
  161.     """
  162.    Vytiskne všechny remízové pozice (hodnota 0) zaznamenané v slovníku AR.
  163.    """
  164.     print("Remízové pozice:")
  165.     for fen, value in AR.items():
  166.         if True or (value > 990 and value < 1000):
  167.             print(f"FEN>: {fen}, Hodnota: {value}","\n",chess.Board(fen),"<\n")
  168.            
  169.            
  170. def main():
  171.     initial_fen = "8/8/8/8/3Q4/5K2/8/4k3 w - - 0 1"
  172.     board = chess.Board(initial_fen)
  173.     AR = {simplify_fen_string(initial_fen): None}  # Inicializace AR s počáteční pozicí
  174.    
  175.     update_AR_for_mate_in_k(board, AR, max_k=50)  # Aktualizace AR
  176.     print_draw_positions(AR)
  177.    
  178.    
  179.  
  180. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement