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

# ========================
# 全局配置
# ========================
WIDTH, HEIGHT = 800, 560

# ========================
# 主题
# ========================
THEMES = {
    "🌸 樱花粉": {"bg": "#FFF0F5", "fg": "#C2185B", "panel": "#FCE4EC", "btn": "#F48FB1", "accent": "#E91E63", "card": "#FFF9FC", "hint": "#F06292", "ans": "#AD1457"},
    "💙 天空蓝": {"bg": "#E3F2FD", "fg": "#0D47A1", "panel": "#BBDEFB", "btn": "#42A5F5", "accent": "#1565C0", "card": "#F0F8FF", "hint": "#1E88E5", "ans": "#0D47A1"},
    "💚 抹茶绿": {"bg": "#E8F5E9", "fg": "#1B5E20", "panel": "#C8E6C9", "btn": "#66BB6A", "accent": "#2E7D32", "card": "#F5FFF5", "hint": "#43A047", "ans": "#1B5E20"},
    "🧡 蜜桔橙": {"bg": "#FFF3E0", "fg": "#E65100", "panel": "#FFE0B2", "btn": "#FF9800", "accent": "#EF6C00", "card": "#FFF8F0", "hint": "#F57C00", "ans": "#BF360C"},
    "💜 梦幻紫": {"bg": "#F3E5F5", "fg": "#4A148C", "panel": "#E1BEE7", "btn": "#AB47BC", "accent": "#7B1FA2", "card": "#FBF0FF", "hint": "#8E24AA", "ans": "#4A148C"},
    "🖤 暗夜谜局": {"bg": "#1a1a2e", "fg": "#E0E0E0", "panel": "#16213E", "btn": "#533483", "accent": "#E94560", "card": "#0F3460", "hint": "#9D4EDD", "ans": "#FF6B6B"},
}
cur_theme = "🌸 樱花粉"

