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

class IdiomGameGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("成语接龙游戏 v1.0")
        self.root.geometry("800x600")
        self.root.configure(bg='#f0f8ff')
        
        # 设置图标（如果有的话）
        try:
            self.root.iconbitmap('idiom.ico')
        except:
            pass
        
        # 初始化游戏数据
        self.game = IdiomGame()
        
        # 设置样式
        self.setup_styles()
        
        # 创建界面
        self.create_widgets()
        
        # 开始游戏
        self.start_game()
    
    def setup_styles(self):
        """设置界面样式"""
        self.style = ttk.Style()
        self.style.theme_use('clam')
        
        # 自定义颜色
        self.colors = {
            'bg': '#f0f8ff',
            'frame_bg': '#e6f7ff',
            'button_bg': '#1890ff',
            'button_fg': 'white',
            'text_bg': 'white',
            'success': '#52c41a',
            'error': '#f5222d',
            'warning': '#faad14',
            'info': '#1890ff'
        }
    
    def create_widgets(self):
        """创建界面组件"""
        # 标题区域
        title_frame = tk.Frame(self.root, bg=self.colors['bg'])
        title_frame.pack(fill=tk.X, padx=20, pady=10)
        
        title_label = tk.Label(
            title_frame,
            text="🐉 成语接龙游戏 🐉",
            font=('微软雅黑', 24, 'bold'),
            fg='#1890ff',
            bg=self.colors['bg']
        )
        title_label.pack()
        
        subtitle_label = tk.Label(
            title_frame,
            text="考验你的成语储备，与电脑一较高下！",
            font=('微软雅黑', 12),
            fg='#666',
            bg=self.colors['bg']
        )
        subtitle_label.pack()
        
        # 主游戏区域
        main_frame = tk.Frame(self.root, bg=self.colors['frame_bg'])
        main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 游戏信息面板
        info_frame = tk.Frame(main_frame, bg=self.colors['frame_bg'])
        info_frame.pack(fill=tk.X, pady=(0, 10))
        
        # 得分标签
        self.score_var = tk.StringVar(value="得分: 0")
        self.score_label = tk.Label(
            info_frame,
            textvariable=self.score_var,
            font=('微软雅黑', 14, 'bold'),
            fg=self.colors['success'],
            bg=self.colors['frame_bg']
        )
        self.score_label.pack(side=tk.LEFT, padx=20)
        
        # 状态标签
        self.status_var = tk.StringVar(value="状态: 等待开始...")
        self.status_label = tk.Label(
            info_frame,
            textvariable=self.status_var,
            font=('微软雅黑', 12),
            fg=self.colors['info'],
            bg=self.colors['frame_bg']
        )
        self.status_label.pack(side=tk.LEFT, padx=20)
        
        # 接龙记录标签
        self.chain_var = tk.StringVar(value="当前接龙: 0 个成语")
        self.chain_label = tk.Label(
            info_frame,
            textvariable=self.chain_var,
            font=('微软雅黑', 12),
            fg='#666',
            bg=self.colors['frame_bg']
        )
        self.chain_label.pack(side=tk.RIGHT, padx=20)
        
        # 游戏显示区域
        display_frame = tk.Frame(main_frame, bg='white', relief=tk.GROOVE, bd=2)
        display_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
        
        # 当前成语显示
        current_frame = tk.Frame(display_frame, bg='white')
        current_frame.pack(fill=tk.X, padx=20, pady=20)
        
        tk.Label(
            current_frame,
            text="当前成语:",
            font=('微软雅黑', 16),
            bg='white'
        ).pack(side=tk.LEFT)
        
        self.current_idiom_var = tk.StringVar(value="等待开始...")
        self.current_idiom_label = tk.Label(
            current_frame,
            textvariable=self.current_idiom_var,
            font=('微软雅黑', 20, 'bold'),
            fg=self.colors['button_bg'],
            bg='white'
        )
        self.current_idiom_label.pack(side=tk.LEFT, padx=20)
        
        # 历史记录区域
        tk.Label(
            display_frame,
            text="接龙历史:",
            font=('微软雅黑', 12, 'bold'),
            bg='white'
        ).pack(anchor=tk.W, padx=20)
        
        # 滚动文本框显示历史记录
        self.history_text = scrolledtext.ScrolledText(
            display_frame,
            height=8,
            font=('微软雅黑', 11),
            bg='#fafafa',
            wrap=tk.WORD
        )
        self.history_text.pack(fill=tk.BOTH, padx=20, pady=10)
        self.history_text.configure(state='disabled')
        
        # 输入和控制区域
        control_frame = tk.Frame(main_frame, bg=self.colors['frame_bg'])
        control_frame.pack(fill=tk.X, pady=10)
        
        # 输入提示
        input_hint_frame = tk.Frame(control_frame, bg=self.colors['frame_bg'])
        input_hint_frame.pack(fill=tk.X, pady=(0, 5))
        
        self.next_char_var = tk.StringVar(value="请以 '?' 开头")
        self.next_char_label = tk.Label(
            input_hint_frame,
            textvariable=self.next_char_var,
            font=('微软雅黑', 12, 'bold'),
            fg=self.colors['error'],
            bg=self.colors['frame_bg']
        )
        self.next_char_label.pack()
        
        # 输入框和按钮框架
        input_frame = tk.Frame(control_frame, bg=self.colors['frame_bg'])
        input_frame.pack(fill=tk.X)
        
        tk.Label(
            input_frame,
            text="你的成语:",
            font=('微软雅黑', 12),
            bg=self.colors['frame_bg']
        ).pack(side=tk.LEFT)
        
        # 输入框
        self.input_var = tk.StringVar()
        self.input_entry = tk.Entry(
            input_frame,
            textvariable=self.input_var,
            font=('微软雅黑', 14),
            width=20,
            bd=2,
            relief=tk.GROOVE
        )
        self.input_entry.pack(side=tk.LEFT, padx=10)
        self.input_entry.bind('<Return>', lambda e: self.submit_idiom())
        
        # 提交按钮
        self.submit_btn = tk.Button(
            input_frame,
            text="提交",
            command=self.submit_idiom,
            font=('微软雅黑', 12, 'bold'),
            bg=self.colors['button_bg'],
            fg='white',
            relief=tk.RAISED,
            padx=20,
            cursor='hand2'
        )
        self.submit_btn.pack(side=tk.LEFT, padx=5)
        
        # 提示按钮
        self.hint_btn = tk.Button(
            input_frame,
            text="提示",
            command=self.show_hint,
            font=('微软雅黑', 12),
            bg=self.colors['warning'],
            fg='white',
            relief=tk.RAISED,
            padx=20,
            cursor='hand2'
        )
        self.hint_btn.pack(side=tk.LEFT, padx=5)
        
        # 控制按钮区域
        button_frame = tk.Frame(control_frame, bg=self.colors['frame_bg'])
        button_frame.pack(fill=tk.X, pady=10)
        
        # 重新开始按钮
        self.restart_btn = tk.Button(
            button_frame,
            text="重新开始",
            command=self.restart_game,
            font=('微软雅黑', 12),
            bg=self.colors['info'],
            fg='white',
            relief=tk.RAISED,
            padx=20,
            cursor='hand2'
        )
        self.restart_btn.pack(side=tk.LEFT, padx=5)
        
        # 规则按钮
        self.rule_btn = tk.Button(
            button_frame,
            text="游戏规则",
            command=self.show_rules,
            font=('微软雅黑', 12),
            bg='#722ed1',
            fg='white',
            relief=tk.RAISED,
            padx=20,
            cursor='hand2'
        )
        self.rule_btn.pack(side=tk.LEFT, padx=5)
        
        # 退出按钮
        self.exit_btn = tk.Button(
            button_frame,
            text="退出游戏",
            command=self.exit_game,
            font=('微软雅黑', 12),
            bg=self.colors['error'],
            fg='white',
            relief=tk.RAISED,
            padx=20,
            cursor='hand2'
        )
        self.exit_btn.pack(side=tk.LEFT, padx=5)
        
        # 状态栏
        statusbar = tk.Label(
            self.root,
            text="就绪 | 输入成语后按回车键或点击提交",
            bd=1,
            relief=tk.SUNKEN,
            anchor=tk.W,
            bg='#e8e8e8',
            font=('微软雅黑', 10)
        )
        statusbar.pack(side=tk.BOTTOM, fill=tk.X)
    
    def start_game(self):
        """开始游戏"""
        # 电脑先出
        computer_idiom = self.game.computer_turn()
        if computer_idiom:
            self.current_idiom_var.set(computer_idiom)
            self.next_char_var.set(f"请以 '{self.game.last_char}' 开头")
            self.add_to_history(f"🤖 电脑: {computer_idiom}")
            self.update_status()
        else:
            messagebox.showerror("错误", "游戏无法开始，成语库为空！")
    
    def submit_idiom(self):
        """提交玩家成语"""
        player_input = self.input_var.get().strip()
        
        if not player_input:
            messagebox.showwarning("提示", "请输入成语！")
            return
        
        # 验证输入
        success, message = self.game.player_turn(player_input)
        
        if success:
            # 玩家接龙成功
            self.current_idiom_var.set(player_input)
            self.add_to_history(f"👤 你: {player_input} ✓")
            self.update_status()
            
            # 清空输入框
            self.input_var.set("")
            
            # 电脑回合
            self.root.after(1000, self.computer_turn_after_delay)
        else:
            messagebox.showerror("错误", message)
    
    def computer_turn_after_delay(self):
        """延迟后执行电脑回合"""
        self.status_var.set("状态: 电脑思考中...")
        self.submit_btn.configure(state='disabled')
        self.hint_btn.configure(state='disabled')
        
        self.root.after(1500, self.do_computer_turn)
    
    def do_computer_turn(self):
        """执行电脑回合"""
        computer_idiom = self.game.computer_turn()
        
        if computer_idiom:
            self.current_idiom_var.set(computer_idiom)
            self.next_char_var.set(f"请以 '{self.game.last_char}' 开头")
            self.add_to_history(f"🤖 电脑: {computer_idiom}")
            self.update_status()
            
            # 启用按钮
            self.submit_btn.configure(state='normal')
            self.hint_btn.configure(state='normal')
        else:
            # 电脑接不上，玩家胜利
            self.add_to_history("🎉 恭喜！电脑接不上了，你赢了！")
            self.status_var.set("状态: 你赢了！")
            messagebox.showinfo("游戏结束", "恭喜！你战胜了电脑！")
            
            # 禁用输入
            self.input_entry.configure(state='disabled')
            self.submit_btn.configure(state='disabled')
    
    def show_hint(self):
        """显示提示"""
        hint = self.game.get_hint()
        if hint:
            messagebox.showinfo("提示", hint)
        else:
            messagebox.showinfo("提示", "暂时没有可用的提示")
    
    def add_to_history(self, text):
        """添加到历史记录"""
        self.history_text.configure(state='normal')
        self.history_text.insert(tk.END, text + '\n')
        self.history_text.see(tk.END)  # 滚动到底部
        self.history_text.configure(state='disabled')
    
    def update_status(self):
        """更新状态显示"""
        self.score_var.set(f"得分: {self.game.score}")
        self.chain_var.set(f"当前接龙: {len(self.game.used_idioms)} 个成语")
        self.status_var.set("状态: 等待你的输入...")
    
    def restart_game(self):
        """重新开始游戏"""
        if messagebox.askyesno("确认", "确定要重新开始游戏吗？"):
            # 重置游戏
            self.game = IdiomGame()
            self.input_var.set("")
            
            # 清空历史记录
            self.history_text.configure(state='normal')
            self.history_text.delete(1.0, tk.END)
            self.history_text.configure(state='disabled')
            
            # 启用输入
            self.input_entry.configure(state='normal')
            self.submit_btn.configure(state='normal')
            self.hint_btn.configure(state='normal')
            
            # 重新开始
            self.start_game()
    
    def show_rules(self):
        """显示游戏规则"""
        rules = """
🎮 成语接龙游戏规则：

1. 成语必须是四个汉字
2. 不能重复使用成语
3. 新成语的首字必须与上一个成语的尾字相同
4. 电脑先出第一个成语
5. 然后玩家和电脑轮流接龙
6. 当一方无法接上时，另一方获胜

💡 游戏提示：
- 按回车键可以直接提交
- 点击"提示"按钮可以获得接龙建议
- 游戏会记录所有的接龙历史
- 每次成功接龙得1分

祝您游戏愉快！🐉
        """
        messagebox.showinfo("游戏规则", rules)
    
    def exit_game(self):
        """退出游戏"""
        if messagebox.askyesno("确认", "确定要退出游戏吗？"):
            self.root.quit()


