import tkinter as tk
from tkinter import messagebox
import random

# 古风成语词库
IDIOM_LIST = [
    "一帆风顺", "二龙戏珠", "三阳开泰", "四海升平", "五谷丰登",
    "六六大顺", "七星高照", "八面玲珑", "九牛一毛", "十全十美",
    "百鸟朝凤", "千军万马", "万象更新", "安然无恙", "春暖花开",
    "春华秋实", "地大物博", "东山再起", "风花雪月", "高山流水",
    "海阔天空", "花好月圆", "江山如画", "金枝玉叶", "锦绣山河",
    "龙腾虎跃", "梅兰竹菊", "明月清风", "鹏程万里", "千秋万代",
    "山河无恙", "世外桃源", "天高地厚", "万古长青", "雾里看花",
    "仙风道骨", "星辰大海", "烟雨江南", "一叶知秋", "云淡风轻",
    "芝兰玉树", "竹报平安", "紫气东来", "琴棋书画", "笔墨纸砚",
    "风华绝代", "浮生若梦", "孤芳自赏", "鸿鹄之志", "江山如故",
    "开卷有益", "良辰美景", "落花流水", "明眸皓齿", "南柯一梦",
    "翩若惊鸿", "清风明月", "人间烟火", "韶华不负", "岁月静好",
    "亭台楼阁", "一蓑烟雨", "云卷云舒", "钟灵毓秀", "珠联璧合",
    "醉卧沙场", "才高八斗", "淡若清风", "风清月朗", "古道西风",
    "鸿图大展", "凌云壮志", "落霞孤鹜", "平步青云", "浅酌低吟",
    "秋高气爽", "人杰地灵", "山清水秀", "诗情画意", "万古流芳"
]