# ========================
# 谜语题库
# ========================
RIDDLES = [
    {"q": "千条线，万条线，掉到水里看不见。", "a": ["雨", "雨水", "下雨"], "hint": "从天上掉下来的", "cat": "自然"},
    {"q": "有头没有颈，身上冷冰冰，有翅不能飞，无脚也能行。", "a": ["鱼", "金鱼", "鲤鱼"], "hint": "生活在水里", "cat": "动物"},
    {"q": "一个老头，不跑不走；请他睡觉，他就摇头。", "a": ["不倒翁", "不倒翁玩具"], "hint": "一种玩具", "cat": "物品"},
    {"q": "白天不见，晚上才现，没它不亮，人人喜欢。", "a": ["星星", "星"], "hint": "天上闪闪发光的", "cat": "自然"},
    {"q": "兄弟几个人，各进一道门，那个进错了，看了笑死人。", "a": ["纽扣", "扣子", "衣服扣子"], "hint": "衣服上的东西", "cat": "物品"},
    {"q": "小白加小白等于什么？", "a": ["小白兔", "小白two", "two白"], "hint": "谐音梗 🐰", "cat": "脑筋急转弯"},
    {"q": "什么东西越洗越脏？", "a": ["水", "清水"], "hint": "用来洗别的东西的", "cat": "脑筋急转弯"},
    {"q": "什么东西有五个头，但人不觉得它怪？", "a": ["手", "脚", "手掌", "脚掌"], "hint": "你身上就有", "cat": "脑筋急转弯"},
    {"q": "什么东西越用越有钱？", "a": ["存钱罐", "扑满", "储蓄罐"], "hint": "放硬币的小罐子", "cat": "物品"},
    {"q": "什么东西嘴里没有舌头？", "a": ["茶壶", "水壶", "壶"], "hint": "厨房里烧水的", "cat": "物品"},
    {"q": "什么东西明明是你的，别人却用得比你多？", "a": ["名字", "你的名字"], "hint": "别人叫你用的", "cat": "脑筋急转弯"},
    {"q": "什么东西天气越热它爬得越高？", "a": ["温度计", "温度"], "hint": "医院里也常用", "cat": "物品"},
    {"q": "什么东西没吃的时候是绿的，吃的时候是红的，吐出来的是黑的？", "a": ["西瓜", "西瓜籽"], "hint": "夏天最爱吃的水果", "cat": "食物"},
    {"q": "什么东西有腿却不能走路？", "a": ["桌子", "椅子", "凳子"], "hint": "家具", "cat": "物品"},
    {"q": "什么东西越擦越小？", "a": ["橡皮擦", "橡皮", "铅笔"], "hint": "写错字用的", "cat": "文具"},
    {"q": "什么东西有嘴不说话？", "a": ["茶壶", "水壶"], "hint": "有壶嘴的", "cat": "物品"},
    {"q": "什么东西越用越亮？", "a": ["刀", "剪刀", "斧头"], "hint": "磨出来的", "cat": "工具"},
    {"q": "什么东西见者有份？", "a": ["阳光", "光", "影子"], "hint": "每个人都有的", "cat": "自然"},
    {"q": "什么东西有眼无珠？", "a": ["针", "缝衣针"], "hint": "穿线用的", "cat": "物品"},
    {"q": "什么东西人人都见过，但从来没人能抓住它？", "a": ["风", "影子", "时间"], "hint": "看不见摸不着", "cat": "自然"},
    {"q": "什么东西你用它的时候它就在变小？", "a": ["蜡烛", "铅笔", "香"], "hint": "点燃的那种", "cat": "物品"},
    {"q": "什么东西越剪越大？", "a": ["洞", "窟窿"], "hint": "衣服破了就会", "cat": "脑筋急转弯"},
    {"q": "什么东西有四条腿和一个背，但不能走路？", "a": ["桌子", "椅子"], "hint": "坐在上面的", "cat": "物品"},
    {"q": "什么东西早上四条腿，中午两条腿，晚上三条腿？", "a": ["人", "人类"], "hint": "斯芬克斯之谜", "cat": "经典"},
    {"q": "什么东西越分享越多？", "a": ["快乐", "知识", "爱"], "hint": "美好的东西", "cat": "脑筋急转弯"},
    {"q": "什么东西永远关不上？", "a": ["年龄", "年纪"], "hint": "只增不减", "cat": "脑筋急转弯"},
    {"q": "什么东西嘴里没有牙齿？", "a": ["剪刀", "钳子"], "hint": "铁做的\"嘴\"", "cat": "工具"},
    {"q": "什么东西越削越矮？", "a": ["铅笔", "蜡烛"], "hint": "写字用的", "cat": "文具"},
    {"q": "什么东西最喜欢咬文嚼字？", "a": ["书虫", "蛀虫"], "hint": "书本里的", "cat": "动物"},
    {"q": "什么东西买了没人想吃？", "a": ["亏", "苦"], "hint": "不是真的食物", "cat": "脑筋急转弯"},
    {"q": "什么东西，打破了才能吃？", "a": ["鸡蛋", "蛋", "核桃"], "hint": "鸡生的", "cat": "食物"},
    {"q": "什么东西，载得动一百捆干草却托不起一粒沙子？", "a": ["河水", "水", "江水"], "hint": "往低处流的", "cat": "自然"},
    {"q": "什么东西，有风不动无风动？", "a": ["扇子", "折扇"], "hint": "夏天用来扇风的", "cat": "物品"},
    {"q": "什么东西，越洗越脏，不洗有人吃，洗了没人吃？", "a": ["水"], "hint": "万物之源", "cat": "自然"},
    {"q": "什么东西，明明是你的，别人却用得比你多？", "a": ["名字"], "hint": "别人叫你时用", "cat": "脑筋急转弯"},
    {"q": "什么东西，吃之前是绿的，吃的时候是红的，吐出来是黑的？", "a": ["西瓜"], "hint": "夏天必备", "cat": "食物"},
    {"q": "什么东西，有脚不会走，有脸不会笑？", "a": ["闹钟", "钟表", "表"], "hint": "看时间的", "cat": "物品"},
    {"q": "什么东西，旧的东西不值钱，新的东西更不值钱？", "a": ["破烂", "垃圾"], "hint": "要扔掉的", "cat": "脑筋急转弯"},
    {"q": "什么东西，天不知地知，你不知我知？", "a": ["鞋底破洞", "鞋底"], "hint": "在脚底下", "cat": "脑筋急转弯"},
    {"q": "什么东西，可以举起万吨重物却举不起一粒沙子？", "a": ["水", "海水"], "hint": "浮力原理", "cat": "自然"},
    {"q": "什么东西，一个人用正好，两个人用也行，三个人用就挤？", "a": ["雨伞", "伞"], "hint": "挡雨的", "cat": "物品"},
    {"q": "什么东西，越热越爱出来？", "a": ["汗", "汗水"], "hint": "从皮肤里出来的", "cat": "身体"},
    {"q": "什么东西，先穿鞋再穿袜子？", "a": ["钉子", "铁钉"], "hint": "敲进鞋里的", "cat": "脑筋急转弯"},
    {"q": "什么东西，能载万吨货却载不动一粒米？", "a": ["水", "大海"], "hint": "无边无际的", "cat": "自然"},
    {"q": "什么东西，人人都有，但谁也没见过自己的？", "a": ["背影", "后脑勺"], "hint": "除非照镜子", "cat": "身体"},
    {"q": "什么东西，你拥有的越多，反而越穷？", "a": ["债务", "债", "欠款"], "hint": "欠别人的", "cat": "脑筋急转弯"},
    {"q": "什么东西，打破了才能用？", "a": ["鸡蛋", "蛋", "核桃", "竹子"], "hint": "竹子的话是编东西", "cat": "食物"},
    {"q": "什么东西，每天要吞下几百吨食物却从不消化？", "a": ["大海", "海洋"], "hint": "咸的", "cat": "自然"},
]

