Advertisement
max2201111

very good petr

May 1st, 2024
828
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.58 KB | Science | 0 0
  1. import chess
  2.  
  3. def simplify_fen_string(fen):
  4.     """Odstraní z FEN řetězce části týkající se počtu tahů, zachovává pozici, hráče na tahu, rošády a en passant."""
  5.     parts = fen.split(' ')
  6.     simplified_fen = ' '.join(parts[:4])  # Zachováváme informace o pozici, hráči na tahu, rošádách a en passant
  7.     return simplified_fen
  8.  
  9. def minimax(board, depth, alpha, beta, maximizing_player,depth2):
  10.     if depth == 0 or board.is_game_over():
  11.         return None, evaluate_board(board,depth2)
  12.    
  13.     best_move = None
  14.    
  15.     if maximizing_player:
  16.         max_eval = float('-inf')
  17.         for move in board.legal_moves:
  18.             board_copy = board.copy()
  19.             board_copy.push(move)
  20.             _, eval = minimax(board_copy, depth - 1, alpha, beta, False,depth2+1)
  21.             if eval > max_eval:
  22.                 max_eval = eval
  23.                 best_move = move
  24.             alpha = max(alpha, eval)
  25.             if beta <= alpha:
  26.                 break
  27.         return best_move, max_eval
  28.     else:
  29.         min_eval = float('inf')
  30.         for move in board.legal_moves:
  31.             board_copy = board.copy()
  32.             board_copy.push(move)
  33.             _, eval = minimax(board_copy, depth - 1, alpha, beta, True, depth2+1)
  34.             if eval < min_eval:
  35.                 min_eval = eval
  36.                 best_move = move
  37.             beta = min(beta, eval)
  38.             if beta <= alpha:
  39.                 break
  40.         return best_move, min_eval
  41.  
  42. def evaluate_board(board, depth):
  43.     if board.is_checkmate():
  44.         # Při matu by měl být hráč, který je na tahu, penalizován.
  45.         # Protože `board.turn` značí, kdo je na tahu, znamená to, že hráč na tahu byl matován.
  46.         # Pokud je tedy bílý na tahu, znamená to, že černý dal mat (a naopak).
  47.         return -1000 + depth if board.turn == chess.WHITE else 1000 - depth
  48.     elif board.is_stalemate() or board.is_insufficient_material():
  49.         return 0  # Remíza nebo nedostatek materiálu
  50.     return 0  # Zjednodušená hodnota pro nekoncové pozice
  51.  
  52.  
  53. # Nastavení startovní pozice
  54. start_fen = "6k1/3Q4/8/8/4K3/8/8/8 w - - 0 1"
  55. start_fen = "8/6K1/8/3q1k2/8/8/8/8 w - - 0 1"
  56.  
  57. start_fen = "5k2/7K/8/6P1/8/8/8/8 w - - 0 1"
  58.  
  59. start_fen = "3k4/6P1/3K4/8/8/8/8/8 w - - 0 1"
  60.  
  61. start_fen = "8/8/8/8/1B6/2KN4/k7/8 w - - 0 1"
  62.  
  63. board = chess.Board(start_fen)
  64.  
  65. # Spuštění minimaxu s maximální hloubkou 3
  66. best_move, best_score = minimax(board, 9, float('-inf'), float('inf'), True, 0)
  67. print(f"Nejlepší tah z pozice {start_fen} je {board.san(best_move)} s hodnocením {best_score}.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement