fork download
  1. # Tic-Tac-Toe with Minimax AI (GUI Version using tkinter)
  2.  
  3. import tkinter as tk
  4. from tkinter import messagebox
  5.  
  6. # Game logic functions (unchanged)
  7. def check_winner(board):
  8. lines = board + [list(col) for col in zip(*board)] + [
  9. [board[i][i] for i in range(3)],
  10. [board[i][2 - i] for i in range(3)]
  11. ]
  12. for line in lines:
  13. if line.count(line[0]) == 3 and line[0] != " ":
  14. return line[0]
  15. return None
  16.  
  17. def is_full(board):
  18. return all(cell != " " for row in board for cell in row)
  19.  
  20. def minimax(board, is_maximizing):
  21. winner = check_winner(board)
  22. if winner == "O":
  23. return 1
  24. elif winner == "X":
  25. return -1
  26. elif is_full(board):
  27. return 0
  28.  
  29. if is_maximizing:
  30. best_score = -float("inf")
  31. for i in range(3):
  32. for j in range(3):
  33. if board[i][j] == " ":
  34. board[i][j] = "O"
  35. score = minimax(board, False)
  36. board[i][j] = " "
  37. best_score = max(score, best_score)
  38. return best_score
  39. else:
  40. best_score = float("inf")
  41. for i in range(3):
  42. for j in range(3):
  43. if board[i][j] == " ":
  44. board[i][j] = "X"
  45. score = minimax(board, True)
  46. board[i][j] = " "
  47. best_score = min(score, best_score)
  48. return best_score
  49.  
  50. def best_move(board):
  51. best_score = -float("inf")
  52. move = None
  53. for i in range(3):
  54. for j in range(3):
  55. if board[i][j] == " ":
  56. board[i][j] = "O"
  57. score = minimax(board, False)
  58. board[i][j] = " "
  59. if score > best_score:
  60. best_score = score
  61. move = (i, j)
  62. return move
  63.  
  64. # GUI Part
  65. class TicTacToeGUI:
  66. def init(self, root):
  67. self.root = root
  68. self.root.title("Tic-Tac-Toe AI")
  69. self.board = [[" " for _ in range(3)] for _ in range(3)]
  70. self.buttons = [[None for _ in range(3)] for _ in range(3)]
  71. self.create_buttons()
  72.  
  73. def create_buttons(self):
  74. for i in range(3):
  75. for j in range(3):
  76. button = tk.Button(self.root, text=" ", width=5, height=2,
  77. font=('Arial', 24), command=lambda i=i, j=j: self.player_move(i, j))
  78. button.grid(row=i, column=j)
  79. self.buttons[i][j] = button
  80.  
  81. def player_move(self, i, j):
  82. if self.board[i][j] == " " and check_winner(self.board) is None:
  83. self.board[i][j] = "X"
  84. self.buttons[i][j].config(text="X")
  85. if self.check_game_over():
  86. return
  87. self.root.after(500, self.ai_move)
  88.  
  89. def ai_move(self):
  90. move = best_move(self.board)
  91. if move:
  92. i, j = move
  93. self.board[i][j] = "O"
  94. self.buttons[i][j].config(text="O")
  95. self.check_game_over()
  96.  
  97. def check_game_over(self):
  98. winner = check_winner(self.board)
  99. if winner:
  100. messagebox.showinfo("Game Over", f"{winner} wins!")
  101. self.root.quit()
  102. return True
  103. elif is_full(self.board):
  104. messagebox.showinfo("Game Over", "It's a draw!")
  105. self.root.quit()
  106. return True
  107. return False
  108.  
  109. if name == "main":
  110. root = tk.Tk()
  111. game = TicTacToeGUI(root)
  112. root.mainloop()
  113.  
Success #stdin #stdout 0.03s 25268KB
stdin
Standard input is empty
stdout
# 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()