# ========================
# 游戏状态
# ========================
current_riddle = None
showing_answer = False
score = 0
streak = 0
total_answered = 0
correct_count = 0
used_indexes = []
current_category = "全部"
hints_used = 0

# ========================
# UI 引用
# ========================
root = None
canvas = None
lbl_score = None
lbl_streak = None
lbl_accuracy = None
lbl_question = None
lbl_hint = None
lbl_answer = None
lbl_feedback = None
lbl_category = None
entry_guess = None
theme_btns = []
cat_btns = {}
all_widgets = []
log_lines = []

# ========================
# 工具函数
# ========================
def get_text_color(hex_str):
    h = hex_str.lstrip("#")
    try:
        r, g, b = [int(h[i:i+2], 16) for i in (0, 2, 4)]
    except:
        return "#FFFFFF"
    bright = 0.299*r + 0.587*g + 0.114*b
    return "#FFFFFF" if bright < 140 else "#212121"

def normalize(s):
    """标准化答案用于比对"""
    return s.strip().lower().replace(" ", "").replace("的", "")

def check_answer(guess):
    """判断答案是否正确"""
    if not current_riddle:
        return False
    guess_n = normalize(guess)
    for ans in current_riddle["a"]:
        if guess_n == normalize(ans) or guess_n in normalize(ans) or normalize(ans) in guess_n:
            return True
    return False

# ========================
# 核心逻辑
# ========================
def get_next_riddle():
    """获取下一题"""
    global used_indexes, current_category
    
    pool = list(range(len(RIDDLES)))
    if current_category != "全部":
        pool = [i for i in pool if RIDDLES[i]["cat"] == current_category]
    
    # 过滤已用
    available = [i for i in pool if i not in used_indexes]
    if not available:
        used_indexes = []  # 重置
        available = pool
    
    idx = random.choice(available)
    used_indexes.append(idx)
    return RIDDLES[idx], idx

def new_question():
    """出新题"""
    global current_riddle, showing_answer, hints_used
    riddle, idx = get_next_riddle()
    current_riddle = riddle
    showing_answer = False
    hints_used = 0
    
    t = THEMES[cur_theme]
    lbl_question.config(text=riddle["q"], fg=t["fg"])
    lbl_hint.config(text="💡 点击「提示」获取线索", fg=t["hint"])
    lbl_answer.config(text="", fg=t["ans"])
    lbl_feedback.config(text="🤔 开动脑筋想一想~", fg=t["accent"])
    entry_guess.delete(0, "end")
    entry_guess.focus_set()
    
    log_msg(f"📝 新题 [{riddle['cat']}]: {riddle['q'][:20]}...")

