Advertisement
Guest User

xz

a guest
Aug 1st, 2024
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.31 KB | None | 0 0
  1. #Эй, надо написать chess-бота с GU-интерфейсом на ткинтере с применением алгоритма альфа-бета отсечения,
  2. # белыми играю я. Всё скинь мне в одном файле
  3.  
  4. # Давайте создадим шахматного бота с графическим интерфейсом на tkinter и алгоритмом альфа-бета отсечения.
  5. # В этом примере вы будете играть белыми, а бот будет использовать альфа-бета отсечение для игры черными.
  6.  
  7. #Вот пример кода, который объединяет всё в одном файле:
  8.  
  9. import tkinter as tk
  10. import chess
  11. import chess.svg
  12.  
  13.  
  14. class ChessBoard:
  15.     def __init__(self):
  16.         self.board = chess.Board()
  17.  
  18.     def generate_legal_moves(self):
  19.         return list(self.board.legal_moves)
  20.  
  21.     def apply_move(self, move):
  22.         if move in self.board.legal_moves:
  23.             self.board.push(move)
  24.         else:
  25.             raise ValueError("Invalid move")
  26.  
  27.     def undo_move(self):
  28.         if len(self.board.move_stack) > 0:
  29.             self.board.pop()
  30.         else:
  31.             raise ValueError("No move to undo")
  32.  
  33.     def is_game_over(self):
  34.         return self.board.is_game_over()
  35.  
  36.     def evaluate_board(self):
  37.         piece_values = {
  38.             chess.PAWN: 1,
  39.             chess.KNIGHT: 3,
  40.             chess.BISHOP: 3,
  41.             chess.ROOK: 5,
  42.             chess.QUEEN: 9,
  43.             chess.KING: 0
  44.         }
  45.         score = 0
  46.         for piece in chess.PIECE_TYPES:
  47.             for square in chess.SQUARES:
  48.                 piece_at_square = self.board.piece_at(square)
  49.                 if piece_at_square:
  50.                     score += piece_values.get(piece_at_square.piece_type,
  51.                                               0) if piece_at_square.color == chess.WHITE else -piece_values.get(
  52.                         piece_at_square.piece_type, 0)
  53.         return score
  54.  
  55.  
  56. def alpha_beta(board, depth, alpha, beta, maximizing_player):
  57.     if depth == 0 or board.is_game_over():
  58.         return board.evaluate_board()
  59.  
  60.     if maximizing_player:
  61.         max_eval = float('-inf')
  62.         for move in board.generate_legal_moves():
  63.             board.apply_move(move)
  64.             eval = alpha_beta(board, depth - 1, alpha, beta, False)
  65.             board.undo_move()
  66.             max_eval = max(max_eval, eval)
  67.             alpha = max(alpha, eval)
  68.             if beta <= alpha:
  69.                 break
  70.         return max_eval
  71.     else:
  72.  
  73.         min_eval = float('inf')
  74.         for move in board.generate_legal_moves():
  75.             board.apply_move(move)
  76.             eval = alpha_beta(board, depth - 1, alpha, beta, True)
  77.             board.undo_move()
  78.             min_eval = min(min_eval, eval)
  79.             beta = min(beta, eval)
  80.             if beta <= alpha:
  81.                 break
  82.         return min_eval
  83.  
  84.  
  85. def best_move(board, depth):
  86.     best_move = None
  87.     best_value = float('-inf') if board.board.turn == chess.WHITE else float('inf')
  88.  
  89.     for move in board.generate_legal_moves():
  90.         board.apply_move(move)
  91.         move_value = alpha_beta(board, depth - 1, float('-inf'), float('inf'), not board.board.turn == chess.WHITE)
  92.         board.undo_move()
  93.  
  94.         if (board.board.turn == chess.WHITE and move_value > best_value) or (
  95.                 board.board.turn == chess.BLACK and move_value < best_value):
  96.             best_value = move_value
  97.             best_move = move
  98.  
  99.     return best_move
  100.  
  101.  
  102. class ChessGUI:
  103.     def __init__(self, root):
  104.         self.board = ChessBoard()
  105.         self.root = root
  106.         self.root.title("Chess Game")
  107.  
  108.         self.selected_square = None
  109.         self.create_widgets()
  110.         self.draw_board()
  111.  
  112.     def create_widgets(self):
  113.         self.canvas = tk.Canvas(self.root, width=400, height=400)
  114.         self.canvas.pack()
  115.  
  116.         self.canvas.bind("<Button-1>", self.on_square_click)
  117.  
  118.         self.undo_button = tk.Button(self.root, text="Undo", command=self.undo_move)
  119.         self.undo_button.pack(side=tk.LEFT)
  120.  
  121.         self.exit_button = tk.Button(self.root, text="Exit", command=self.root.quit)
  122.         self.exit_button.pack(side=tk.RIGHT)
  123.  
  124.         self.new_game_button = tk.Button(self.root, text="New Game", command=self.new_game)
  125.         self.new_game_button.pack(side=tk.LEFT)
  126.  
  127.         self.draw_board()
  128.  
  129.     def draw_board(self):
  130.         self.canvas.delete("all")
  131.         self.square_size = 50
  132.         colors = ["#DDB88C", "#A66D4F"]
  133.         for row in range(8):
  134.             for col in range(8):
  135.                 x1 = col * self.square_size
  136.                 y1 = row * self.square_size
  137.                 x2 = x1 + self.square_size
  138.                 y2 = y1 + self.square_size
  139.                 color = colors[(row + col) % 2]
  140.                 self.canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline="black")
  141.  
  142.                 piece = self.board.board.piece_at(chess.square(col, 7 - row))
  143.                 if piece:
  144.                     self.draw_piece(piece, col, row)
  145.  
  146.     def draw_piece(self, piece, col, row):
  147.         x = col * self.square_size + self.square_size // 2
  148.         y = row * self.square_size + self.square_size // 2
  149.         piece_unicode = self.get_piece_unicode(piece)
  150.         self.canvas.create_text(x, y, text=piece_unicode, font=("Arial", 24))
  151.  
  152.     def get_piece_unicode(self, piece):
  153.         piece_map = {
  154.             chess.PAWN: '♙' if piece.color == chess.WHITE else '♟',
  155.             chess.KNIGHT: '♘' if piece.color == chess.WHITE else '♞',
  156.             chess.BISHOP: '♗' if piece.color == chess.WHITE else '♝',
  157.             chess.ROOK: '♖' if piece.color == chess.WHITE else '♜',
  158.             chess.QUEEN: '♕' if piece.color == chess.WHITE else '♛',
  159.             chess.KING: '♔' if piece.color == chess.WHITE else '♚',
  160.         }
  161.         return piece_map.get(piece.piece_type, '')
  162.  
  163.     def on_square_click(self, event):
  164.         col = event.x // self.square_size
  165.         row = 7 - (event.y // self.square_size)
  166.         square = chess.square(col, row)
  167.  
  168.         if self.selected_square is None:
  169.             if self.board.board.piece_at(square) and self.board.board.turn == chess.WHITE:
  170.                 self.selected_square = square
  171.         else:
  172.             move = chess.Move(self.selected_square, square)
  173.             if move in self.board.generate_legal_moves():
  174.                 self.board.apply_move(move)
  175.                 self.selected_square = None
  176.                 self.draw_board()
  177.                 if not self.board.is_game_over():
  178.                     self.bot_move()
  179.             else:
  180.                 self.selected_square = None
  181.                 print("Invalid move")
  182.  
  183.     def bot_move(self):
  184.         if not self.board.is_game_over():
  185.             move = best_move(self.board, depth = 3)
  186.             if move:
  187.                 self.board.apply_move(move)
  188.                 self.draw_board()
  189.             else:
  190.                 print("Bot has no valid moves!")
  191.  
  192.     def undo_move(self):
  193.         self.board.undo_move()
  194.         self.draw_board()
  195.  
  196.     def new_game(self):
  197.         self.board = ChessBoard()
  198.         self.draw_board()
  199.  
  200.  
  201. if __name__ == "__main__":
  202.     root = tk.Tk()
  203.     app = ChessGUI(root)
  204.     root.mainloop()
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement