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

class TypingPractice:
    def __init__(self, root):
        self.root = root
        self.root.title("打字练习软件")
        self.root.geometry("800x600")
        self.root.configure(bg="#f0f0f0")
        
        # 词库
        self.words = [
            "python", "programming", "computer", "keyboard", "typing",
            "practice", "speed", "accuracy", "developer", "algorithm",
            "database", "network", "software", "hardware", "internet",
            "function", "variable", "loop", "condition", "exception",
            "dictionary", "list", "string", "integer", "boolean",
            "class", "object", "method", "attribute", "inheritance"
        ]
        
        # 游戏状态
        self.current_word = ""
        self.score = 0
        self.total_attempts = 0
        self.correct_attempts = 0
        self.start_time = None
        self.is_running = False
        self.time_limit = 60  # 默认60秒
        self.remaining_time = 60
        
        # 创建UI
        self.create_widgets()
        
        # 开始新游戏
        self.new_game()
    
    def create_widgets(self):
        # 标题
        title_frame = tk.Frame(self.root, bg="#f0f0f0")
        title_frame.pack(pady=20)
        
        title_label = tk.Label(title_frame, text="⌨️ 打字练习", 
                               font=("Arial", 28, "bold"), 
                               fg="#2c3e50", bg="#f0f0f0")
        title_label.pack()
        
        # 统计信息
        stats_frame = tk.Frame(self.root, bg="#ffffff", relief=tk.RAISED, bd=2)
        stats_frame.pack(pady=10, padx=50, fill=tk.X)
        
        self.stats_labels = {}
        stats_info = [
            ("得分:", "score_label", "0"),
            ("正确率:", "accuracy_label", "100%"),
            ("速度:", "speed_label", "0 WPM"),
            ("时间:", "time_label", "60s")
        ]
        
        for i, (text, key, default) in enumerate(stats_info):
            frame = tk.Frame(stats_frame, bg="#ffffff")
            frame.grid(row=0, column=i, padx=20, pady=10)
            
            tk.Label(frame, text=text, font=("Arial", 12), 
                    fg="#7f8c8d", bg="#ffffff").pack(side=tk.LEFT)
            
            self.stats_labels[key] = tk.Label(frame, text=default, 
                                             font=("Arial", 14, "bold"), 
                                             fg="#2c3e50", bg="#ffffff")
            self.stats_labels[key].pack(side=tk.LEFT, padx=5)
        
        # 单词显示区域
        word_frame = tk.Frame(self.root, bg="#3498db", height=150, width=400)
        word_frame.pack_propagate(False)
        word_frame.pack(pady=30)
        
        self.word_display = tk.Label(word_frame, text="准备开始", 
                                     font=("Courier New", 36, "bold"), 
                                     fg="#ffffff", bg="#3498db")
        self.word_display.pack(expand=True)
        
        # 输入框
        input_frame = tk.Frame(self.root, bg="#f0f0f0")
        input_frame.pack(pady=20)
        
        self.input_entry = tk.Entry(input_frame, font=("Courier New", 24), 
                                   width=25, justify=tk.CENTER,
                                   relief=tk.SUNKEN, bd=3)
        self.input_entry.pack()
        self.input_entry.bind("<Return>", self.check_input)
        self.input_entry.bind("<KeyRelease>", self.on_key_release)
        
        # 按钮区域
        button_frame = tk.Frame(self.root, bg="#f0f0f0")
        button_frame.pack(pady=20)
        
        self.start_button = tk.Button(button_frame, text="开始练习", 
                                      command=self.start_game,
                                      font=("Arial", 16), bg="#2ecc71", 
                                      fg="white", padx=30, pady=10,
                                      cursor="hand2")
        self.start_button.pack(side=tk.LEFT, padx=10)
        
        reset_button = tk.Button(button_frame, text="重新开始", 
                                 command=self.reset_game,
                                 font=("Arial", 16), bg="#e74c3c", 
                                 fg="white", padx=30, pady=10,
                                 cursor="hand2")
        reset_button.pack(side=tk.LEFT, padx=10)
        
        # 难度选择
        difficulty_frame = tk.Frame(self.root, bg="#f0f0f0")
        difficulty_frame.pack(pady=10)
        
        tk.Label(difficulty_frame, text="难度选择:", 
                font=("Arial", 12), bg="#f0f0f0").pack(side=tk.LEFT, padx=10)
        
        self.difficulty_var = tk.StringVar(value="简单")
        difficulties = ["简单", "中等", "困难"]
        
        for diff in difficulties:
            tk.Radiobutton(difficulty_frame, text=diff, 
                          variable=self.difficulty_var, value=diff,
                          font=("Arial", 11), bg="#f0f0f0",
                          command=self.change_difficulty).pack(side=tk.LEFT, padx=10)
        
        # 进度条
        self.progress_bar = ttk.Progressbar(self.root, length=600, mode='determinate')
        self.progress_bar.pack(pady=20)
        
        # 反馈标签
        self.feedback_label = tk.Label(self.root, text="", 
                                       font=("Arial", 18), 
                                       bg="#f0f0f0")
        self.feedback_label.pack()
    
    def change_difficulty(self):
        difficulty = self.difficulty_var.get()
        if difficulty == "简单":
            self.time_limit = 90
        elif difficulty == "中等":
            self.time_limit = 45
        else:  # 困难
            self.time_limit = 15
        
        self.remaining_time = self.time_limit
        self.update_stats()
    
    def new_game(self):
        """开始新游戏"""
        self.score = 0
        self.total_attempts = 0
        self.correct_attempts = 0
        self.remaining_time = self.time_limit
        self.is_running = False
        
        self.input_entry.config(state=tk.DISABLED)
        self.start_button.config(text="开始练习")
        
        self.show_new_word()
        self.update_stats()
        self.progress_bar['value'] = 0
    
    def start_game(self):
        """开始游戏"""
        if not self.is_running:
            self.is_running = True
            self.start_time = time.time()
            self.input_entry.config(state=tk.NORMAL)
            self.input_entry.focus_set()
            self.start_button.config(text="进行中...", state=tk.DISABLED)
            
            # 启动计时器线程
            self.timer_thread = threading.Thread(target=self.countdown)
            self.timer_thread.daemon = True
            self.timer_thread.start()
    
    def countdown(self):
        """倒计时"""
        while self.remaining_time > 0 and self.is_running:
            time.sleep(1)
            self.remaining_time -= 1
            
            # 更新UI
            self.root.after(0, self.update_stats)
            self.root.after(0, self.update_progress)
        
        if self.remaining_time <= 0 and self.is_running:
            self.root.after(0, self.end_game)
    
    def update_progress(self):
        """更新进度条"""
        progress = ((self.time_limit - self.remaining_time) / self.time_limit) * 100
        self.progress_bar['value'] = progress
    
    def show_new_word(self):
        """显示新单词"""
        if self.difficulty_var.get() == "简单":
            word_list = [w for w in self.words if len(w) <= 5]
        elif self.difficulty_var.get() == "中等":
            word_list = [w for w in self.words if 5 < len(w) <= 8]
        else:
            word_list = [w for w in self.words if len(w) > 8]
        
        self.current_word = random.choice(word_list)
        self.word_display.config(text=self.current_word)
        self.input_entry.delete(0, tk.END)
    
    def check_input(self, event=None):
        """检查输入"""
        if not self.is_running:
            return
        
        user_input = self.input_entry.get().strip().lower()
        self.total_attempts += 1
        
        if user_input == self.current_word:
            self.correct_attempts += 1
            self.score += len(self.current_word) * 10
            self.feedback_label.config(text="✅ 正确！", fg="#27ae60")
            self.show_new_word()
        else:
            self.feedback_label.config(text=f"❌ 错误！正确答案: {self.current_word}", 
                                      fg="#e74c3c")
        
        self.update_stats()
    
    def on_key_release(self, event):
        """按键释放时的实时反馈"""
        if not self.is_running:
            return
        
        user_input = self.input_entry.get().strip().lower()
        if user_input == self.current_word[:len(user_input)]:
            self.input_entry.config(bg="#d4edda")  # 绿色背景表示正确
        else:
            self.input_entry.config(bg="#f8d7da")  # 红色背景表示错误
    
    def update_stats(self):
        """更新统计信息"""
        # 计算正确率
        if self.total_attempts > 0:
            accuracy = (self.correct_attempts / self.total_attempts) * 100
            accuracy_text = f"{accuracy:.1f}%"
        else:
            accuracy_text = "100%"
        
        # 计算速度 (WPM - Words Per Minute)
        elapsed_time = self.time_limit - self.remaining_time
        if elapsed_time > 0:
            speed = (self.correct_attempts / elapsed_time) * 60
            speed_text = f"{speed:.1f} WPM"
        else:
            speed_text = "0 WPM"
        
        # 更新时间显示
        minutes = self.remaining_time // 60
        seconds = self.remaining_time % 60
        time_text = f"{minutes:02d}:{seconds:02d}"
        
        # 更新标签
        self.stats_labels["score_label"].config(text=str(self.score))
        self.stats_labels["accuracy_label"].config(text=accuracy_text)
        self.stats_labels["speed_label"].config(text=speed_text)
        self.stats_labels["time_label"].config(text=time_text)
    
    def end_game(self):
        """结束游戏"""
        self.is_running = False
        self.input_entry.config(state=tk.DISABLED)
        self.start_button.config(text="开始练习", state=tk.NORMAL)
        
        # 显示结果
        result_message = f"""🎉 游戏结束！

📊 最终成绩：
• 得分：{self.score}
• 正确次数：{self.correct_attempts}/{self.total_attempts}
• 正确率：{(self.correct_attempts/self.total_attempts*100):.1f}%
• 速度：{(self.correct_attempts/(self.time_limit/60)):.1f} WPM"""
        
        messagebox.showinfo("游戏结束", result_message)
    
    def reset_game(self):
        """重置游戏"""
        self.is_running = False
        self.new_game()
        self.feedback_label.config(text="游戏已重置", fg="#3498db")

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

if __name__ == "__main__":
    main()