# Tic-Tac-Toe with Minimax AI (GUI Version using tkinter)
import tkinter as tk
from tkinter import messagebox
# Game logic functions (unchanged)
def check_winner(board):
lines = board + [list(col) for col in zip(*board)] + [
[board[i][i] for i in range(3)],
[board[i][2 - i] for i in range(3)]
]
for line in lines:
if line.count(line[0]) == 3 and line[0] != " ":
return line[0]
return None
def is_full(board):
return all(cell != " " for row in board for cell in row)
def minimax(board, is_maximizing):
winner = check_winner(board)
if winner == "O":
return 1
elif winner == "X":
return -1
elif is_full(board):
return 0
if is_maximizing:
best_score = -float("inf")
for i in range(3):
for j in range(3):
if board[i][j] == " ":
board[i][j] = "O"
score = minimax(board, False)
board[i][j] = " "
best_score = max(score, best_score)
return best_score
else:
best_score = float("inf")
for i in range(3):
for j in range(3):
if board[i][j] == " ":
board[i][j] = "X"
score = minimax(board, True)
board[i][j] = " "
best_score = min(score, best_score)
return best_score
def best_move(board):
best_score = -float("inf")
move = None
for i in range(3):
for j in range(3):
if board[i][j] == " ":
board[i][j] = "O"
score = minimax(board, False)
board[i][j] = " "
if score > best_score:
best_score = score
move = (i, j)
return move
# GUI Part
class TicTacToeGUI:
def init(self, root):
self.root = root
self.root.title("Tic-Tac-Toe AI")
self.board = [[" " for _ in range(3)] for _ in range(3)]
self.buttons = [[None for _ in range(3)] for _ in range(3)]
self.create_buttons()
def create_buttons(self):
for i in range(3):
for j in range(3):
button = tk.Button(self.root, text=" ", width=5, height=2,
font=('Arial', 24), command=lambda i=i, j=j: self.player_move(i, j))
button.grid(row=i, column=j)
self.buttons[i][j] = button
def player_move(self, i, j):
if self.board[i][j] == " " and check_winner(self.board) is None:
self.board[i][j] = "X"
self.buttons[i][j].config(text="X")
if self.check_game_over():
return
self.root.after(500, self.ai_move)
def ai_move(self):
move = best_move(self.board)
if move:
i, j = move
self.board[i][j] = "O"
self.buttons[i][j].config(text="O")
self.check_game_over()
def check_game_over(self):
winner = check_winner(self.board)
if winner:
messagebox.showinfo("Game Over", f"{winner} wins!")
self.root.quit()
return True
elif is_full(self.board):
messagebox.showinfo("Game Over", "It's a draw!")
self.root.quit()
return True
return False
if name == "main":
root = tk.Tk()
game = TicTacToeGUI(root)
root.mainloop()