def show_hint():
    """显示提示"""
    global hints_used
    if not current_riddle:
        return
    
    hints_used += 1
    t = THEMES[cur_theme]
    
    if hints_used == 1:
        lbl_hint.config(text=f"💡 提示1: {current_riddle['hint']}", fg=t["hint"])
        log_msg("💡 使用提示1")
    elif hints_used == 2:
        ans = current_riddle["a"][0]
        # 显示字数
        lbl_hint.config(text=f"💡 提示2: 答案共 {len(ans)} 个字", fg=t["hint"])
        log_msg("💡 使用提示2")
    elif hints_used == 3:
        ans = current_riddle["a"][0]
        # 显示首字
        lbl_hint.config(text=f"💡 提示3: 首字是「{ans[0]}」", fg=t["hint"])
        log_msg("💡 使用提示3")
    else:
        messagebox.showinfo("提示", "没有更多提示了，再想想吧~")

def submit_guess():
    """提交答案"""
    global score, streak, total_answered, correct_count
    
    if not current_riddle or showing_answer:
        return
    
    guess = entry_guess.get().strip()
    if not guess:
        lbl_feedback.config(text="⚠️ 请输入你的答案！")
        return
    
    total_answered += 1
    
    if check_answer(guess):
        correct_count += 1
        streak += 1
        # 计分：基础10 + 连击加成 + 未用提示奖励
        hint_penalty = (hints_used - 1) * 2 if hints_used > 0 else 0
        points = max(5, 10 + streak * 2 - hint_penalty)
        score += points
        
        lbl_feedback.config(text=f"🎉 正确！+{points}分 | 连对{streak}题！", fg=THEMES[cur_theme]["accent"])
        log_msg(f"✅ 答对: {guess} (+{points}分)")
        
        # 显示答案
        ans_text = " / ".join(current_riddle["a"][:3])
        lbl_answer.config(text=f"✅ 答案: {ans_text}")
        
        # 2秒后下一题
        root.after(2000, new_question)
    else:
        streak = 0
        lbl_feedback.config(text=f"❌ 不对哦~ 再想想？", fg=THEMES[cur_theme]["ans"])
        log_msg(f"❌ 答错: {guess}")
    
    update_display()
    entry_guess.delete(0, "end")

def show_answer_now():
    """直接看答案"""
    global streak, showing_answer
    if not current_riddle or showing_answer:
        return
    
    streak = 0
    showing_answer = True
    ans_text = " / ".join(current_riddle["a"][:3])
    lbl_answer.config(text=f"📖 答案: {ans_text}", fg=THEMES[cur_theme]["ans"])
    lbl_feedback.config(text="📖 已揭晓答案，下一题继续加油！", fg=THEMES[cur_theme]["hint"])
    log_msg(f"📖 揭晓答案: {ans_text}")
    update_display()
    root.after(2500, new_question)

def skip_question():
    """跳过本题"""
    global streak
    if not current_riddle:
        return
    streak = 0
    log_msg(f"⏭️ 跳过: {current_riddle['q'][:15]}...")
    update_display()
    new_question()

# ========================
# 分类
# ========================
def set_category(cat):
    global current_category, used_indexes
    current_category = cat
    used_indexes = []
    for name, btn in cat_btns.items():
        if name == cat:
            btn.config(relief="sunken", bd=3)
        else:
            btn.config(relief="raised", bd=1)
    log_msg(f"📂 分类: {cat}")
    new_question()

# ========================
# 显示更新
# ========================
def update_display():
    global score, streak, total_answered, correct_count
    t = THEMES[cur_theme]
    lbl_score.config(text=f"⭐ {score}")
    lbl_streak.config(text=f"🔥 {streak}" if streak >= 2 else f"💫 {streak}")
    
    acc = (correct_count / total_answered * 100) if total_answered > 0 else 0
    lbl_accuracy.config(text=f"🎯 {acc:.0f}% ({correct_count}/{total_answered})")
    lbl_category.config(text=f"📂 {current_category}")

