import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import random

# 扩充完整成语库 key:成语 value:最后一个汉字
IDIOMS = {
    "一帆风顺": "顺", "顺理成章": "章", "章决句断": "断", "断章取义": "义",
    "义不容辞": "辞", "辞旧迎新": "新", "新陈代谢": "谢", "谢天谢地": "地",
    "地大物博": "博", "博采众长": "长", "长驱直入": "入", "入木三分": "分",
    "分秒必争": "争", "争先恐后": "后", "后来居上": "上", "上天入地": "地",
    "花好月圆": "圆", "圆木警枕": "枕", "枕戈待旦": "旦", "旦夕祸福": "福",
    "福如东海": "海", "海阔天空": "空", "空穴来风": "风", "风调雨顺": "顺",
    "顺藤摸瓜": "瓜", "瓜熟蒂落": "落", "落井下石": "石", "石沉大海": "海",
    "海枯石烂": "烂", "烂若披锦": "锦", "锦上添花": "花", "花前月下": "下",
    "下里巴人": "人", "人定胜天": "天", "天罗地网": "网", "网开一面": "面",
    "面如土色": "色", "色胆包天": "天", "天高地厚": "厚", "厚此薄彼": "彼",
    "彼竭我盈": "盈", "盈千累万": "万", "万马奔腾": "腾", "腾云驾雾": "雾",
    "雾里看花": "花", "花言巧语": "语", "语重心长": "长", "长年累月": "月",
    "月黑风高": "高", "高谈阔论": "论", "论功行赏": "赏", "赏罚分明": "明",
    "明察秋毫": "毫", "毫发无损": "损", "损人利己": "己", "己所不欲": "欲",
    "欲擒故纵": "纵", "纵虎归山": "山", "山清水秀": "秀", "秀外慧中": "中",
    "中流砥柱": "柱", "柱石之坚": "坚", "坚贞不屈": "屈", "屈指可数": "数",
    "数典忘祖": "祖", "祖功宗德": "德", "德高望重": "重", "重见天日": "日",
    "日新月异": "异", "异想天开": "开", "开门见山": "山", "山穷水尽": "尽"
}

