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

# 基础成语库（可自行扩展）
idiom_database = {
    "一": ["一帆风顺", "一马当先", "一鸣惊人", "一心一意", "一言九鼎"],
    "二": ["二龙戏珠", "二话不说", "二满三平", "二八佳人", "二分明月"],
    "三": ["三顾茅庐", "三心二意", "三长两短", "三番五次", "三教九流"],
    "四": ["四通八达", "四面楚歌", "四分五裂", "四平八稳", "四海为家"],
    "五": ["五光十色", "五体投地", "五花八门", "五谷丰登", "五彩缤纷"],
    "六": ["六神无主", "六亲不认", "六畜兴旺", "六根清净", "六月飞霜"],
    "七": ["七上八下", "七零八落", "七窍生烟", "七嘴八舌", "七拼八凑"],
    "八": ["八面玲珑", "八面威风", "八仙过海", "八拜之交", "八斗之才"],
    "九": ["九牛一毛", "九死一生", "九霄云外", "九泉之下", "九五之尊"],
    "十": ["十全十美", "十拿九稳", "十恶不赦", "十年寒窗", "十面埋伏"],
    "百": ["百发百中", "百折不挠", "百感交集", "百依百顺", "百步穿杨"],
    "千": ["千军万马", "千山万水", "千钧一发", "千方百计", "千言万语"],
    "万": ["万事如意", "万马奔腾", "万无一失", "万不得已", "万古长青"],
    "海": ["海枯石烂", "海阔天空", "海市蜃楼", "海誓山盟", "海底捞月"],
    "天": ["天长地久", "天罗地网", "天衣无缝", "天经地义", "天翻地覆"],
    "地": ["地老天荒", "地动山摇", "地广人稀", "地丑德齐", "地覆天翻"],
}

# 同音字映射（解决多音字/同音字接龙）
homophones = {
    "壹": "一", "贰": "二", "叁": "三", "肆": "四", "伍": "五",
    "陆": "六", "柒": "七", "捌": "八", "玖": "九", "拾": "十",
}

