import tkinter as tk
from tkinter import messagebox

class TicTacToeAI:
    def __init__(self, root):
        self.root = root
        self.root.title("井字棋 - AI对战")
        self.root.geometry("380x450")
        self.root.resizable(False, False)

        # 棋盘状态 0空 1玩家X 2AI O
        self.board = [0] * 9
        self.buttons = []
        self.game_over = False

        # 标题
        tk.Label(root, text="井字棋 你(X) VS AI(O)", font=("微软雅黑", 16, "bold")).pack(pady=10)

        # 棋盘框架
        board_frame = tk.Frame(root)
        board_frame.pack()
        for i in range(9):
            btn = tk.Button(
                board_frame,
                text="",
                font=("微软雅黑", 30, "bold"),
                width=4,
                height=2,
                command=lambda idx=i: self.player_move(idx)
            )
            btn.grid(row=i//3, column=i%3, padx=3, pady=3)
            self.buttons.append(btn)

        # 重置按钮
        tk.Button(
            root,
            text="重新开始",
            font=("微软雅黑", 12),
            command=self.reset_game
        ).pack(pady=20)

    # 玩家落子
    def player_move(self, idx):
        if self.game_over or self.board[idx] != 0:
            return
        # 玩家标记X
        self.board[idx] = 1
        self.buttons[idx].config(text="X", fg="#2266cc")
        # 判断玩家是否胜利
        if self.check_win(1):
            self.game_over = True
            messagebox.showinfo("游戏结束", "恭喜你赢了！")
            return
        # 判断平局
        if self.is_board_full():
            self.game_over = True
            messagebox.showinfo("游戏结束", "平局！")
            return
        # AI落子
        self.root.after(300, self.ai_move)

    # AI自动落子核心逻辑
    def ai_move(self):
        move = self.get_best_ai_pos()
        self.board[move] = 2
        self.buttons[move].config(text="O", fg="#dd2222")
        # AI胜利判断
        if self.check_win(2):
            self.game_over = True
            messagebox.showinfo("游戏结束", "AI获胜，你输啦！")
            return
        if self.is_board_full():
            self.game_over = True
            messagebox.showinfo("游戏结束", "平局！")

    # AI选位置策略
    def get_best_ai_pos(self):
        # 1. AI能一步赢，直接走
        for i in range(9):
            if self.board[i] == 0:
                self.board[i] = 2
                if self.check_win(2):
                    self.board[i] = 0
                    return i
                self.board[i] = 0
        # 2. 玩家下一步能赢，堵截
        for i in range(9):
            if self.board[i] == 0:
                self.board[i] = 1
                if self.check_win(1):
                    self.board[i] = 0
                    return i
                self.board[i] = 0
        # 3. 抢占中心
        if self.board[4] == 0:
            return 4
        # 4. 抢占四个角落
        corners = [0, 2, 6, 8]
        for pos in corners:
            if self.board[pos] == 0:
                return pos
        # 5. 剩下边线随便走
        edges = [1, 3, 5, 7]
        for pos in edges:
            if self.board[pos] == 0:
                return pos

    # 判断指定玩家是否胜利
    def check_win(self, player):
        win_lines = [
            [0,1,2], [3,4,5], [6,7,8], # 三行
            [0,3,6], [1,4,7], [2,5,8], # 三列
            [0,4,8], [2,4,6]           # 两条对角线
        ]
        for line in win_lines:
            a,b,c = line
            if self.board[a] == player and self.board[b] == player and self.board[c] == player:
                return True
        return False

    # 棋盘填满平局
    def is_board_full(self):
        return all(x != 0 for x in self.board)

    # 重置整局游戏
    def reset_game(self):
        self.board = [0]*9
        self.game_over = False
        for btn in self.buttons:
            btn.config(text="")

if __name__ == "__main__":
    win = tk.Tk()
    game = TicTacToeAI(win)
    win.mainloop()