import tkinter as tk
from tkinter import ttk
import random

class ColorMatchingGame:
    def __init__(self, root):
        self.root = root
        self.root.title("🎨 配色练习")
        self.root.geometry("500x550")
        self.root.resizable(False, False)

        # 目标颜色
        self.target_r = 0
        self.target_g = 0
        self.target_b = 0

        # 界面布局
        self.build_ui()
        self.new_round()

    def build_ui(self):
        # 颜色展示区域
        color_frame = tk.Frame(self.root)
        color_frame.pack(pady=15)

        tk.Label(color_frame, text="目标颜色", font=("微软雅黑", 10)).grid(row=0, column=0, padx=20)
        tk.Label(color_frame, text="你的选择", font=("微软雅黑", 10)).grid(row=0, column=1, padx=20)

        self.target_canvas = tk.Canvas(color_frame, width=150, height=100, highlightthickness=2, highlightbackground="gray")
        self.target_canvas.grid(row=1, column=0, padx=10)

        self.user_canvas = tk.Canvas(color_frame, width=150, height=100, highlightthickness=2, highlightbackground="gray")
        self.user_canvas.grid(row=1, column=1, padx=10)

        # RGB 滑块
        slider_frame = tk.LabelFrame(self.root, text="调节 RGB 值", font=("微软雅黑", 10), padx=15, pady=10)
        slider_frame.pack(pady=10)

        self.r_var = tk.IntVar(value=128)
        self.g_var = tk.IntVar(value=128)
        self.b_var = tk.IntVar(value=128)

        tk.Label(slider_frame, text="R", fg="red", font=("微软雅黑", 10, "bold")).grid(row=0, column=0, padx=5)
        self.r_scale = tk.Scale(slider_frame, from_=0, to=255, orient=tk.HORIZONTAL, variable=self.r_var,
                                length=300, command=self.update_user_color)
        self.r_scale.grid(row=0, column=1)

        tk.Label(slider_frame, text="G", fg="green", font=("微软雅黑", 10, "bold")).grid(row=1, column=0, padx=5)
        self.g_scale = tk.Scale(slider_frame, from_=0, to=255, orient=tk.HORIZONTAL, variable=self.g_var,
                                length=300, command=self.update_user_color)
        self.g_scale.grid(row=1, column=1)

        tk.Label(slider_frame, text="B", fg="blue", font=("微软雅黑", 10, "bold")).grid(row=2, column=0, padx=5)
        self.b_scale = tk.Scale(slider_frame, from_=0, to=255, orient=tk.HORIZONTAL, variable=self.b_var,
                                length=300, command=self.update_user_color)
        self.b_scale.grid(row=2, column=1)

        # 当前颜色值显示
        self.color_label = tk.Label(self.root, text="", font=("Consolas", 11))
        self.color_label.pack()

        # 得分显示
        self.score_label = tk.Label(self.root, text="", font=("微软雅黑", 14, "bold"), fg="#333")
        self.score_label.pack(pady=5)

        # 按钮区域
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)

        tk.Button(btn_frame, text="✅ 提交答案", font=("微软雅黑", 10), command=self.check_answer,
                  bg="#4CAF50", fg="white", width=12).grid(row=0, column=0, padx=10)
        tk.Button(btn_frame, text="🔄 下一题", font=("微软雅黑", 10), command=self.new_round,
                  bg="#2196F3", fg="white", width=12).grid(row=0, column=1, padx=10)

    def update_user_color(self, event=None):
        r, g, b = self.r_var.get(), self.g_var.get(), self.b_var.get()
        color = f"#{r:02x}{g:02x}{b:02x}"
        self.user_canvas.configure(bg=color)
        self.color_label.configure(text=f"当前颜色: #{r:02X}{g:02X}{b:02X}  |  RGB({r}, {g}, {b})")

    def new_round(self):
        self.target_r = random.randint(0, 255)
        self.target_g = random.randint(0, 255)
        self.target_b = random.randint(0, 255)
        color = f"#{self.target_r:02x}{self.target_g:02x}{self.target_b:02x}"
        self.target_canvas.configure(bg=color)

        # 重置滑块
        self.r_var.set(128)
        self.g_var.set(128)
        self.b_var.set(128)
        self.update_user_color()

        self.score_label.configure(text="")

    def check_answer(self):
        r, g, b = self.r_var.get(), self.g_var.get(), self.b_var.get()

        # 计算颜色差异（欧氏距离）
        distance = ((r - self.target_r) ** 2 + (g - self.target_g) ** 2 + (b - self.target_b) ** 2) ** 0.5
        max_distance = (255 ** 2 * 3) ** 0.5  # 最大可能距离
        score = max(0, round((1 - distance / max_distance) * 100))

        # 显示得分
        if score >= 95:
            feedback = f"🎉 得分: {score}分 — 完美匹配！"
            self.score_label.configure(fg="#4CAF50")
        elif score >= 80:
            feedback = f"👍 得分: {score}分 — 非常接近！"
            self.score_label.configure(fg="#8BC34A")
        elif score >= 60:
            feedback = f"😊 得分: {score}分 — 还不错，继续加油！"
            self.score_label.configure(fg="#FF9800")
        else:
            feedback = f"💪 得分: {score}分 — 再试试看！"
            self.score_label.configure(fg="#F44336")

        self.score_label.configure(text=feedback)

if __name__ == "__main__":
    root = tk.Tk()
    game = ColorMatchingGame(root)
    root.mainloop()