import tkinter as tk
from tkinter import messagebox, ttk
import random
import time

class MathTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("口算训练器")
        self.root.geometry("500x600")
        
        # 游戏变量
        self.score = 0
        self.total_questions = 0
        self.current_answer = 0
        self.time_left = 60
        self.timer_running = False
        
        # 设置样式
        self.setup_styles()
        
        # 创建界面
        self.create_widgets()
        
        # 生成第一道题
        self.new_question()
    
    def setup_styles(self):
        """设置界面样式"""
        style = ttk.Style()
        style.configure('Title.TLabel', font=('Arial', 16, 'bold'))
        style.configure('Question.TLabel', font=('Arial', 24, 'bold'))
        style.configure('Score.TLabel', font=('Arial', 12))
        style.configure('Timer.TLabel', font=('Arial', 14, 'bold'))
    
    def create_widgets(self):
        """创建界面组件"""
        # 标题
        title_label = ttk.Label(self.root, text="🧮 口算训练器", style='Title.TLabel')
        title_label.pack(pady=20)
        
        # 分数和时间显示
        info_frame = ttk.Frame(self.root)
        info_frame.pack(pady=10)
        
        self.score_label = ttk.Label(info_frame, text="得分: 0", style='Score.TLabel')
        self.score_label.pack(side=tk.LEFT, padx=20)
        
        self.timer_label = ttk.Label(info_frame, text="⏱️ 60秒", style='Timer.TLabel')
        self.timer_label.pack(side=tk.RIGHT, padx=20)
        
        # 题目显示区域
        question_frame = ttk.Frame(self.root, relief="solid", borderwidth=2)
        question_frame.pack(pady=30, padx=40, fill=tk.X)
        
        self.question_label = ttk.Label(question_frame, text="", style='Question.TLabel')
        self.question_label.pack(pady=30)
        
        # 输入区域
        input_frame = ttk.Frame(self.root)
        input_frame.pack(pady=20)
        
        self.answer_entry = ttk.Entry(input_frame, font=('Arial', 18), width=15)
        self.answer_entry.pack(side=tk.LEFT, padx=5)
        self.answer_entry.bind('<Return>', self.check_answer)
        
        submit_btn = ttk.Button(input_frame, text="提交答案", command=self.check_answer)
        submit_btn.pack(side=tk.LEFT, padx=5)
        
        # 控制按钮
        control_frame = ttk.Frame(self.root)
        control_frame.pack(pady=20)
        
        self.start_btn = ttk.Button(control_frame, text="开始计时", command=self.start_timer)
        self.start_btn.pack(side=tk.LEFT, padx=5)
        
        new_btn = ttk.Button(control_frame, text="下一题", command=self.new_question)
        new_btn.pack(side=tk.LEFT, padx=5)
        
        reset_btn = ttk.Button(control_frame, text="重新开始", command=self.reset_game)
        reset_btn.pack(side=tk.LEFT, padx=5)
        
        # 统计信息
        stats_frame = ttk.LabelFrame(self.root, text="统计信息", padding=10)
        stats_frame.pack(pady=20, padx=40, fill=tk.X)
        
        self.stats_label = ttk.Label(stats_frame, text="正确率: 0%", font=('Arial', 11))
        self.stats_label.pack()
        
        # 难度选择
        difficulty_frame = ttk.Frame(self.root)
        difficulty_frame.pack(pady=10)
        
        ttk.Label(difficulty_frame, text="难度:").pack(side=tk.LEFT, padx=5)
        
        self.difficulty_var = tk.StringVar(value="简单")
        difficulties = ["简单", "中等", "困难"]
        for diff in difficulties:
            rb = ttk.Radiobutton(difficulty_frame, text=diff, variable=self.difficulty_var, value=diff)
            rb.pack(side=tk.LEFT, padx=5)
    
    def new_question(self):
        """生成新题目"""
        difficulty = self.difficulty_var.get()
        
        if difficulty == "简单":
            max_num = 10
            operations = ['+', '-']
        elif difficulty == "中等":
            max_num = 50
            operations = ['+', '-', '*']
        else:  # 困难
            max_num = 100
            operations = ['+', '-', '*', '/']
        
        operation = random.choice(operations)
        
        if operation == '+':
            a = random.randint(1, max_num)
            b = random.randint(1, max_num)
            self.current_answer = a + b
            question = f"{a} + {b} = ?"
        
        elif operation == '-':
            a = random.randint(1, max_num)
            b = random.randint(1, a)  # 确保结果为正数
            self.current_answer = a - b
            question = f"{a} - {b} = ?"
        
        elif operation == '*':
            a = random.randint(1, min(max_num // 2, 9))
            b = random.randint(1, min(max_num // 2, 9))
            self.current_answer = a * b
            question = f"{a} × {b} = ?"
        
        else:  # 除法
            b = random.randint(1, min(max_num // 2, 9))
            result = random.randint(1, min(max_num // 2, 9))
            a = b * result
            self.current_answer = result
            question = f"{a} ÷ {b} = ?"
        
        self.question_label.config(text=question)
        self.answer_entry.delete(0, tk.END)
        self.answer_entry.focus()
    
    def check_answer(self, event=None):
        """检查答案"""
        try:
            user_answer = float(self.answer_entry.get())
            
            if abs(user_answer - self.current_answer) < 0.01:
                self.score += 10
                messagebox.showinfo("正确！", "🎉 回答正确！+10分")
            else:
                messagebox.showerror("错误", f"❌ 正确答案是: {self.current_answer}")
            
            self.total_questions += 1
            self.update_stats()
            
            if self.timer_running:
                self.new_question()
                
        except ValueError:
            messagebox.showwarning("输入错误", "请输入有效的数字")
    
    def start_timer(self):
        """开始倒计时"""
        if not self.timer_running:
            self.timer_running = True
            self.time_left = 61
            self.start_btn.config(state="disabled")
            self.countdown()
    
    def countdown(self):
        """倒计时"""
        if self.time_left > 0 and self.timer_running:
            self.time_left -= 1
            self.timer_label.config(text=f"⏱️ {self.time_left}秒")
            self.root.after(1000, self.countdown)
        elif self.time_left <= 0:
            self.end_game()
    
    def end_game(self):
        """结束游戏"""
        self.timer_running = False
        self.start_btn.config(state="normal")
        
        accuracy = (self.score / (self.total_questions * 10)) * 100 if self.total_questions > 0 else 0
        
        message = f"时间到！\n\n总题数: {self.total_questions}\n最终得分: {self.score}\n正确率: {accuracy:.1f}%"
        
        if accuracy >= 90:
            message += "\n\n评价: 🏆 太厉害了！"
        elif accuracy >= 70:
            message += "\n\n评价: 👍 表现不错！"
        elif accuracy >= 50:
            message += "\n\n评价: 💪 继续加油！"
        else:
            message += "\n\n评价: 📚 需要多加练习！"
        
        messagebox.showinfo("游戏结束", message)
    
    def update_stats(self):
        """更新统计信息"""
        self.score_label.config(text=f"得分: {self.score}")
        accuracy = (self.score / (self.total_questions * 10)) * 100 if self.total_questions > 0 else 0
        self.stats_label.config(text=f"正确率: {accuracy:.1f}%")
    
    def reset_game(self):
        """重置游戏"""
        self.score = 0
        self.total_questions = 0
        self.time_left = 60
        self.timer_running = False
        self.start_btn.config(state="normal")
        
        self.score_label.config(text="得分: 0")
        self.timer_label.config(text="⏱️ 60秒")
        self.stats_label.config(text="正确率: 0%")
        
        self.new_question()

def main():
    root = tk.Tk()
    app = MathTrainer(root)
    root.mainloop()

if __name__ == "__main__":
    main()