class IdiomGame:
    def __init__(self, root):
        self.root = root
        self.root.title("成语接龙小游戏（增强版）")
        self.root.geometry("650x520")
        self.root.resizable(False, False)

        # 游戏数据
        self.current_idiom = ""
        self.score = 0
        self.last_char = ""
        self.used_idioms = set()  # 存放已经用过的成语，禁止重复

        self.setup_ui()
        self.start_game()

    def setup_ui(self):
        # 标题
        title_label = ttk.Label(self.root, text="成语接龙", font=("微软雅黑", 22, "bold"), foreground="#2E86AB")
        title_label.pack(pady=12)

        # 分数栏
        score_frame = ttk.Frame(self.root)
        score_frame.pack()
        self.score_label = ttk.Label(score_frame, text=f"当前分数：{self.score}", font=("微软雅黑", 14))
        self.score_label.grid(row=0, column=0, padx=20)
        used_label = ttk.Label(score_frame, text="已使用成语不可重复", font=("微软雅黑", 10), foreground="gray")
        used_label.grid(row=0, column=1)

        # 当前接龙成语展示
        self.now_label = ttk.Label(self.root, text="", font=("微软雅黑", 18), foreground="#1874CD")
        self.now_label.pack(pady=12)

        # 输入区域
        input_frame = ttk.Frame(self.root)
        input_frame.pack(pady=6)
        ttk.Label(input_frame, text="输入成语：", font=("微软雅黑", 13)).grid(row=0, column=0)
        self.idiom_entry = ttk.Entry(input_frame, font=("微软雅黑", 14), width=18)
        self.idiom_entry.grid(row=0, column=1, padx=8)
        self.idiom_entry.bind("<Return>", self.check_idiom)

        # 功能按钮
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(pady=10)
        ttk.Button(btn_frame, text="提交接龙", command=self.check_idiom).grid(row=0, column=0, padx=4)
        ttk.Button(btn_frame, text="清空输入", command=self.clear_input).grid(row=0, column=1, padx=4)
        ttk.Button(btn_frame, text="电脑接招", command=self.computer_play).grid(row=0, column=2, padx=4)
        ttk.Button(btn_frame, text="重新开局", command=self.start_game).grid(row=0, column=3, padx=4)

        # 提示信息
        self.msg_label = ttk.Label(self.root, text="游戏加载完成，开始接龙！", font=("微软雅黑", 12), foreground="green")
        self.msg_label.pack(pady=8)

        # 历史接龙记录框
        ttk.Label(self.root, text="接龙历史记录：", font=("微软雅黑", 12)).pack()
        self.history_text = scrolledtext.ScrolledText(self.root, width=70, height=10, font=("微软雅黑", 10))
        self.history_text.pack(padx=10, pady=5)
        self.history_text.config(state=tk.DISABLED)

    def add_history(self, text):
        """添加记录到历史文本框"""
        self.history_text.config(state=tk.NORMAL)
        self.history_text.insert(tk.END, text + "\n")
        self.history_text.see(tk.END)
        self.history_text.config(state=tk.DISABLED)

    def start_game(self):
        """重置游戏，重新开局"""
        self.score = 0
        self.used_idioms.clear()
        self.history_text.config(state=tk.NORMAL)
        self.history_text.delete(1.0, tk.END)
        self.history_text.config(state=tk.DISABLED)

        self.current_idiom = random.choice(list(IDIOMS.keys()))
        self.last_char = IDIOMS[self.current_idiom]
        self.used_idioms.add(self.current_idiom)

        self.score_label.config(text=f"当前分数：{self.score}")
        self.now_label.config(text=f"当前成语：{self.current_idiom}")
        self.msg_label.config(text=f"请用【{self.last_char}】字开头接龙！", foreground="green")
        self.add_history(f"开局成语：{self.current_idiom}")
        self.clear_input()

    def clear_input(self):
        self.idiom_entry.delete(0, tk.END)
        self.idiom_entry.focus()

    def computer_play(self):
        """电脑自动接龙"""
        # 筛选所有以last_char开头且没使用过的成语
        match_list = []
        for idiom, tail in IDIOMS.items():
            if idiom[0] == self.last_char and idiom not in self.used_idioms:
                match_list.append(idiom)
        if not match_list:
            self.msg_label.config(text="词库无后续成语，游戏断龙，请重新开局！", foreground="red")
            return
        # 随机选一个电脑成语
        comp_idiom = random.choice(match_list)
        self.used_idioms.add(comp_idiom)
        self.add_history(f"电脑：{comp_idiom}")

        self.current_idiom = comp_idiom
        self.last_char = IDIOMS[comp_idiom]
        self.now_label.config(text=f"当前成语：{self.current_idiom}")
        self.msg_label.config(text=f"电脑接完，请用【{self.last_char}】开头继续", foreground="#663399")

    def check_idiom(self, event=None):
        """校验玩家输入的成语"""
        player_input = self.idiom_entry.strip()
        if not player_input:
            self.msg_label.config(text="请输入成语再提交！", foreground="red")
            return

        # 判断是否是库内成语
        if player_input not in IDIOMS:
            self.msg_label.config(text="该成语不在词库内，请换一个！", foreground="red")
            return

        # 判断是否重复使用
        if player_input in self.used_idioms:
            self.msg_label.config(text="该成语已经用过了，不能重复！", foreground="red")
            return

        # 判断首尾字匹配
        first_char = player_input[0]
        if first_char != self.last_char:
            self.msg_label.config(text=f"接龙失败！必须以【{self.last_char}】开头", foreground="red")
            return

        # 接龙成功
        self.score += 10
        self.used_idioms.add(player_input)
        self.add_history(f"玩家：{player_input}")

        self.current_idiom = player_input
        self.last_char = IDIOMS[player_input]

        self.score_label.config(text=f"当前分数：{self.score}")
        self.now_label.config(text=f"当前成语：{self.current_idiom}")
        self.msg_label.config(text=f"✅ 接龙成功！下一个字：【{self.last_char}】", foreground="green")
        self.clear_input()

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