Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- import random
- def check_win(board, player):
- for row in board:
- if all(cell == player for cell in row):
- return True
- for col in range(3):
- if all(board[row][col] == player for row in range(3)):
- return True
- if all(board[i][i] == player for i in range(3)) or all(board[i][2 - i] == player for i in range(3)):
- return True
- return False
- def is_full(board):
- return all(cell != "" for row in board for cell in row)
- def minimax(board, depth, is_maximizing):
- if check_win(board, "X"):
- return -1
- if check_win(board, "O"):
- return 1
- if is_full(board):
- return 0
- if is_maximizing:
- best_score = -float("inf")
- for row in range(3):
- for col in range(3):
- if board[row][col] == "":
- board[row][col] = "O"
- score = minimax(board, depth + 1, False)
- board[row][col] = ""
- best_score = max(score, best_score)
- return best_score
- else:
- best_score = float("inf")
- for row in range(3):
- for col in range(3):
- if board[row][col] == "":
- board[row][col] = "X"
- score = minimax(board, depth + 1, True)
- board[row][col] = ""
- best_score = min(score, best_score)
- return best_score
- def find_best_move(board):
- best_move = None
- best_score = -float("inf")
- for row in range(3):
- for col in range(3):
- if board[row][col] == "":
- board[row][col] = "O"
- score = minimax(board, 0, False)
- board[row][col] = ""
- if score > best_score:
- best_score = score
- best_move = (row, col)
- return best_move
- def on_click(event):
- global current_player, game_over, board
- if not game_over and current_player == "X":
- row = event.y // cell_size
- col = event.x // cell_size
- if board[row][col] == "":
- board[row][col] = "X"
- board_canvas.create_text(col * cell_size + cell_size // 2, row * cell_size + cell_size // 2, text="X", font=("Helvetica", 40))
- if check_win(board, "X"):
- label.config(text="You win!")
- game_over = True
- elif is_full(board):
- label.config(text="It's a tie!")
- game_over = True
- else:
- current_player = "O"
- ai_move()
- def ai_move():
- global current_player, game_over, board
- if not game_over and current_player == "O":
- best_move = find_best_move(board)
- if best_move is not None:
- row, col = best_move
- board[row][col] = "O"
- board_canvas.create_text(col * cell_size + cell_size // 2, row * cell_size + cell_size // 2, text="O", font=("Helvetica", 40))
- if check_win(board, "O"):
- label.config(text="AI wins!")
- game_over = True
- elif is_full(board):
- label.config(text="It's a tie!")
- game_over = True
- else:
- current_player = "X"
- def start_game():
- global current_player, game_over, board
- board_canvas.delete("all")
- board_canvas.create_line(cell_size, 0, cell_size, canvas_height, fill="black", width=2)
- board_canvas.create_line(2 * cell_size, 0, 2 * cell_size, canvas_height, fill="black", width=2)
- board_canvas.create_line(0, cell_size, canvas_width, cell_size, fill="black", width=2)
- board_canvas.create_line(0, 2 * cell_size, canvas_width, 2 * cell_size, fill="black", width=2)
- board = [["" for _ in range(3)] for _ in range(3)]
- current_player = random.choice(["X", "O"])
- game_over = False
- if current_player == "O":
- ai_move()
- label.config(text=f"Player {current_player}'s turn")
- root = tk.Tk()
- root.title("Tic-Tac-Toe")
- canvas_width = 300
- canvas_height = 300
- cell_size = canvas_width // 3
- board_canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
- board_canvas.pack()
- start_button = tk.Button(root, text="Start New Game", command=start_game)
- start_button.pack()
- board = [["" for _ in range(3)] for _ in range(3)]
- current_player = "X"
- game_over = False
- board_canvas.bind("<Button-1>", on_click)
- label = tk.Label(root, text="", font=("Helvetica", 16))
- label.pack()
- start_game()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment