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

class ChengyuGame:
    def __init__(self, root):
        self.root = root
        self.root.title("成语接龙游戏")
        self.root.geometry("600x700")
        self.root.configure(bg='#f0f0f0')
        
        # 成语数据
        self.chengyu_dict = {}  # 存储成语拼音和解释
        self.load_chengyu_data()
        
        # 游戏状态
        self.current_chengyu = ""
        self.used_chengyus = set()
        self.score = 0
        self.ai_enabled = True  # AI对手是否启用
        
        # 初始化界面
        self.setup_ui()
        
        # 开始新游戏
        self.new_game()
    
    def load_chengyu_data(self):
        """加载成语数据（模拟数据，实际可以从文件读取）"""
        # 这里提供一些示例成语
        sample_chengyus = {
            "一心一意": "形容心思专一，没有杂念。",
            "意气风发": "形容精神振奋，气概豪迈。",
            "发奋图强": "下定决心，努力谋求强盛。",
            "强人所难": "勉强别人做不愿做的事。",
            "难能可贵": "做到了难以做到的事，十分可贵。",
            "贵耳贱目": "重视传闻，轻视事实。",
            "目不转睛": "眼珠一动不动地盯着看。",
            "睛如点漆": "形容眼睛明亮有神。",
            "漆身吞炭": "比喻舍身酬恩。",
            "炭化成灰": "比喻彻底消失。",
            "灰飞烟灭": "比喻事物消失得干干净净。",
            "灭顶之灾": "比喻毁灭性的灾难。",
            "灾难深重": "形容苦难很大。",
            "重见天日": "比喻脱离黑暗环境。",
            "日新月异": "每天都在更新变化。",
            "异口同声": "大家说得完全一样。",
            "声东击西": "制造假象迷惑对方。",
            "西窗剪烛": "形容朋友夜谈的乐趣。",
            "烛影摇红": "形容夜色中的烛光美景。",
            "红白喜事": "指婚丧嫁娶等事务。"
        }
        
        # 构建拼音索引（简化版，实际应该用拼音库）
        self.chengyu_dict = sample_chengyus
        
        # 为每个成语添加最后一个汉字
        for chengyu in self.chengyu_dict:
            self.chengyu_dict[chengyu] = {
                "meaning": self.chengyu_dict[chengyu],
                "last_char": chengyu[-1],
                "first_char": chengyu[0]
            }
    
    def setup_ui(self):
        # 标题
        title_frame = tk.Frame(self.root, bg='#f0f0f0')
        title_frame.pack(pady=10)
        
        title_label = tk.Label(title_frame, text="🐉 成语接龙游戏 🐉", 
                                font=("黑体", 24, "bold"), 
                                bg='#f0f0f0', fg='#d43f1d')
        title_label.pack()
        
        # 分数显示
        score_frame = tk.Frame(self.root, bg='#f0f0f0')
        score_frame.pack(pady=10)
        
        self.score_label = tk.Label(score_frame, text="得分: 0", 
                                     font=("黑体", 14), 
                                     bg='#f0f0f0', fg='#2c3e50')
        self.score_label.pack()
        
        # 当前成语显示
        current_frame = tk.Frame(self.root, bg='#ffffff', relief=tk.RAISED, bd=2)
        current_frame.pack(pady=20, padx=20, fill=tk.X)
        
        current_label = tk.Label(current_frame, text="当前成语:", 
                                  font=("黑体", 12), bg='#ffffff')
        current_label.pack(pady=5)
        
        self.current_label = tk.Label(current_frame, text="", 
                                       font=("黑体", 18, "bold"), 
                                       bg='#ffffff', fg='#2ecc71')
        self.current_label.pack(pady=5)
        
        # 需要接的字
        need_frame = tk.Frame(self.root, bg='#f0f0f0')
        need_frame.pack(pady=10)
        
        self.need_label = tk.Label(need_frame, text="需要以什么字开头:", 
                                    font=("黑体", 12), bg='#f0f0f0')
        self.need_label.pack()
        
        self.need_char_label = tk.Label(need_frame, text="", 
                                         font=("黑体", 24, "bold"), 
                                         bg='#f0f0f0', fg='#e74c3c')
        self.need_char_label.pack()
        
        # 输入区域
        input_frame = tk.Frame(self.root, bg='#f0f0f0')
        input_frame.pack(pady=20)
        
        self.entry = tk.Entry(input_frame, font=("黑体", 14), width=20)
        self.entry.pack(side=tk.LEFT, padx=10)
        
        submit_btn = tk.Button(input_frame, text="接龙", command=self.submit_chengyu,
                               font=("黑体", 12), bg='#3498db', fg='white',
                               activebackground='#2980b9', cursor='hand2')
        submit_btn.pack(side=tk.LEFT, padx=5)
        
        # 提示按钮
        hint_btn = tk.Button(input_frame, text="提示", command=self.get_hint,
                            font=("黑体", 12), bg='#f39c12', fg='white',
                            activebackground='#e67e22', cursor='hand2')
        hint_btn.pack(side=tk.LEFT, padx=5)
        
        # 成语历史记录
        history_frame = tk.Frame(self.root, bg='#f0f0f0')
        history_frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
        
        history_label = tk.Label(history_frame, text="📜 接龙历史", 
                                  font=("黑体", 12, "bold"), bg='#f0f0f0')
        history_label.pack(anchor=tk.W)
        
        self.history_text = scrolledtext.ScrolledText(history_frame, height=10, 
                                                        font=("宋体", 10), 
                                                        state=tk.DISABLED)
        self.history_text.pack(fill=tk.BOTH, expand=True)
        
        # 控制按钮
        control_frame = tk.Frame(self.root, bg='#f0f0f0')
        control_frame.pack(pady=10)
        
        new_btn = tk.Button(control_frame, text="新游戏", command=self.new_game,
                           font=("黑体", 10), bg='#95a5a6', fg='white',
                           activebackground='#7f8c8d', cursor='hand2')
        new_btn.pack(side=tk.LEFT, padx=5)
        
        ai_btn = tk.Button(control_frame, text="切换AI对手", command=self.toggle_ai,
                          font=("黑体", 10), bg='#9b59b6', fg='white',
                          activebackground='#8e44ad', cursor='hand2')
        ai_btn.pack(side=tk.LEFT, padx=5)
        
        quit_btn = tk.Button(control_frame, text="退出", command=self.root.quit,
                            font=("黑体", 10), bg='#e74c3c', fg='white',
                            activebackground='#c0392b', cursor='hand2')
        quit_btn.pack(side=tk.LEFT, padx=5)
        
        # 绑定回车键
        self.entry.bind('<Return>', lambda event: self.submit_chengyu())
    
    def new_game(self):
        """开始新游戏"""
        # 随机选择一个初始成语
        self.current_chengyu = random.choice(list(self.chengyu_dict.keys()))
        self.used_chengyus = set([self.current_chengyu])
        self.score = 0
        self.update_score()
        
        # 更新显示
        self.current_label.config(text=self.current_chengyu)
        need_char = self.current_chengyu[-1]
        self.need_char_label.config(text=f"「{need_char}」")
        self.need_label.config(text=f"需要以「{need_char}」字开头:")
        
        # 清空历史记录
        self.history_text.config(state=tk.NORMAL)
        self.history_text.delete(1.0, tk.END)
        self.history_text.insert(1.0, f"游戏开始: {self.current_chengyu}\n")
        self.history_text.config(state=tk.DISABLED)
        
        # 清空输入框
        self.entry.delete(0, tk.END)
        
        # 显示解释
        meaning = self.chengyu_dict[self.current_chengyu]["meaning"]
        self.entry.delete(0, tk.END)
        self.entry.insert(0, "")
        
        if self.ai_enabled:
            self.root.after(500, self.ai_move)
    
    def submit_chengyu(self, is_ai=False, ai_chengyu=""):
        """提交成语接龙"""
        if is_ai:
            chengyu = ai_chengyu
        else:
            chengyu = self.entry.get().strip()
        
        if not chengyu:
            if not is_ai:
                messagebox.showwarning("提示", "请输入成语！")
            return False
        
        # 验证成语是否在词典中
        if chengyu not in self.chengyu_dict:
            if not is_ai:
                messagebox.showerror("错误", f"「{chengyu}」不是有效的成语！")
            return False
        
        # 验证是否重复使用
        if chengyu in self.used_chengyus:
            if not is_ai:
                messagebox.showerror("错误", f"「{chengyu}」已经被使用过了！")
            return False
        
        # 验证接龙规则
        need_char = self.current_chengyu[-1]
        if chengyu[0] != need_char:
            if not is_ai:
                messagebox.showerror("错误", f"成语必须以「{need_char}」字开头！")
            return False
        
        # 接龙成功
        self.current_chengyu = chengyu
        self.used_chengyus.add(chengyu)
        self.score += 10
        self.update_score()
        
        # 更新界面
        self.current_label.config(text=chengyu)
        next_need_char = chengyu[-1]
        self.need_char_label.config(text=f"「{next_need_char}」")
        self.need_label.config(text=f"需要以「{next_need_char}」字开头:")
        
        # 更新历史记录
        player_name = "🤖 AI" if is_ai else "👤 玩家"
        self.history_text.config(state=tk.NORMAL)
        self.history_text.insert(tk.END, f"{player_name}: {chengyu}\n")
        self.history_text.see(tk.END)
        self.history_text.config(state=tk.DISABLED)
        
        # 显示成语解释
        meaning = self.chengyu_dict[chengyu]["meaning"]
        if not is_ai:
            messagebox.showinfo("接龙成功", f"「{chengyu}」\n释义：{meaning}")
        
        # 清空输入框
        if not is_ai:
            self.entry.delete(0, tk.END)
            
            # 如果AI对手启用，让AI接龙
            if self.ai_enabled:
                self.root.after(800, self.ai_move)
        
        return True
    
    def ai_move(self):
        """AI对手的接龙"""
        if not self.ai_enabled:
            return
        
        # 查找可以接龙的成语
        need_char = self.current_chengyu[-1]
        available_chengyus = []
        
        for chengyu in self.chengyu_dict:
            if (chengyu[0] == need_char and 
                chengyu not in self.used_chengyus):
                available_chengyus.append(chengyu)
        
        if available_chengyus:
            # 随机选择一个可用的成语
            ai_choice = random.choice(available_chengyus)
            self.submit_chengyu(is_ai=True, ai_chengyu=ai_choice)
        else:
            # AI无法接龙，游戏结束
            messagebox.showinfo("游戏结束", "AI无法继续接龙，玩家获胜！")
            self.game_over()
    
    def get_hint(self):
        """给玩家提示"""
        if not self.current_chengyu:
            return
        
        need_char = self.current_chengyu[-1]
        hints = []
        
        for chengyu in self.chengyu_dict:
            if (chengyu[0] == need_char and 
                chengyu not in self.used_chengyus):
                hints.append(chengyu)
        
        if hints:
            hint_text = "可用的成语：\n" + "\n".join(hints[:5])
            if len(hints) > 5:
                hint_text += f"\n...还有{len(hints)-5}个"
            messagebox.showinfo("提示", hint_text)
        else:
            # 没有可用的成语，游戏结束
            messagebox.showinfo("提示", "已经没有可用的成语了，游戏结束！")
            self.game_over()
    
    def toggle_ai(self):
        """切换AI对手"""
        self.ai_enabled = not self.ai_enabled
        status = "开启" if self.ai_enabled else "关闭"
        messagebox.showinfo("AI状态", f"AI对手已{status}")
    
    def update_score(self):
        """更新分数显示"""
        self.score_label.config(text=f"得分: {self.score}")
    
    def game_over(self):
        """游戏结束"""
        result = messagebox.askyesno("游戏结束", 
                                     f"游戏结束！\n最终得分：{self.score}\n是否开始新游戏？")
        if result:
            self.new_game()
        else:
            self.root.quit()

def main():
    root = tk.Tk()
    game = ChengyuGame(root)
    root.mainloop()

if __name__ == "__main__":
    main()