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

class IdiomGame:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 成语接龙")
        self.root.geometry("700x600")
        
        # --- 数据准备 (模拟词库) ---
        # 在实际应用中，这里可以读取一个包含几万个成语的 txt 文件
        self.raw_idioms = [
            "一马当先", "先见之明", "明明白白", "白手起家", "家喻户晓", "晓风残月", "月下老人", "人山人海",
            "海阔天空", "空前绝后", "后继有人", "人定胜天", "天壤之别", "别具一格", "格格不入", "入木三分",
            "分秒必争", "争先恐后", "后起之秀", "秀外慧中", "中庸之道", "道听途说", "说三道四", "四海为家",
            "家喻户晓", "晓以大义", "义不容辞", "辞旧迎新", "新陈代谢", "谢天谢地", "地久天长", "长驱直入",
            "入乡随俗", "俗不可耐", "耐人寻味", "味同嚼蜡", "蜡炬成灰", "灰飞烟灭", "灭绝人性", "性命交关",
            "关门大吉", "吉祥止止", "止于至善", "善贾而沽", "沽名钓誉", "誉不绝口", "口蜜腹剑", "剑拔弩张",
            "张冠李戴", "戴月披星", "星罗棋布", "布衣蔬食", "食不下咽", "咽苦吞甘", "甘拜下风", "风卷残云",
            "云开见日", "日新月异", "异口同声", "声东击西", "西窗剪烛", "烛照数计", "计日程功", "功德无量",
            "量力而行", "行云流水", "水落石出", "出生入死", "死里逃生", "生龙活虎", "虎头蛇尾", "尾大不掉",
            "掉以轻心", "心旷神怡", "怡然自得", "得心应手", "手到病除", "除暴安良", "良辰美景", "景星庆云",
            "云山雾罩", "罩不住", "住手", "手足无措", "措手不及", "及锋而试", "试才录用", "用武之地",
            "地利人和", "和气生财", "财源广进", "进退维谷", "谷马砺兵", "兵强马壮", "壮志凌云", "云消雾散",
            "散兵游勇", "勇往直前", "前赴后继", "继往开来", "来日方长", "长治久安", "安居乐业", "业精于勤",
            "勤能补拙", "拙嘴笨舌", "舌战群儒", "儒雅风流", "流芳百世", "世外桃源", "源远流长", "长篇大论",
            "论功行赏", "赏心悦目", "目不转睛", "睛天霹雳", "雳雳作响", "响彻云霄", "霄壤之别", "别出心裁",
            "裁云剪水", "水涨船高", "高瞻远瞩", "瞩目结舌", "舌灿莲花", "花好月圆", "圆满成功", "功成名就",
            "就事论事", "事在人为", "为人师表", "表里如一", "一帆风顺", "顺水推舟", "舟车劳顿", "顿开茅塞",
            "塞翁失马", "马到成功", "功败垂成", "成千上万", "万众一心", "心口如一", "一见钟情", "情同手足",
            "足智多谋", "谋事在人", "人杰地灵", "灵机一动", "动人心弦", "弦外之音", "音容笑貌", "貌合神离",
            "离经叛道", "道貌岸然", "然荻读书", "书香门第", "第一夫人", "人面桃花", "花言巧语", "语重心长"
        ]
        
        # 构建索引字典：{首字: [成语列表]} 以加速查找
        self.idiom_dict = {}
        for idiom in self.raw_idioms:
            first_char = idiom[0]
            if first_char not in self.idiom_dict:
                self.idiom_dict[first_char] = []
            self.idiom_dict[first_char].append(idiom)
            
        # 游戏状态
        self.history = [] # 记录已使用的成语，防止重复
        self.last_idiom = "" # 上一个成语
        self.is_player_turn = True
        
        self.setup_ui()
        
    def setup_ui(self):
        # 顶部标题
        title_frame = tk.Frame(self.root, bg="#4CAF50", height=60)
        title_frame.pack(fill=tk.X)
        tk.Label(title_frame, text="🐉 成语接龙大作战", font=("Microsoft YaHei", 20, "bold"), 
                 bg="#4CAF50", fg="white").pack(pady=15)
        
        # 中间聊天记录区
        self.chat_area = scrolledtext.ScrolledText(self.root, font=("Consolas", 12), state='disabled', bg="#f9f9f9")
        self.chat_area.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 底部输入区
        input_frame = tk.Frame(self.root, bg="#eeeeee")
        input_frame.pack(fill=tk.X, padx=20, pady=20)
        
        tk.Label(input_frame, text="请输入成语:", bg="#eeeeee", font=("Arial", 12)).pack(side=tk.LEFT, padx=5)
        
        self.entry_var = tk.StringVar()
        self.entry = tk.Entry(input_frame, textvariable=self.entry_var, font=("Arial", 14), width=20)
        self.entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
        self.entry.bind("<Return>", lambda e: self.player_submit()) # 回车发送
        
        btn_send = tk.Button(input_frame, text="发送", command=self.player_submit, 
                             bg="#2196F3", fg="white", font=("Arial", 12, "bold"), padx=15)
        btn_send.pack(side=tk.LEFT, padx=10)
        
        btn_hint = tk.Button(input_frame, text="💡 提示", command=self.show_hint, 
                             bg="#FF9800", fg="white", font=("Arial", 12), padx=10)
        btn_hint.pack(side=tk.RIGHT, padx=5)
        
        btn_restart = tk.Button(input_frame, text="🔄 重新开始", command=self.restart_game, 
                                bg="#F44336", fg="white", font=("Arial", 12), padx=10)
        btn_restart.pack(side=tk.RIGHT, padx=5)
        
        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("游戏开始！请先输入一个成语。")
        status_bar = tk.Label(self.root, textvariable=self.status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)

    def append_message(self, sender, text, color="black"):
        self.chat_area.config(state='normal')
        if sender == "System":
            self.chat_area.insert(tk.END, f"[系统]: {text}\n", "system")
            self.chat_area.tag_config("system", foreground="gray", justify='center')
        elif sender == "You":
            self.chat_area.insert(tk.END, f"👤 你: {text}\n", "user")
            self.chat_area.tag_config("user", foreground="#2196F3", justify='right')
        else: # Computer
            self.chat_area.insert(tk.END, f"🤖 电脑: {text}\n\n", "computer")
            self.chat_area.tag_config("computer", foreground="#4CAF50", justify='left')
            
        self.chat_area.see(tk.END) # 滚动到底部
        self.chat_area.config(state='disabled')

    def player_submit(self):
        if not self.is_player_turn:
            return
            
        user_input = self.entry_var.get().strip()
        
        # 基本验证
        if len(user_input) < 4:
            messagebox.showwarning("提示", "成语通常至少需要4个字哦！")
            return
            
        if not self.is_valid_idiom(user_input):
            # 如果不在我们的精简词库里，但在逻辑上符合（这里简化处理，只允许词库内的）
            # 为了游戏体验，我们强制要求必须在词库内，或者你可以放宽策略
            messagebox.showerror("错误", "这个词不在我的词库里，或者不是标准成语。请换一个！\n(提示：点击'提示'看看我能接什么)")
            return
            
        if user_input in self.history:
            messagebox.showwarning("重复", "这个成语已经用过了！")
            return
            
        # 接龙逻辑检查
        if self.last_idiom:
            if user_input[0] != self.last_idiom[-1]:
                messagebox.showerror("错误", f"接不上！上一个成语是 '{self.last_idiom}'，你需要以 '{self.last_idiom[-1]}' 开头。")
                return
        
        # 玩家输入有效
        self.history.append(user_input)
        self.append_message("You", user_input)
        self.last_idiom = user_input
        self.entry_var.set("")
        self.is_player_turn = False
        self.status_var.set("电脑思考中...")
        self.entry.config(state='disabled')
        
        # 延迟一下模拟思考
        self.root.after(800, self.computer_move)

    def computer_move(self):
        if not self.last_idiom:
            return
            
        last_char = self.last_idiom[-1]
        candidates = self.idiom_dict.get(last_char, [])
        
        # 过滤掉已经用过的
        valid_candidates = [c for c in candidates if c not in self.history]
        
        if valid_candidates:
            # 随机选一个
            choice = random.choice(valid_candidates)
            self.history.append(choice)
            self.append_message("Computer", choice)
            self.last_idiom = choice
            self.status_var.set(f"轮到你了，请以 '{choice[-1]}' 开头。")
        else:
            self.append_message("System", f"电脑接不上了！以 '{last_char}' 开头的成语我用完了。你赢了！🎉")
            self.status_var.set("你赢了！点击重新开始再来一局。")
            self.is_player_turn = False # 游戏结束
            self.entry.config(state='normal')
            return

        self.is_player_turn = True
        self.entry.config(state='normal')
        self.entry.focus()

    def is_valid_idiom(self, text):
        # 简单检查：是否在词库中
        # 如果想更宽松，可以只检查长度和字符，但接龙逻辑需要词库支持
        return text in self.raw_idioms

    def show_hint(self):
        if not self.last_idiom:
            # 游戏刚开始，随便提示一个
            hint = random.choice(self.raw_idioms)
            messagebox.showinfo("提示", f"游戏还没开始或重新开始，你可以试着输入：\n{hint}")
            return
            
        last_char = self.last_idiom[-1]
        candidates = self.idiom_dict.get(last_char, [])
        valid_candidates = [c for c in candidates if c not in self.history]
        
        if valid_candidates:
            hint = random.choice(valid_candidates)
            # 只显示前两个字，增加难度，或者直接显示？这里显示全词方便学习
            messagebox.showinfo("💡 提示", f"试试这个：\n{hint}")
            # 可选：自动填入输入框
            # self.entry_var.set(hint) 
        else:
            messagebox.showinfo("💡 提示", "我也想不到以这个字开头的成语了，你可能要赢了！")

    def restart_game(self):
        self.history = []
        self.last_idiom = ""
        self.is_player_turn = True
        self.entry_var.set("")
        self.entry.config(state='normal')
        self.chat_area.config(state='normal')
        self.chat_area.delete(1.0, tk.END)
        self.chat_area.config(state='disabled')
        self.status_var.set("游戏重新开始！请先输入一个成语。")
        self.append_message("System", "=== 新游戏开始 ===")

if __name__ == "__main__":
    root = tk.Tk()
    # 设置 DPI 感知
    try:
        from ctypes import windll
        windll.shcore.SetProcessDpiAwareness(1)
    except:
        pass
    app = IdiomGame(root)
    root.mainloop()