import tkinter as tk
from tkinter import ttk, messagebox
import time
import random
import math
from datetime import datetime

# 主游戏类


class ClockMiniGame:
    def __init__(self, root):
        self.root = root
        self.root.title("⏰ 时钟小游戏")
        self.root.geometry("600x550")
        self.root.resizable(False, False)
        self.root.config(bg="#f0f8ff")

        # 游戏分数
        self.score = 0

        # 创建界面
        self.create_ui()
        # 启动时钟刷新
        self.update_clock()

    def create_ui(self):
        # 标题
        title = tk.Label(self.root, text="时钟小游戏", font=(
            "黑体", 28, "bold"), bg="#f0f8ff", fg="#2c3e50")
        title.pack(pady=15)

        # 数字时间显示
        self.time_label = tk.Label(self.root, font=(
            "Arial", 22), bg="#f0f8ff", fg="#e74c3c")
        self.time_label.pack(pady=5)

        # 画布（画时钟）
        self.canvas = tk.Canvas(self.root, width=400,
                                height=400, bg="white", highlightthickness=2)
        self.canvas.pack()

        # 分数
        self.score_label = tk.Label(
            self.root, text=f"分数：{self.score}", font=("黑体", 16), bg="#f0f8ff")
        self.score_label.pack(pady=5)

        # 按钮
        btn_frame = tk.Frame(self.root, bg="#f0f8ff")
        btn_frame.pack(pady=10)

        self.start_btn = tk.Button(btn_frame, text="开始猜时间", font=(
            "黑体", 14), bg="#3498db", fg="white", command=self.start_game)
        self.start_btn.grid(row=0, column=0, padx=10)

        self.reset_btn = tk.Button(btn_frame, text="重置", font=(
            "黑体", 14), bg="#95a5a6", fg="white", command=self.reset)
        self.reset_btn.grid(row=0, column=1, padx=10)

    # 绘制时钟表盘
    def draw_clock(self, hour, minute, second=0):
        self.canvas.delete("all")
        cx, cy = 200, 200
        r = 180

        # 外圈
        self.canvas.create_oval(cx-r, cy-r, cx+r, cy+r,
                                fill="#f8f9fa", outline="#2c3e50", width=4)

        # 刻度
        for i in range(60):
            angle = math.radians(i * 6)
            l = 15 if i % 5 == 0 else 5
            x1 = cx + (r - l) * math.sin(angle)
            y1 = cy - (r - l) * math.cos(angle)
            x2 = cx + r * math.sin(angle)
            y2 = cy - r * math.cos(angle)
            w = 2 if i % 5 == 0 else 1
            self.canvas.create_line(x1, y1, x2, y2, width=w)

        # 时针
        h_angle = math.radians((hour % 12) * 30 + minute * 0.5)
        self.canvas.create_line(cx, cy, cx+100*math.sin(h_angle),
                                cy-100*math.cos(h_angle), width=6, fill="#2c3e50")

        # 分针
        m_angle = math.radians(minute * 6)
        self.canvas.create_line(cx, cy, cx+140*math.sin(m_angle),
                                cy-140*math.cos(m_angle), width=4, fill="#3498db")

        # 秒针（正常模式才显示）
        if not self.playing:
            s_angle = math.radians(second * 6)
            self.canvas.create_line(
                cx, cy, cx+160*math.sin(s_angle), cy-160*math.cos(s_angle), width=2, fill="#e74c3c")

        # 中心圆点
        self.canvas.create_oval(cx-10, cy-10, cx+10, cy+10, fill="black")

    # 实时更新时间
    def update_clock(self):
        now = datetime.now()
        h, m, s = now.hour, now.minute, now.second
        self.time_label.config(text=f"{h:02d}:{m:02d}:{s:02d}")

        if not hasattr(self, "playing"):
            self.playing = False
        if not self.playing:
            self.draw_clock(h, m, s)

        self.root.after(1000, self.update_clock)

    # 开始游戏
    def start_game(self):
        self.playing = True
        self.target_h = random.randint(1, 12)
        self.target_m = random.choice([0, 15, 30, 45])  # 简单难度
        self.draw_clock(self.target_h, self.target_m)
        self.ask_answer()

    # 弹出答题框
    def ask_answer(self):
        win = tk.Toplevel()
        win.title("请猜时间")
        win.geometry("250x180")

        tk.Label(win, text="小时：", font=("黑体", 12)).pack(pady=5)
        h_entry = ttk.Entry(win, font=("黑体", 12))
        h_entry.pack()

        tk.Label(win, text="分钟：", font=("黑体", 12)).pack(pady=5)
        m_entry = ttk.Entry(win, font=("黑体", 12))
        m_entry.pack()

        def check():
            try:
                h = int(h_entry.get())
                m = int(m_entry.get())
            except:
                messagebox.showerror("错误", "请输入数字！")
                return

            if h == self.target_h and m == self.target_m:
                self.score += 10
                messagebox.showinfo("正确 ✅", f"恭喜你答对了！+10分")
            else:
                messagebox.showerror(
                    "错误 ❌", f"正确时间：{self.target_h:02d}:{self.target_m:02d}")

            self.score_label.config(text=f"分数：{self.score}")
            win.destroy()
            self.playing = False

        ttk.Button(win, text="提交", command=check).pack(pady=10)

    # 重置游戏
    def reset(self):
        self.score = 0
        self.playing = False
        self.score_label.config(text=f"分数：{self.score}")


# 运行
if __name__ == "__main__":
    main_win = tk.Tk()
    game = ClockMiniGame(main_win)
    main_win.mainloop()
