import tkinter as tk
from tkinter import messagebox, ttk
import random
import json


class IdiomChainGame:
    def __init__(self):
        # 初始化成语词典
        self.idioms = [
            "一见钟情", "情同手足", "足智多谋", "谋事在人", "人杰地灵",
            "灵机一动", "动如脱兔", "兔死狐悲", "悲天悯人", "人山人海",
            "海阔天空", "空前绝后", "后来居上", "上行下效", "效颦学步",
            "步履维艰", "艰苦卓绝", "绝无仅有", "有始有终", "终南捷径",
            "径渭分明", "明目张胆", "胆大包天", "天马行空", "空前绝后",
            "后来居上", "上行下效", "效颦学步", "步履维艰", "艰苦卓绝",
            "绝无仅有", "有始有终", "终南捷径", "径渭分明", "明目张胆",
            "胆大包天", "天马行空", "空前绝后", "后来居上", "上行下效",
            "画龙点睛", "睛明眼亮", "量力而行", "行云流水", "水落石出",
            "出生入死", "死而后已", "已所不欲", "欲擒故纵", "纵横捭阖",
            "阖家欢乐", "乐此不疲", "疲惫不堪", "堪当重任", "任重道远",
            "远见卓识", "识文断字", "字斟句酌", "酌古准今", "今非昔比",
            "比翼双飞", "飞黄腾达", "达官显贵", "贵不可言", "言归于好",
            "好梦成真", "真心实意", "意气风发", "发扬光大", "大展宏图"
        ]

        # 创建主窗口
        self.root = tk.Tk()
        self.root.title("成语接龙游戏")
        self.root.geometry("600x500")
        self.root.resizable(False, False)

        # 游戏状态变量
        self.current_idiom = ""
        self.game_history = []
        self.score = 0

        self.setup_ui()
        self.start_new_game()

    def setup_ui(self):
        """设置用户界面"""
        # 主框架
        main_frame = tk.Frame(self.root, padx=20, pady=20)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 标题
        title_label = tk.Label(main_frame, text="成语接龙游戏",
                               font=("微软雅黑", 18, "bold"))
        title_label.pack(pady=(0, 20))

        # 当前成语显示区域
        current_frame = tk.LabelFrame(main_frame, text="当前成语",
                                      font=("微软雅黑", 10))
        current_frame.pack(fill=tk.X, pady=(0, 10))

        self.current_label = tk.Label(current_frame, text="",
                                      font=("微软雅黑", 14, "bold"),
                                      fg="blue", height=2)
        self.current_label.pack(pady=10)

        # 需要接的字提示
        self.next_char_label = tk.Label(main_frame, text="",
                                        font=("微软雅黑", 12),
                                        fg="red")
        self.next_char_label.pack(pady=(0, 10))

        # 输入框
        input_frame = tk.Frame(main_frame)
        input_frame.pack(fill=tk.X, pady=(0, 10))

        tk.Label(input_frame, text="输入成语:", font=(
            "微软雅黑", 10)).pack(side=tk.LEFT)
        self.idiom_entry = tk.Entry(input_frame, font=("微软雅黑", 12), width=20)
        self.idiom_entry.pack(side=tk.LEFT, padx=(10, 0))
        self.idiom_entry.bind("<Return>", lambda event: self.submit_idiom())

        # 按钮框架
        button_frame = tk.Frame(main_frame)
        button_frame.pack(pady=(0, 10))

        submit_btn = tk.Button(button_frame, text="提交",
                               command=self.submit_idiom,
                               font=("微软雅黑", 10),
                               bg="#4CAF50", fg="white",
                               width=8)
        submit_btn.pack(side=tk.LEFT, padx=5)

        hint_btn = tk.Button(button_frame, text="提示",
                             command=self.show_hint,
                             font=("微软雅黑", 10),
                             bg="#FF9800", fg="white",
                             width=8)
        hint_btn.pack(side=tk.LEFT, padx=5)

        new_game_btn = tk.Button(button_frame, text="新游戏",
                                 command=self.start_new_game,
                                 font=("微软雅黑", 10),
                                 bg="#2196F3", fg="white",
                                 width=8)
        new_game_btn.pack(side=tk.LEFT, padx=5)

        # 得分显示
        self.score_label = tk.Label(main_frame, text="得分: 0",
                                    font=("微软雅黑", 12, "bold"))
        self.score_label.pack(pady=(0, 10))

        # 游戏历史记录
        history_frame = tk.LabelFrame(main_frame, text="游戏记录",
                                      font=("微软雅黑", 10))
        history_frame.pack(fill=tk.BOTH, expand=True, pady=(10, 0))

        # 创建滚动条
        scrollbar = tk.Scrollbar(history_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.history_listbox = tk.Listbox(history_frame,
                                          yscrollcommand=scrollbar.set,
                                          font=("微软雅黑", 10),
                                          height=8)
        self.history_listbox.pack(fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.history_listbox.yview)

    def start_new_game(self):
        """开始新游戏"""
        # 随机选择一个四字成语作为起始
        self.current_idiom = random.choice(
            [idiom for idiom in self.idioms if len(idiom) == 4])
        self.game_history = [f"起始: {self.current_idiom}"]
        self.score = 0

        self.update_display()
        self.idiom_entry.delete(0, tk.END)
        self.idiom_entry.focus()

    def update_display(self):
        """更新界面显示"""
        self.current_label.config(text=self.current_idiom)
        if self.current_idiom:
            last_char = self.current_idiom[-1]
            self.next_char_label.config(text=f"请用 '{last_char}' 字开头接龙")
        else:
            self.next_char_label.config(text="")

        self.score_label.config(text=f"得分: {self.score}")

        # 更新历史记录
        self.history_listbox.delete(0, tk.END)
        for record in self.game_history:
            self.history_listbox.insert(tk.END, record)

        # 滚动到最新记录
        self.history_listbox.see(tk.END)

    def is_valid_idiom(self, idiom):
        """检查是否为有效成语"""
        return idiom in self.idioms and len(idiom) == 4

    def can_chain(self, prev_idiom, next_idiom):
        """检查是否可以接龙"""
        if not prev_idiom or not next_idiom:
            return False
        return prev_idiom[-1] == next_idiom[0]

    def get_hints(self, start_char):
        """获取以指定字符开头的成语提示"""
        hints = [idiom for idiom in self.idioms
                 if len(idiom) == 4 and idiom[0] == start_char]
        return hints[:5]  # 返回最多5个提示

    def show_hint(self):
        """显示提示"""
        if not self.current_idiom:
            return

        start_char = self.current_idiom[-1]
        hints = self.get_hints(start_char)

        if hints:
            hint_text = "、".join(hints)
            messagebox.showinfo("提示", f"以 '{start_char}' 开头的成语:\n{hint_text}")
        else:
            messagebox.showinfo("提示", f"没有找到以 '{start_char}' 开头的成语！")

    def submit_idiom(self):
        """处理用户提交的成语"""
        user_input = self.idiom_entry.get().strip()

        if not user_input:
            messagebox.showwarning("警告", "请输入成语！")
            return

        if len(user_input) != 4:
            messagebox.showwarning("警告", "请输入四字成语！")
            return

        # 检查是否为有效成语
        if not self.is_valid_idiom(user_input):
            messagebox.showerror("错误", "这不是一个有效的成语！")
            return

        # 检查是否能接龙
        if not self.can_chain(self.current_idiom, user_input):
            expected_char = self.current_idiom[-1]
            messagebox.showerror("错误", f"应该用 '{expected_char}' 字开头！")
            return

        # 更新游戏状态
        self.current_idiom = user_input
        self.game_history.append(f"接龙: {user_input}")
        self.score += 10

        # 清空输入框并更新显示
        self.idiom_entry.delete(0, tk.END)
        self.update_display()

        # 检查是否可以继续游戏（是否有下一个成语可接）
        next_char = user_input[-1]
        possible_next = [idiom for idiom in self.idioms
                         if len(idiom) == 4 and idiom[0] == next_char]

        if not possible_next:
            messagebox.showinfo("游戏结束",
                                f"恭喜！你完成了 {len(self.game_history)-1} 轮接龙！\n最终得分: {self.score}")
            self.start_new_game()

    def run(self):
        """运行游戏"""
        self.root.mainloop()

# 扩展版本：支持从文件加载成语词典


class AdvancedIdiomChainGame(IdiomChainGame):
    def __init__(self):
        # 尝试从文件加载成语，如果失败则使用内置词典
        self.load_idioms_from_file()
        super().__init__()

    def load_idioms_from_file(self):
        """从JSON文件加载成语词典"""
        try:
            # 如果有成语词典文件，就读取
            with open('idioms.json', 'r', encoding='utf-8') as f:
                self.idioms = json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            # 使用默认词典
            self.idioms = [
                "一见钟情", "情同手足", "足智多谋", "谋事在人", "人杰地灵",
                "灵机一动", "动如脱兔", "兔死狐悲", "悲天悯人", "人山人海",
                "海阔天空", "空前绝后", "后来居上", "上行下效", "效颦学步",
                "步履维艰", "艰苦卓绝", "绝无仅有", "有始有终", "终南捷径",
                "径渭分明", "明目张胆", "胆大包天", "天马行空", "空前绝后",
                "后来居上", "上行下效", "效颦学步", "步履维艰", "艰苦卓绝",
                "绝无仅有", "有始有终", "终南捷径", "径渭分明", "明目张胆",
                "胆大包天", "天马行空", "空前绝后", "后来居上", "上行下效",
                "画龙点睛", "睛明眼亮", "量力而行", "行云流水", "水落石出",
                "出生入死", "死而后已", "已所不欲", "欲擒故纵", "纵横捭阖",
                "阖家欢乐", "乐此不疲", "疲惫不堪", "堪当重任", "任重道远",
                "远见卓识", "识文断字", "字斟句酌", "酌古准今", "今非昔比",
                "比翼双飞", "飞黄腾达", "达官显贵", "贵不可言", "言归于好",
                "好梦成真", "真心实意", "意气风发", "发扬光大", "大展宏图",
                "图穷匕见", "见多识广", "广开言路", "路不拾遗", "遗臭万年",
                "年富力强", "强弩之末", "末学肤受", "受宠若惊", "惊世骇俗",
                "俗不可耐", "耐人寻味", "味同嚼蜡", "拉帮结派", "拍案叫绝",
                "绝处逢生", "生龙活虎", "虎头蛇尾", "尾大不掉", "掉以轻心",
                "心旷神怡", "怡然自得", "得心应手", "手到擒来", "来日方长"
            ]


if __name__ == "__main__":
    # 运行基础版本
    game = IdiomChainGame()
    game.run()

    # 如果要运行高级版本（支持文件加载），使用下面这行：
    # game = AdvancedIdiomChainGame()
    # game.run()
