import sys
import os
import random  # 添加这行

# 检查是否有图形界面可用
try:
    import tkinter as tk
    from tkinter import messagebox
    HAS_GUI = True
except ImportError:
    HAS_GUI = False

# 检查是否在图形环境中
if HAS_GUI:
    try:
        root = tk.Tk()
        root.withdraw()
        root.destroy()
    except:
        HAS_GUI = False

if HAS_GUI:
    # GUI版本
    class TicTacToeGUI:
        def __init__(self, master):
            self.master = master
            master.title("井字棋 - 对战AI")
            master.geometry("400x520")
            master.resizable(False, False)
            
            self.board = [''] * 9
            self.current_player = 'X'
            self.game_over = False
            
            self.create_widgets()
        
        def create_widgets(self):
            # 标题
            title_frame = tk.Frame(self.master)
            title_frame.pack(pady=15)
            
            tk.Label(title_frame, text="井字棋", 
                    font=('Arial', 30, 'bold')).pack()
            
            self.info_label = tk.Label(title_frame, 
                                      text="你执 X，AI 执 O",
                                      font=('Arial', 12))
            self.info_label.pack()
            
            # 游戏棋盘
            board_frame = tk.Frame(self.master, bg='black')
            board_frame.pack(pady=25)
            
            self.buttons = []
            for i in range(3):
                row = []
                for j in range(3):
                    btn = tk.Button(board_frame, text='',
                                  font=('Arial', 40, 'bold'),
                                  width=3, height=1, 
                                  bg='white', relief='raised',
                                  command=lambda idx=i*3+j: self.player_move(idx))
                    btn.grid(row=i, column=j, padx=3, pady=3)
                    row.append(btn)
                self.buttons.append(row)
            
            # 控制按钮
            control_frame = tk.Frame(self.master)
            control_frame.pack(pady=15)
            
            tk.Button(control_frame, text="重新开始",
                     font=('Arial', 13), 
                     bg='lightblue',
                     command=self.restart_game).pack(side=tk.LEFT, padx=10)
            
            tk.Button(control_frame, text="退出游戏",
                     font=('Arial', 13),
                     bg='lightcoral',
                     command=self.master.quit).pack(side=tk.LEFT, padx=10)
            
            # 状态标签
            self.status_label = tk.Label(self.master,
                                        text="轮到你了！",
                                        font=('Arial', 18), 
                                        fg='blue')
            self.status_label.pack(pady=10)
        
        def player_move(self, index):
            """玩家移动"""
            if self.game_over:
                return
            
            if self.board[index] != '':
                messagebox.showwarning("无效操作", "这个位置已经被占了！")
                return
            
            if self.current_player != 'X':
                return
            
            # 执行玩家移动
            self.make_move(index, 'X')
            
            # 检查游戏是否结束
            if not self.game_over:
                self.current_player = 'O'
                self.status_label.config(text="AI思考中...")
                self.master.after(800, self.ai_move)
        
        def ai_move(self):
            """AI移动"""
            if self.game_over or self.current_player != 'O':
                return
            
            empty = [i for i in range(9) if self.board[i] == '']
            if not empty:
                return
            
            move = None
            
            # 1. 检查AI是否能赢
            for pos in empty:
                if self.check_winning_move(pos, 'O'):
                    move = pos
                    break
            
            # 2. 检查是否需要堵玩家
            if move is None:
                for pos in empty:
                    if self.check_winning_move(pos, 'X'):
                        move = pos
                        break
            
            # 3. 策略选择
            if move is None:
                # 优先中心
                if 4 in empty:
                    move = 4
                # 其次角落
                elif 0 in empty:
                    move = 0
                elif 2 in empty:
                    move = 2
                elif 6 in empty:
                    move = 6
                elif 8 in empty:
                    move = 8
                # 最后随机
                else:
                    move = random.choice(empty)
            
            # 执行AI移动
            self.make_move(move, 'O')
            self.current_player = 'X'
            
            if not self.game_over:
                self.status_label.config(text="轮到你了！")
        
        def check_winning_move(self, pos, player):
            """检查在pos下子是否能赢"""
            temp = self.board.copy()
            temp[pos] = player
            return self.check_winner(temp) == player
        
        def make_move(self, index, player):
            """执行移动"""
            self.board[index] = player
            r, c = index // 3, index % 3
            
            # 设置颜色
            color = '#FF6B6B' if player == 'X' else '#4ECDC4'
            self.buttons[r][c].config(text=player, 
                                     state='disabled',
                                     disabledforeground=color,
                                     bg='#F0F0F0')
            
            # 检查胜负
            winner = self.check_winner(self.board)
            if winner:
                self.game_over = True
                if winner == 'X':
                    msg = "🎉 恭喜你赢了！"
                    self.status_label.config(text=msg, fg='green')
                else:
                    msg = "🤖 AI赢了！"
                    self.status_label.config(text=msg, fg='red')
                messagebox.showinfo("游戏结束", msg)
                return
            
            # 检查平局
            if '' not in self.board:
                self.game_over = True
                self.status_label.config(text="🤝 平局！", fg='orange')
                messagebox.showinfo("游戏结束", "平局！")
        
        def check_winner(self, board):
            """检查胜者"""
            wins = [[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 w in wins:
                if board[w[0]] == board[w[1]] == board[w[2]] != '':
                    return board[w[0]]
            return None
        
        def restart_game(self):
            """重新开始"""
            self.board = [''] * 9
            self.current_player = 'X'
            self.game_over = False
            
            for i in range(3):
                for j in range(3):
                    self.buttons[i][j].config(text='', 
                                             state='normal', 
                                             bg='white')
            
            self.status_label.config(text="轮到你了！", fg='blue')
    
    def run_gui():
        root = tk.Tk()
        game = TicTacToeGUI(root)
        root.mainloop()
else:
    # CLI版本
    class TicTacToeCLI:
        def __init__(self):
            self.board = [' '] * 9
            self.current_player = 'X'
        
        def print_board(self):
            os.system('cls' if os.name == 'nt' else 'clear')
            print("\n=== 井字棋 - 对战AI ===")
            print("你执 X，AI 执 O\n")
            for i in range(3):
                row = self.board[i*3:(i+1)*3]
                print(f" {row[0]} | {row[1]} | {row[2]} ")
                if i < 2:
                    print("-----------")
            print("\n位置编号:")
            print(" 0 | 1 | 2 ")
            print("-----------")
            print(" 3 | 4 | 5 ")
            print("-----------")
            print(" 6 | 7 | 8 ")
        
        def check_winner(self, board=None):
            if board is None:
                board = self.board
            wins = [[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 w in wins:
                if board[w[0]] == board[w[1]] == board[w[2]] != ' ':
                    return board[w[0]]
            return None
        
        def check_winning_move(self, pos, player):
            temp = self.board.copy()
            temp[pos] = player
            return self.check_winner(temp) == player
        
        def ai_move(self):
            empty = [i for i in range(9) if self.board[i] == ' ']
            if not empty:
                return None
            
            for pos in empty:
                if self.check_winning_move(pos, 'O'):
                    return pos
            for pos in empty:
                if self.check_winning_move(pos, 'X'):
                    return pos
            
            if 4 in empty:
                return 4
            corners = [0, 2, 6, 8]
            available_corners = [c for c in corners if c in empty]
            if available_corners:
                return random.choice(available_corners)
            return random.choice(empty)
        
        def play(self):
            while True:
                self.print_board()
                
                winner = self.check_winner()
                if winner:
                    if winner == 'X':
                        print("\n🎉 恭喜你赢了！")
                    else:
                        print("\n🤖 AI赢了！")
                    break
                
                if ' ' not in self.board:
                    print("\n🤝 平局！")
                    break
                
                if self.current_player == 'X':
                    try:
                        move = int(input("\n请输入位置 (0-8): "))
                        if move < 0 or move > 8:
                            print("请输入0-8之间的数字！")
                            input("按回车继续...")
                            continue
                        if self.board[move] != ' ':
                            print("这个位置已经被占了！")
                            input("按回车继续...")
                            continue
                        
                        self.board[move] = 'X'
                        self.current_player = 'O'
                    except ValueError:
                        print("请输入有效的数字！")
                        input("按回车继续...")
                        continue
                else:
                    print("\nAI思考中...")
                    move = self.ai_move()
                    if move is not None:
                        self.board[move] = 'O'
                        self.current_player = 'X'
                    input("按回车继续...")
            
            if input("\n再来一局？(y/n): ").lower() == 'y':
                self.__init__()
                self.play()
            else:
                print("感谢游玩！再见！")
    
    def run_cli():
        game = TicTacToeCLI()
        game.play()

# 自动选择运行模式
if __name__ == "__main__":
    if HAS_GUI:
        print("检测到图形界面，启动GUI版本...")
        run_gui()
    else:
        print("未检测到图形界面，启动命令行版本...")
        run_cli()