import tkinter as tk
import random
import time

class ReactionTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("鼠标反应速度训练")
        self.root.geometry("900x650")

        # 游戏参数
        self.total_rounds = 10    # 总回合数
        self.current_round = 0
        self.score = 0            # 成功命中次数
        self.start_time = 0       # 当前圆点出现时间
        self.round_times = []     # 所有轮次耗时（包含点空白）
        self.success_times = []   # 仅保存命中的反应时间
        self.is_running = False   # 是否本轮等待点击

        # 顶部信息面板
        info_frame = tk.Frame(root)
        info_frame.pack(fill=tk.X, padx=10, pady=5)
        self.info_label = tk.Label(info_frame, text="点击【开始训练】", font=("微软雅黑",14))
        self.info_label.pack(side=tk.LEFT)

        self.result_label = tk.Label(info_frame, text="", font=("微软雅黑",14), fg="#d02020")
        self.result_label.pack(side=tk.RIGHT)

        # 画布区域（游戏区）
        self.canvas = tk.Canvas(root, bg="#f0f0f0")
        self.canvas.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        self.canvas.bind("<Button-1>", self.on_click)
        self.circle_id = None

        # 按钮区
        btn_frame = tk.Frame(root)
        btn_frame.pack(pady=6)
        self.start_btn = tk.Button(btn_frame, text="开始训练", command=self.start_game,
                                   font=("微软雅黑",12), width=12)
        self.start_btn.pack()

    def start_game(self):
        # 重置所有数据
        self.current_round = 0
        self.score = 0
        self.round_times.clear()
        self.success_times.clear()
        self.start_btn.config(state=tk.DISABLED)
        self.next_target()

    def next_target(self):
        self.current_round += 1
        if self.current_round > self.total_rounds:
            self.game_over()
            return

        # 清除旧圆点
        if self.circle_id:
            self.canvas.delete(self.circle_id)

        # 随机生成圆点
        w = self.canvas.winfo_width()
        h = self.canvas.winfo_height()
        r = 22
        x = random.randint(r+10, w - r -10)
        y = random.randint(r+10, h - r -10)

        self.circle_id = self.canvas.create_oval(x-r, y-r, x+r, y+r, fill="#e63946")
        self.start_time = time.time()
        self.is_running = True
        self.info_label.config(text=f"第 {self.current_round}/{self.total_rounds} 轮 → 点击红色圆点！")
        self.result_label.config(text="")

    def on_click(self, event):
        if not self.is_running:
            return
        
        react_time = time.time() - self.start_time
        self.round_times.append(react_time)
        self.is_running = False

        # 判断是否点中圆点
        items = self.canvas.find_closest(event.x, event.y)
        if items and items[0] == self.circle_id:
            self.score += 1
            self.success_times.append(react_time)
            self.result_label.config(text=f"命中！反应：{react_time:.3f} 秒")
        else:
            self.result_label.config(text=f"点空！耗时：{react_time:.3f} 秒", fg="#666666")

        # 短暂间隔进入下一轮
        self.root.after(450, self.next_target)

    def game_over(self):
        if self.circle_id:
            self.canvas.delete(self.circle_id)
        self.is_running = False
        self.start_btn.config(state=tk.NORMAL)

        if len(self.success_times) > 0:
            avg_success = sum(self.success_times) / len(self.success_times)
            text = (f"训练结束！命中{self.score}/{self.total_rounds} | "
                    f"有效平均反应 {avg_success:.3f} 秒")
        else:
            text = f"训练结束！命中{self.score}/{self.total_rounds}，无有效成绩"
        self.info_label.config(text=text)

if __name__ == "__main__":
    window = tk.Tk()
    app = ReactionTrainer(window)
    window.mainloop()