class AncientIdiomGame:
    def __init__(self, root):
        # 主窗口设置
        self.root = root
        self.root.title("竹墨阁 · 成语接龙")
        self.root.geometry("720x580")
        self.root.resizable(False, False)
        # 宣纸古风底色
        self.bg_color = "#f7efe0"
        self.font_dark = "#3d2618"
        self.font_red = "#9c2222"
        self.root.config(bg=self.bg_color)

        # 游戏变量
        self.score = 0
        self.fail_times = 0
        self.max_fail = 3
        self.computer_idiom = ""

        # 构建界面
        self.create_widgets()
        self.restart_game()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(
            self.root,
            text="🎋 竹 墨 阁 成 语 接 龙 🎋",
            font=("楷体", 26, "bold"),
            bg=self.bg_color,
            fg=self.font_red
        )
        title_label.pack(pady=15)

        # 分割线
        line = tk.Canvas(self.root, width=650, height=2, bg="#8c5a38")
        line.pack()

        # 电脑出题区域
        frame_comp = tk.Frame(self.root, bg=self.bg_color)
        frame_comp.pack(pady=18)
        tk.Label(
            frame_comp, text="🖌 对方出句：",
            font=("宋体", 16), bg=self.bg_color, fg=self.font_dark
        ).grid(row=0, column=0, padx=8)
        self.comp_text = tk.Label(
            frame_comp, text="",
            font=("隶书", 20), bg=self.bg_color, fg=self.font_red
        )
        self.comp_text.grid(row=0, column=1)

        # 提示文字：需要接的字
        frame_tip = tk.Frame(self.root, bg=self.bg_color)
        frame_tip.pack(pady=8)
        tk.Label(
            frame_tip, text="需接首字：",
            font=("宋体", 15), bg=self.bg_color, fg=self.font_dark
        ).grid(row=0, column=0, padx=8)
        self.tip_char = tk.Label(
            frame_tip, text="",
            font=("隶书", 22, "bold"), bg=self.bg_color, fg=self.font_red
        )
        self.tip_char.grid(row=0, column=1)

        # 输入框区域
        frame_input = tk.Frame(self.root, bg=self.bg_color)
        frame_input.pack(pady=20)
        tk.Label(
            frame_input, text="君请作答：",
            font=("宋体", 16), bg=self.bg_color, fg=self.font_dark
        ).grid(row=0, column=0, padx=8)
        self.user_entry = tk.Entry(
            frame_input, width=16,
            font=("楷体", 18),
            bd=2, relief="solid",
            bg="#fffaf0"
        )
        self.user_entry.grid(row=0, column=1, padx=10)
        self.user_entry.bind("<Return>", self.submit_idiom)

        # 按钮区
        frame_btn = tk.Frame(self.root, bg=self.bg_color)
        frame_btn.pack(pady=10)
        btn_submit = tk.Button(
            frame_btn, text="递交作答",
            font=("宋体", 14), bg="#c9986c", fg="white",
            width=9, command=self.submit_idiom
        )
        btn_submit.grid(row=0, column=0, padx=6)
        btn_hint = tk.Button(
            frame_btn, text="查看提示",
            font=("宋体", 14), bg="#b88c64", fg="white",
            width=9, command=self.show_hint
        )
        btn_hint.grid(row=0, column=1, padx=6)
        btn_restart = tk.Button(
            frame_btn, text="重新开局",
            font=("宋体", 14), bg="#8c5a38", fg="white",
            width=9, command=self.restart_game
        )
        btn_restart.grid(row=0, column=2, padx=6)

        # 计分&失败次数
        frame_info = tk.Frame(self.root, bg=self.bg_color)
        frame_info.pack(pady=20)
        self.score_label = tk.Label(
            frame_info, text=f"当前积分：{self.score}",
            font=("宋体", 16), bg=self.bg_color, fg=self.font_dark
        )
        self.score_label.grid(row=0, column=0, padx=25)
        self.fail_label = tk.Label(
            frame_info, text=f"剩余容错：{self.max_fail - self.fail_times}次",
            font=("宋体", 16), bg=self.bg_color, fg=self.font_red
        )
        self.fail_label.grid(row=0, column=1, padx=25)

        # 游戏记录文本框
        tk.Label(
            self.root, text="📜 对局记录",
            font=("宋体", 15), bg=self.bg_color, fg=self.font_dark
        ).pack()
        self.log_text = tk.Text(
            self.root, width=70, height=8,
            font=("宋体", 12), bg="#fffaf0",
            bd=1, relief="solid"
        )
        self.log_text.pack(pady=5)
        self.log_text.config(state="disabled")

    def write_log(self, msg):
        """写入对局日志"""
        self.log_text.config(state="normal")
        self.log_text.insert(tk.END, msg + "\n")
        self.log_text.see(tk.END)
        self.log_text.config(state="disabled")

    def get_match_idiom(self, start_char):
        """电脑寻找对应开头成语"""
        res = [w for w in IDIOM_LIST if w[0] == start_char]
        if res:
            return random.choice(res)
        return None

    def submit_idiom(self, event=None):
        user_word = self.user_entry.get().strip()
        self.user_entry.delete(0, tk.END)
        target_char = self.computer_idiom[-1]

        # 校验1：四字
        if len(user_word) != 4:
            self.fail_times += 1
            self.update_info()
            self.write_log(f"❌「{user_word}」非标准四字成语，接龙失败！")
            self.check_game_over()
            return

        # 校验2：首字匹配
        if user_word[0] != target_char:
            self.fail_times += 1
            self.update_info()
            self.write_log(f"❌ 需以【{target_char}】开头，「{user_word}」不符！")
            self.check_game_over()
            return

        # 校验3：词库存在
        if user_word not in IDIOM_LIST:
            self.fail_times += 1
            self.update_info()
            self.write_log(f"❌ 暂未收录成语「{user_word}」，作答无效！")
            self.check_game_over()
            return

        # 答对，加分重置失败次数
        self.score += 10
        self.fail_times = 0
        self.update_info()
        self.write_log(f"✅ 君答：{user_word}，妙哉！积分+10")

        # 电脑接龙
        next_word = self.get_match_idiom(user_word[-1])
        if not next_word:
            messagebox.showinfo("恭喜通关", f"词库无后续成语！\n最终得分：{self.score}分\n文采斐然！")
            return

        self.computer_idiom = next_word
        self.comp_text.config(text=self.computer_idiom)
        self.tip_char.config(text=self.computer_idiom[-1])
        self.write_log(f"🖌 对方接：{next_word}，请以【{next_word[-1]}】续句")

    def show_hint(self):
        """提示功能"""
        target = self.computer_idiom[-1]
        match_words = [w for w in IDIOM_LIST if w[0] == target]
        if not match_words:
            messagebox.showinfo("提示", "暂无可用成语")
            return
        hint_str = "、".join(match_words[:5])
        messagebox.showinfo("提示成语", f"以「{target}」开头可选：\n{hint_str}")

    def update_info(self):
        """更新分数、容错显示"""
        self.score_label.config(text=f"当前积分：{self.score}")
        left = self.max_fail - self.fail_times
        self.fail_label.config(text=f"剩余容错：{left}次")

    def check_game_over(self):
        """判断是否游戏结束"""
        if self.fail_times >= self.max_fail:
            # 结算评价
            if self.score >= 80:
                comment = "🏆 饱读诗书，文采卓绝！"
            elif self.score >= 40:
                comment = "📜 小有学识，尚可一观"
            else:
                comment = "📖 多读古籍，来日再战"
            messagebox.showerror("游戏落幕", f"三次作答失败！\n总积分：{self.score}\n{comment}")
            self.restart_game()

    def restart_game(self):
        """重置游戏"""
        self.score = 0
        self.fail_times = 0
        self.update_info()
        self.log_text.config(state="normal")
        self.log_text.delete(1.0, tk.END)
        self.log_text.config(state="disabled")
        self.write_log("══════ 新一局开始 ══════")
        # 随机开局成语
        self.computer_idiom = random.choice(IDIOM_LIST)
        self.comp_text.config(text=self.computer_idiom)
        self.tip_char.config(text=self.computer_idiom[-1])
        self.write_log(f"🖌 先手成语：{self.computer_idiom}，请以【{self.computer_idiom[-1]}】接龙")

if __name__ == "__main__":
    win = tk.Tk()
    app = AncientIdiomGame(win)
    win.mainloop()
       