class IdiomGame:
    def __init__(self):
        """初始化成语接龙游戏"""
        self.idioms = self.load_idioms()
        self.current_idiom = None
        self.used_idioms = set()
        self.last_char = None
        self.score = 0
    
    def load_idioms(self):
        """加载成语数据"""
        idioms = [
            "一心一意", "二话不说", "三心二意", "四面楚歌", "五光十色",
            "六神无主", "七上八下", "八仙过海", "九牛一毛", "十全十美",
            "一马当先", "二龙戏珠", "三羊开泰", "四海为家", "五湖四海",
            "六六大顺", "七嘴八舌", "八面玲珑", "九九归一", "十拿九稳",
            "一石二鸟", "二话没说", "三长两短", "四面八方", "五颜六色",
            "六亲不认", "七零八落", "八面威风", "九死一生", "十指连心",
            "一见钟情", "二分明月", "三思而行", "四分五裂", "五体投地",
            "六尺之孤", "七步成诗", "八拜之交", "九霄云外", "十万火急",
            "一鸣惊人", "二桃杀三士", "三顾茅庐", "四海升平", "五谷丰登",
            "六朝金粉", "七窍生烟", "八字没一撇", "九曲回肠", "十室九空",
            "一箭双雕", "二八佳人", "三头六臂", "四通八达", "五彩缤纷",
            "六根清净", "七情六欲", "八面来风", "九牛二虎", "十面埋伏",
            "一往无前", "二姓之好", "三番五次", "四平八稳", "五内如焚",
            "六神不安", "七拼八凑", "八斗之才", "九泉之下", "十恶不赦"
        ]
        
        # 创建成语字典，按首字分组
        idiom_dict = defaultdict(list)
        for idiom in idioms:
            if len(idiom) == 4:  # 确保是四字成语
                first_char = idiom[0]
                idiom_dict[first_char].append(idiom)
        
        return idiom_dict
    
    def find_idiom_by_first_char(self, first_char):
        """根据首字查找成语"""
        if first_char in self.idioms:
            available = [idiom for idiom in self.idioms[first_char] 
                        if idiom not in self.used_idioms]
            if available:
                return random.choice(available)
        return None
    
    def check_idiom_valid(self, idiom):
        """检查成语是否合法"""
        if len(idiom) != 4:
            return False, "请输入四字成语！"
        
        if idiom in self.used_idioms:
            return False, "这个成语已经用过了！"
        
        if self.current_idiom and idiom[0] != self.last_char:
            return False, f"请以'{self.last_char}'开头！"
        
        return True, ""
    
    def computer_turn(self):
        """电脑回合"""
        if not self.last_char:
            # 如果游戏刚开始，随机选择一个成语
            all_idioms = []
            for idioms_list in self.idioms.values():
                all_idioms.extend([idiom for idiom in idioms_list 
                                 if idiom not in self.used_idioms])
            
            if not all_idioms:
                return None
                
            self.current_idiom = random.choice(all_idioms)
        else:
            # 接龙模式
            self.current_idiom = self.find_idiom_by_first_char(self.last_char)
        
        if self.current_idiom:
            self.used_idioms.add(self.current_idiom)
            self.last_char = self.current_idiom[-1]
            return self.current_idiom
        return None
    
    def player_turn(self, player_input):
        """玩家回合"""
        is_valid, message = self.check_idiom_valid(player_input)
        
        if not is_valid:
            return False, message
        
        # 更新游戏状态
        self.current_idiom = player_input
        self.used_idioms.add(player_input)
        self.last_char = player_input[-1]
        self.score += 1
        
        return True, f"✓ 接龙成功！"
    
    def get_hint(self):
        """获取提示"""
        if self.last_char:
            available = self.find_idiom_by_first_char(self.last_char)
            if available:
                return f"提示：可以接'{available}'"
        return "暂时没有提示"


def main():
    """主函数"""
    root = tk.Tk()
    app = IdiomGameGUI(root)
    root.mainloop()


if __name__ == "__main__":
    main()