class IdiomSolitaireGame:
    def __init__(self, root):
        self.root = root
        self.root.title("成语接龙小游戏")
        self.root.geometry("600x500")
        self.root.resizable(False, False)

        # 游戏状态变量
        self.current_last_char = None  # 当前接龙的最后一个字
        self.user_score = 0            # 用户得分
        self.used_idioms = set()       # 已使用的成语（避免重复）

        # 创建界面组件
        self.create_widgets()

        # 初始化游戏
        self.reset_game()

    def create_widgets(self):
        # 标题标签
        title_label = tk.Label(self.root, text="成语接龙", font=("宋体", 20, "bold"))
        title_label.pack(pady=10)

        # 游戏说明
        desc_label = tk.Label(self.root, text="规则：输入以最后一字开头的成语（支持同音字），不能重复！", font=("宋体", 10))
        desc_label.pack(pady=5)

        # 接龙记录显示区
        self.record_text = scrolledtext.ScrolledText(self.root, width=70, height=15, font=("宋体", 11))
        self.record_text.pack(pady=10)
        self.record_text.config(state=tk.DISABLED)  # 设置为只读

        # 输入框和按钮区域
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=5)

        # 输入框
        self.idiom_entry = tk.Entry(input_frame, width=30, font=("宋体", 12))
        self.idiom_entry.grid(row=0, column=0, padx=5)

        # 提交按钮
        submit_btn = tk.Button(input_frame, text="提交", width=10, font=("宋体", 12), command=self.check_idiom)
        submit_btn.grid(row=0, column=1, padx=5)

        # 重置按钮
        reset_btn = tk.Button(input_frame, text="重置游戏", width=10, font=("宋体", 12), command=self.reset_game)
        reset_btn.grid(row=0, column=2, padx=5)

        # 得分显示
        score_frame = tk.Frame(self.root)
        score_frame.pack(pady=10)

        tk.Label(score_frame, text="你的得分：", font=("宋体", 12)).grid(row=0, column=0)
        self.score_label = tk.Label(score_frame, text="0", font=("宋体", 12, "bold"), fg="red")
        self.score_label.grid(row=0, column=1)

    def reset_game(self):
        """重置游戏状态"""
        self.current_last_char = None
        self.user_score = 0
        self.used_idioms.clear()
        self.score_label.config(text=str(self.user_score))
        self.idiom_entry.delete(0, tk.END)

        # 清空记录区并提示开始
        self.record_text.config(state=tk.NORMAL)
        self.record_text.delete(1.0, tk.END)
        self.record_text.insert(tk.END, "游戏开始！请输入第一个成语，开启接龙～\n")
        self.record_text.config(state=tk.DISABLED)

    def get_first_char(self, idiom):
        """获取成语第一个字（处理同音字）"""
        if not idiom:
            return ""
        first_char = idiom[0]
        return homophones.get(first_char, first_char)

    def get_last_char(self, idiom):
        """获取成语最后一个字（处理同音字）"""
        if not idiom:
            return ""
        last_char = idiom[-1]
        return homophones.get(last_char, last_char)

    def is_valid_idiom(self, idiom):
        """验证是否为有效成语（存在于成语库）"""
        if len(idiom) != 4:  # 只支持4字成语
            return False
        first_char = self.get_first_char(idiom)
        # 检查是否在成语库中
        for char in idiom_database:
            if idiom in idiom_database[char]:
                return True
        return False

    def check_idiom(self):
        """检查用户输入的成语是否符合规则"""
        user_idiom = self.idiom_entry.get().strip()
        self.idiom_entry.delete(0, tk.END)

        # 1. 验证输入非空
        if not user_idiom:
            messagebox.showwarning("提示", "请输入成语！")
            return

        # 2. 验证是有效成语
        if not self.is_valid_idiom(user_idiom):
            messagebox.showwarning("提示", f"{user_idiom} 不是有效成语，请重新输入！")
            return

        # 3. 验证未重复使用
        if user_idiom in self.used_idioms:
            messagebox.showwarning("提示", f"{user_idiom} 已经用过了，换一个！")
            return

        # 4. 验证接龙规则（首次输入无限制）
        if self.current_last_char is not None:
            user_first_char = self.get_first_char(user_idiom)
            if user_first_char != self.current_last_char:
                messagebox.showwarning("提示", f"需要以「{self.current_last_char}」开头的成语（支持同音字）！")
                return

        # 所有规则验证通过，记录成语并加分
        self.used_idioms.add(user_idiom)
        self.user_score += 10
        self.score_label.config(text=str(self.user_score))
        self.current_last_char = self.get_last_char(user_idiom)

        # 更新记录区
        self.record_text.config(state=tk.NORMAL)
        self.record_text.insert(tk.END, f"你：{user_idiom}（最后一字：{self.current_last_char}）\n")
        self.record_text.see(tk.END)  # 自动滚动到末尾
        self.record_text.config(state=tk.DISABLED)

        # 电脑自动接龙
        self.computer_respond()

    def computer_respond(self):
        """电脑自动接龙回应"""
        # 获取以当前最后一字开头的成语列表
        candidate_idioms = idiom_database.get(self.current_last_char, [])
        # 过滤已使用的成语
        available_idioms = [idiom for idiom in candidate_idioms if idiom not in self.used_idioms]

        if not available_idioms:
            # 电脑接不上，用户胜利
            self.record_text.config(state=tk.NORMAL)
            self.record_text.insert(tk.END, f"电脑：接不上啦！你赢了～\n")
            self.record_text.see(tk.END)
            self.record_text.config(state=tk.DISABLED)
            messagebox.showinfo("游戏结果", f"恭喜你！电脑接不上了，你的得分：{self.user_score}")
            return

        # 随机选一个成语回应
        computer_idiom = random.choice(available_idioms)
        self.used_idioms.add(computer_idiom)
        self.current_last_char = self.get_last_char(computer_idiom)

        # 更新记录区
        self.record_text.config(state=tk.NORMAL)
        self.record_text.insert(tk.END, f"电脑：{computer_idiom}（最后一字：{self.current_last_char}）\n")
        self.record_text.see(tk.END)
        self.record_text.config(state=tk.DISABLED)

# 启动游戏
if __name__ == "__main__":
    root = tk.Tk()
    game = IdiomSolitaireGame(root)
    root.mainloop()