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

class MouseReactionTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("鼠标反应速度训练器")
        self.root.geometry("800x600")
        self.root.resizable(False, False)
        self.root.configure(bg="#f5f7fa")

        # 游戏核心参数
        self.game_running = False
        self.dot = None
        self.dot_x = 0
        self.dot_y = 0
        self.dot_size = 40  # 圆点大小

        # 计时与统计数据
        self.start_click_time = 0
        self.total_times = 0    # 总点击次数
        self.correct_times = 0  # 有效点击次数
        self.all_spend_time = 0 # 总耗时

        # 构建UI界面
        self.build_ui()

    def build_ui(self):
        # 顶部信息栏
        info_frame = tk.Frame(self.root, bg="#f5f7fa")
        info_frame.pack(pady=10, fill="x", padx=20)

        # 统计信息
        self.stat_text = tk.Label(
            info_frame, text="点击数：0 | 有效命中：0 | 平均反应时间：0.00s",
            font=("微软雅黑", 12), bg="#f5f7fa", fg="#333"
        )
        self.stat_text.pack(side=tk.LEFT, padx=20)

        # 倒计时/状态提示
        self.status_text = tk.Label(
            self.root, text="点击下方【开始训练】开启反应训练",
            font=("微软雅黑", 14, "bold"), bg="#f5f7fa", fg="#2E8B57"
        )
        self.status_text.pack(pady=5)

        # 训练画布（点击区域）
        self.canvas = tk.Canvas(self.root, width=760, height=450, bg="white", relief=tk.GROOVE, bd=2)
        self.canvas.pack(pady=15)
        self.canvas.bind("<Button-1>", self.canvas_click)

        # 功能按钮
        btn_frame = tk.Frame(self.root, bg="#f5f7fa")
        btn_frame.pack(pady=5)
        tk.Button(btn_frame, text="开始训练", command=self.start_game, font=("微软雅黑", 12),
                  bg="#2E8B57", fg="white", width=12).grid(row=0, column=0, padx=10)
        tk.Button(btn_frame, text="结束训练", command=self.stop_game, font=("微软雅黑", 12),
                  bg="#FF4500", fg="white", width=12).grid(row=0, column=1, padx=10)
        tk.Button(btn_frame, text="重置数据", command=self.reset_data, font=("微软雅黑", 12),
                  bg="#4a6cf7", fg="white", width=12).grid(row=0, column=2, padx=10)

    # 随机生成圆点
    def create_random_dot(self):
        # 清除旧圆点
        self.canvas.delete("all")

        # 随机坐标（预留边距，防止出界）
        max_x = 760 - self.dot_size
        max_y = 450 - self.dot_size
        self.dot_x = random.randint(20, max_x - 20)
        self.dot_y = random.randint(20, max_y - 20)

        # 绘制圆形
        self.dot = self.canvas.create_oval(
            self.dot_x, self.dot_y,
            self.dot_x + self.dot_size, self.dot_y + self.dot_size,
            fill="#FF6347", outline="#FF4500", width=2
        )
        # 记录生成时间（开始计时）
        self.start_click_time = time.time()
        self.status_text.config(text="快速点击红色圆点！", fg="#FF4500")

    # 画布点击事件
    def canvas_click(self, event):
        if not self.game_running or not self.dot:
            return

        self.total_times += 1
        click_x = event.x
        click_y = event.y

        # 判断是否点击到圆点
        if self.dot_x <= click_x <= self.dot_x + self.dot_size and self.dot_y <= click_y <= self.dot_y + self.dot_size:
            # 点击命中
            spend = time.time() - self.start_click_time
            self.correct_times += 1
            self.all_spend_time += spend

            # 更新状态
            self.status_text.config(text=f"命中！本次反应耗时：{spend:.2f}秒", fg="#2E8B57")
            self.update_stat()

            # 短暂延迟后生成下一个圆点
            self.root.after(350, self.create_random_dot)
        else:
            # 点击失误
            self.status_text.config(text="点击失误！未命中圆点", fg="#999999")
            self.update_stat()

    # 更新统计数据
    def update_stat(self):
        if self.correct_times == 0:
            avg = 0.00
        else:
            avg = self.all_spend_time / self.correct_times
        self.stat_text.config(
            text=f"总点击：{self.total_times} | 有效命中：{self.correct_times} | 平均反应：{avg:.2f}s"
        )

    # 开始训练
    def start_game(self):
        if self.game_running:
            messagebox.showwarning("提示", "训练正在进行中！")
            return
        self.game_running = True
        self.create_random_dot()

    # 结束训练
    def stop_game(self):
        if not self.game_running:
            return
        self.game_running = False
        self.canvas.delete("all")

        # 计算最终数据
        if self.correct_times > 0:
            avg_time = self.all_spend_time / self.correct_times
            accuracy = (self.correct_times / self.total_times * 100) if self.total_times > 0 else 0
            msg = f"训练结束！\n有效命中：{self.correct_times} 次\n总点击：{self.total_times} 次\n命中率：{accuracy:.2f}%\n平均反应速度：{avg_time:.2f} 秒"
            messagebox.showinfo("训练成绩", msg)
        else:
            messagebox.showinfo("提示", "本次无有效点击记录！")

        self.status_text.config(text="训练已结束，点击开始训练重新挑战", fg="#666")

    # 重置所有数据
    def reset_data(self):
        self.game_running = False
        self.canvas.delete("all")
        self.total_times = 0
        self.correct_times = 0
        self.all_spend_time = 0
        self.dot = None
        self.update_stat()
        self.status_text.config(text="数据已重置，随时开始训练", fg="#2E8B57")

if __name__ == "__main__":
    root = tk.Tk()
    app = MouseReactionTrainer(root)
    root.mainloop()