# ========================
# 换肤
# ========================
def apply_theme(name):
    global cur_theme
    cur_theme = name
    t = THEMES[name]
    
    root.config(bg=t["bg"])
    for w in all_widgets:
        try:
            w.config(bg=t["bg"], fg=t["fg"])
        except:
            pass
    
    for btn in theme_btns:
        btn.config(bg=t["btn"], fg="white")
    
    # 特殊控件
    if lbl_question:
        lbl_question.config(bg=t["card"], fg=t["fg"])
    if entry_guess:
        entry_guess.config(bg="white", fg="#212121")
    if lbl_hint:
        lbl_hint.config(bg=t["panel"])
    if lbl_answer:
        lbl_answer.config(bg=t["panel"])
    if lbl_feedback:
        lbl_feedback.config(bg=t["panel"])
    
    update_display()

# ========================
# 日志
# ========================
def log_msg(msg):
    global log_lines
    ts = time.strftime("%H:%M:%S")
    log_lines.append(f"[{ts}] {msg}")
    if len(log_lines) > 50:
        log_lines.pop(0)
    if lbl_log:
        lbl_log.config(state="normal")
        lbl_log.delete("1.0", "end")
        for line in log_lines[-5:]:
            lbl_log.insert("end", line + "\n")
        lbl_log.see("end")
        lbl_log.config(state="disabled")

lbl_log = None

# ========================
# 重置
# ========================
def reset_game():
    global score, streak, total_answered, correct_count, used_indexes
    score = 0
    streak = 0
    total_answered = 0
    correct_count = 0
    used_indexes = []
    log_msg("🔄 已重置积分")
    new_question()
    update_display()

# ========================
# 构建界面
# ========================
def build_ui():
    global root, canvas, lbl_score, lbl_streak, lbl_accuracy
    global lbl_question, lbl_hint, lbl_answer, lbl_feedback, lbl_category
    global entry_guess, lbl_log
    
    root = tk.Tk()
    root.title("🧩 谜语 & 脑筋急转弯")
    root.geometry(f"{WIDTH}x{HEIGHT}")
    root.resizable(False, False)
    
    # ====== 顶部状态栏 ======
    top = tk.Frame(root)
    top.pack(fill="x", pady=3)
    
    lbl_score = tk.Label(top, text="⭐ 0", font=("Comic Sans MS", 14, "bold"))
    lbl_score.pack(side="left", padx=10)
    
    lbl_streak = tk.Label(top, text="💫 0", font=("Comic Sans MS", 12))
    lbl_streak.pack(side="left", padx=8)
    
    lbl_accuracy = tk.Label(top, text="🎯 0%", font=("Comic Sans MS", 11))
    lbl_accuracy.pack(side="left", padx=8)
    
    lbl_category = tk.Label(top, text="📂 全部", font=("Comic Sans MS", 10))
    lbl_category.pack(side="left", padx=8)
    
    # ====== 主题栏 ======
    theme_bar = tk.Frame(root)
    theme_bar.pack(fill="x", pady=1)
    tk.Label(theme_bar, text="🎨 ", font=("", 8)).pack(side="left", padx=3)
    for name in THEMES:
        btn = tk.Button(theme_bar, text=name, font=("Comic Sans MS", 7, "bold"),
                         relief="raised", bd=1, padx=3,
                         command=lambda n=name: apply_theme(n))
        btn.pack(side="left", padx=1)
        theme_btns.append(btn)
    
    # ====== 分类栏 ======
    cat_bar = tk.Frame(root)
    cat_bar.pack(fill="x", pady=2)
    tk.Label(cat_bar, text="📂 分类:", font=("Comic Sans MS", 9, "bold")).pack(side="left", padx=(8,3))
    
    cats = ["全部", "自然", "动物", "物品", "食物", "脑筋急转弯", "经典"]
    for c in cats:
        btn = tk.Button(cat_bar, text=c, font=("Comic Sans MS", 8),
                         relief="raised", bd=1,
                         command=lambda c=c: set_category(c))
        btn.pack(side="left", padx=1)
        cat_btns[c] = btn
    
    # ====== 主区域 ======
    main = tk.Frame(root)
    main.pack(fill="both", expand=True, padx=8, pady=5)
    
    # 题目卡片
    q_frame = tk.Frame(main, relief="ridge", bd=3)
    q_frame.pack(fill="x", pady=8)
    
    lbl_question = tk.Label(q_frame, text="加载中...", font=("Comic Sans MS", 16, "bold"),
                             wraplength=700, justify="center", padx=20, pady=15)
    lbl_question.pack(pady=5)
    
    # 提示
    lbl_hint = tk.Label(main, text="", font=("Comic Sans MS", 11), wraplength=700)
    lbl_hint.pack(pady=3)
    
    # 答案区
    lbl_answer = tk.Label(main, text="", font=("Comic Sans MS", 12, "bold"), wraplength=700)
    lbl_answer.pack(pady=3)
    
    # 输入行
    input_frame = tk.Frame(main)
    input_frame.pack(pady=8)
    
    tk.Label(input_frame, text="✍️ 你的答案:", font=("Comic Sans MS", 12)).pack(side="left", padx=5)
    entry_guess = tk.Entry(input_frame, font=("Comic Sans MS", 16, "bold"),
                            width=15, justify="center")
    entry_guess.pack(side="left", padx=5)
    globals()["entry_guess"] = entry_guess
    
    # 按钮行
    btn_row = tk.Frame(main)
    btn_row.pack(pady=5)
    
    tk.Button(btn_row, text="✅ 提交", font=("Comic Sans MS", 11, "bold"),
              bg="#4CAF50", fg="white", padx=12, command=submit_guess).pack(side="left", padx=3)
    tk.Button(btn_row, text="💡 提示", font=("Comic Sans MS", 10),
              bg="#FF9800", fg="white", padx=10, command=show_hint).pack(side="left", padx=3)
    tk.Button(btn_row, text="📖 看答案", font=("Comic Sans MS", 10),
              bg="#9C27B0", fg="white", padx=10, command=show_answer_now).pack(side="left", padx=3)
    tk.Button(btn_row, text="⏭️ 跳过", font=("Comic Sans MS", 10),
              bg="#9E9E9E", fg="white", padx=10, command=skip_question).pack(side="left", padx=3)
    tk.Button(btn_row, text="🔄 重置", font=("Comic Sans MS", 10),
              bg="#F44336", fg="white", padx=10, command=reset_game).pack(side="left", padx=3)
    
    # 反馈
    lbl_feedback = tk.Label(main, text="", font=("Comic Sans MS", 11))
    lbl_feedback.pack(pady=3)
    
    # ====== 底部日志 ======
    log_frame = tk.Frame(root)
    log_frame.pack(fill="x", side="bottom", pady=1)
    
    scroll = tk.Scrollbar(log_frame)
    scroll.pack(side="right", fill="y")
    
    lbl_log = tk.Text(log_frame, font=("Consolas", 7), height=3, yscrollcommand=scroll.set)
    lbl_log.pack(fill="both", expand=True, padx=3)
    scroll.config(command=lbl_log.yview)
    lbl_log.config(state="disabled")
    
    # ====== 收集 ======
    all_widgets.extend([top, theme_bar, cat_bar, main, q_frame, input_frame,
                         btn_row, log_frame, lbl_score, lbl_streak, lbl_accuracy,
                         lbl_category, lbl_question, lbl_hint, lbl_answer,
                         lbl_feedback])
    
    # ====== 键盘绑定 ======
    root.bind("<Return>", lambda e: submit_guess())
    root.bind("<Escape>", lambda e: entry_guess.delete(0, "end") if entry_guess else None)
    root.focus_set()

# ========================
# 初始化
# ========================
def init():
    build_ui()
    apply_theme("🌸 樱花粉")
    set_category("全部")
    log_msg("🧩 谜语&脑筋急转弯 已就绪！")
    log_msg("💡 提示：答案支持多种说法都能判对~")
    update_display()

if __name__ == "__main__":
    root = None
    canvas = None
    lbl_score = None
    lbl_streak = None
    lbl_accuracy = None
    lbl_question = None
    lbl_hint = None
    lbl_answer = None
    lbl_feedback = None
    lbl_category = None
    entry_guess = None
    lbl_log = None
    init()
    root.mainloop()
