import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext, font
import random
import json
import os
from datetime import datetime

class IdiomSolitaireGame:
    def __init__(self, root):
        self.root = root
        self.root.title("成语接龙 - 中华文化传承")
        self.root.geometry("1200x800")
        
        # 设置窗口图标
        try:
            self.root.iconbitmap('idiom.ico')
        except:
            pass
        
        # 加载成语词库
        self.load_idioms()
        
        # 设置样式
        self.setup_styles()
        
        # 游戏状态初始化
        self.reset_game()
        
        # 创建界面
        self.create_widgets()
        
        # 绑定快捷键
        self.setup_shortcuts()
        
    def load_idioms(self):
        """加载成语词库"""
        # 基础成语库（超过600个）
        self.idioms = [
            "一马当先", "一见钟情", "一心一意", "一鸣惊人", "一箭双雕", "一举两得", "一丝不苟", "一视同仁",
            "二话不说", "二分明月", "二龙戏珠", "二满三平", "二童一马", "二惠竞爽", "二缶钟惑", "二仙传道",
            "三心二意", "三生有幸", "三思而行", "三顾茅庐", "三令五申", "三头六臂", "三教九流", "三缄其口",
            "四面八方", "四通八达", "四分五裂", "四平八稳", "四书五经", "四海为家", "四时充美", "四郊多垒",
            "五光十色", "五湖四海", "五颜六色", "五彩缤纷", "五体投地", "五谷丰登", "五内如焚", "五子登科",
            "六神无主", "六根清净", "六亲不认", "六朝金粉", "六街三市", "六尺之孤", "六出奇计", "六畜兴旺",
            "七上八下", "七手八脚", "七嘴八舌", "七窍生烟", "七零八落", "七拼八凑", "七情六欲", "七擒七纵",
            "八仙过海", "八面玲珑", "八面威风", "八拜之交", "八方支援", "八音迭奏", "八珍玉食", "八斗之才",
            "九牛一毛", "九死一生", "九霄云外", "九泉之下", "九流十家", "九九归一", "九儒十丐", "九转功成",
            "十全十美", "十万火急", "十指连心", "十面埋伏", "十室九空", "十字路口", "十拿九稳", "十年树木",
            "百发百中", "百战百胜", "百折不挠", "百花齐放", "百无聊赖", "百感交集", "百读不厌", "百尺竿头",
            "千军万马", "千变万化", "千言万语", "千辛万苦", "千方百计", "千钧一发", "千载难逢", "千篇一律",
            "万紫千红", "万无一失", "万水千山", "万众一心", "万马奔腾", "万念俱灰", "万古长青", "万籁俱寂",
            
            # 动物类
            "龙马精神", "虎头蛇尾", "狐假虎威", "狼吞虎咽", "鸡鸣狗盗", "鹤立鸡群", "马到成功", "羊肠小道",
            "猴年马月", "鸡犬不宁", "狗仗人势", "猪朋狗友", "鼠目寸光", "牛刀小试", "虎视眈眈", "兔死狐悲",
            "龙飞凤舞", "蛇蝎心肠", "马不停蹄", "羊入虎口", "鸡飞狗跳", "狗急跳墙", "猪突豨勇", "鱼目混珠",
            
            # 自然类
            "山清水秀", "水到渠成", "风和日丽", "花好月圆", "雪中送炭", "月明星稀", "雨过天晴", "春暖花开",
            "秋高气爽", "冰天雪地", "海阔天空", "天涯海角", "江河日下", "湖光山色", "山高水长", "风花雪月",
            
            # 历史典故
            "卧薪尝胆", "完璧归赵", "负荆请罪", "纸上谈兵", "背水一战", "破釜沉舟", "四面楚歌", "三顾茅庐",
            "望梅止渴", "画龙点睛", "指鹿为马", "凿壁偷光", "悬梁刺股", "囊萤映雪", "程门立雪", "铁杵磨针",
            
            # 寓言故事
            "守株待兔", "刻舟求剑", "画蛇添足", "亡羊补牢", "掩耳盗铃", "买椟还珠", "叶公好龙", "杞人忧天",
            "井底之蛙", "滥竽充数", "对牛弹琴", "自相矛盾", "鹬蚌相争", "杯弓蛇影", "愚公移山", "邯郸学步",
            
            # 常用接龙
            "人山人海", "海阔天空", "空穴来风", "风调雨顺", "顺手牵羊", "羊肠小道", "道听途说", "说一不二",
            "二龙戏珠", "珠光宝气", "气象万千", "千军万马", "马到成功", "功成名就", "就事论事", "事在人为",
            "为富不仁", "仁至义尽", "尽善尽美", "美中不足", "足智多谋", "谋事在人", "人定胜天", "天衣无缝",
            "缝缝补补", "补天浴日", "日新月异", "异想天开", "开门见山", "山穷水尽", "尽心竭力", "力不从心",
            "心花怒放", "放任自流", "流连忘返", "返老还童", "童叟无欺", "欺人太甚", "甚嚣尘上", "上行下效",
            "效犬马力", "力排众议", "议论纷纷", "纷至沓来", "来日方长", "长驱直入", "入木三分", "分秒必争",
            "争先恐后", "后来居上", "上善若水", "水到渠成", "成竹在胸", "胸有成竹", "竹报平安", "安步当车",
            "车水马龙", "龙马精神", "神采飞扬", "扬眉吐气", "气宇轩昂", "昂首挺胸", "胸无点墨", "墨守成规",
            "规行矩步", "步步为营", "营私舞弊", "弊绝风清", "清风明月", "月白风清", "清心寡欲", "欲罢不能",
            "能者多劳", "劳苦功高", "高山流水", "水落石出", "出生入死", "死而复生", "生龙活虎", "虎头蛇尾",
            "尾大不掉", "掉以轻心", "心不在焉", "嫣然一笑", "笑里藏刀", "刀山火海", "海底捞针", "针锋相对",
            "对答如流", "流芳百世", "世外桃源", "源远流长", "长此以往", "往返徒劳", "劳民伤财", "财大气粗",
            "粗心大意", "意气风发", "发人深省", "省吃俭用", "用心良苦", "苦尽甘来", "来龙去脉", "脉脉含情",
            "情同手足", "足不出户", "户枢不蠹", "蠹国害民", "民不聊生", "生不逢时", "时不我待", "待人接物",
            "物尽其用", "用兵如神", "神出鬼没", "没齿难忘", "忘恩负义", "义不容辞", "辞旧迎新", "新陈代谢",
            "谢天谢地", "地大物博", "博古通今", "今非昔比", "比比皆是", "是是非非", "非亲非故", "故步自封",
            "封官许愿", "愿者上钩", "钩心斗角", "角立杰出", "出生入死", "死灰复燃", "燃眉之急", "急中生智"
        ]
        
        # 从文件加载额外成语
        self.load_additional_idioms()
        
        # 去重
        self.all_idioms = list(set(self.idioms + getattr(self, 'additional_idioms', [])))
        print(f"已加载成语总数: {len(self.all_idioms)}个")
        
        # 构建索引
        self.idiom_dict = {}
        for idiom in self.all_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)
    
    def load_additional_idioms(self):
        """从文件加载额外成语"""
        self.additional_idioms = []
        files_to_try = ['idioms.txt', '成语库.txt', 'data/idioms.json']
        
        for filename in files_to_try:
            if os.path.exists(filename):
                try:
                    with open(filename, 'r', encoding='utf-8') as f:
                        if filename.endswith('.json'):
                            data = json.load(f)
                            idioms = data.get('idioms', [])
                        else:
                            content = f.read()
                            idioms = []
                            for line in content.split('\n'):
                                line = line.strip()
                                if line:
                                    # 尝试多种分隔符
                                    for separator in [',', '，', ' ', '\t']:
                                        for word in line.split(separator):
                                            word = word.strip()
                                            if len(word) == 4 and all('\u4e00' <= c <= '\u9fff' for c in word):
                                                idioms.append(word)
                    
                    self.additional_idioms = list(set(idioms))
                    print(f"从文件 {filename} 加载了 {len(self.additional_idioms)} 个额外成语")
                    break
                except Exception as e:
                    print(f"加载文件 {filename} 失败: {e}")
    
    def setup_styles(self):
        """设置样式"""
        # 创建样式
        self.style = ttk.Style()
        self.style.theme_use('clam')
        
        # 配置颜色
        self.colors = {
            'bg': '#f5faff',
            'fg': '#2c3e50',
            'accent': '#3498db',
            'secondary': '#2ecc71',
            'warning': '#e74c3c',
            'hint': '#f39c12',
            'button': '#3498db',
            'button_hover': '#2980b9',
            'input_bg': 'white',
            'history_bg': '#ecf0f1'
        }
    
    def reset_game(self):
        """重置游戏状态"""
        self.current_idiom = ""
        self.history = []
        self.score = 0
        self.time_left = 60
        self.game_active = False
        self.game_over = False
        self.hint_used = False
        self.hint_idiom = ""
        self.used_idioms = set()
        self.last_char = ""
        self.start_time = None
        self.total_time = 0
        self.difficulty = "普通"
        
    def create_widgets(self):
        """创建界面组件"""
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        
        # 标题区域
        title_frame = ttk.Frame(main_frame)
        title_frame.grid(row=0, column=0, columnspan=3, pady=(0, 20), sticky=(tk.W, tk.E))
        
        title_label = tk.Label(
            title_frame, 
            text="成语接龙游戏", 
            font=('Microsoft YaHei', 28, 'bold'),
            fg=self.colors['accent']
        )
        title_label.pack()
        
        subtitle_label = tk.Label(
            title_frame,
            text="中华文化传承 | 挑战你的词汇量",
            font=('Microsoft YaHei', 12),
            fg=self.colors['fg']
        )
        subtitle_label.pack()
        
        # 左侧：游戏信息和控制
        left_frame = ttk.Frame(main_frame, padding="10")
        left_frame.grid(row=1, column=0, sticky=(tk.W, tk.N, tk.S), padx=(0, 20))
        
        # 游戏信息
        info_frame = ttk.LabelFrame(left_frame, text="游戏信息", padding="10")
        info_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.score_label = tk.Label(
            info_frame,
            text="分数: 0",
            font=('Microsoft YaHei', 12, 'bold'),
            fg=self.colors['accent']
        )
        self.score_label.pack(anchor=tk.W, pady=2)
        
        self.time_label = tk.Label(
            info_frame,
            text="剩余时间: 60秒",
            font=('Microsoft YaHei', 12),
            fg=self.colors['fg']
        )
        self.time_label.pack(anchor=tk.W, pady=2)
        
        self.difficulty_label = tk.Label(
            info_frame,
            text="难度: 普通",
            font=('Microsoft YaHei', 12),
            fg=self.colors['fg']
        )
        self.difficulty_label.pack(anchor=tk.W, pady=2)
        
        self.idiom_count_label = tk.Label(
            info_frame,
            text=f"词库: {len(self.all_idioms)}个成语",
            font=('Microsoft YaHei', 10),
            fg=self.colors['fg']
        )
        self.idiom_count_label.pack(anchor=tk.W, pady=2)
        
        # 当前成语显示
        current_frame = ttk.LabelFrame(left_frame, text="当前成语", padding="10")
        current_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.current_idiom_label = tk.Label(
            current_frame,
            text="等待开始...",
            font=('Microsoft YaHei', 24, 'bold'),
            fg=self.colors['accent'],
            height=2
        )
        self.current_idiom_label.pack()
        
        self.next_char_label = tk.Label(
            current_frame,
            text="请点击'开始游戏'",
            font=('Microsoft YaHei', 12),
            fg=self.colors['secondary']
        )
        self.next_char_label.pack()
        
        # 输入区域
        input_frame = ttk.LabelFrame(left_frame, text="输入成语", padding="10")
        input_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.input_var = tk.StringVar()
        self.input_entry = ttk.Entry(
            input_frame,
            textvariable=self.input_var,
            font=('Microsoft YaHei', 14),
            width=20
        )
        self.input_entry.pack(pady=5)
        
        input_hint = tk.Label(
            input_frame,
            text="输入4字成语后按回车提交",
            font=('Microsoft YaHei', 9),
            fg='gray'
        )
        input_hint.pack()
        
        # 按钮区域
        button_frame = ttk.Frame(left_frame)
        button_frame.pack(fill=tk.X, pady=(0, 10))
        
        button_configs = [
            ("开始游戏", self.start_game, self.colors['button']),
            ("提交成语", self.submit_idiom, self.colors['secondary']),
            ("获取提示", self.get_hint, self.colors['hint']),
            ("重新开始", self.restart_game, self.colors['warning']),
            ("难度切换", self.toggle_difficulty, self.colors['accent']),
            ("查看词库", self.show_idiom_list, '#9b59b6'),
            ("游戏规则", self.show_rules, '#34495e'),
            ("退出游戏", self.exit_game, '#7f8c8d')
        ]
        
        for i, (text, command, color) in enumerate(button_configs):
            btn = tk.Button(
                button_frame,
                text=text,
                command=command,
                bg=color,
                fg='white',
                font=('Microsoft YaHei', 10, 'bold'),
                padx=10,
                pady=5,
                relief=tk.RAISED,
                bd=1
            )
            btn.grid(row=i//2, column=i%2, padx=5, pady=5, sticky=tk.EW)
        
        button_frame.columnconfigure(0, weight=1)
        button_frame.columnconfigure(1, weight=1)
        
        # 中间：历史记录
        center_frame = ttk.Frame(main_frame)
        center_frame.grid(row=1, column=1, sticky=(tk.W, tk.E, tk.N, tk.S), padx=20)
        center_frame.columnconfigure(0, weight=1)
        center_frame.rowconfigure(0, weight=1)
        
        history_frame = ttk.LabelFrame(center_frame, text="接龙历史", padding="10")
        history_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        history_frame.columnconfigure(0, weight=1)
        history_frame.rowconfigure(0, weight=1)
        
        # 创建滚动文本框显示历史
        self.history_text = scrolledtext.ScrolledText(
            history_frame,
            width=40,
            height=20,
            font=('Microsoft YaHei', 11),
            bg=self.colors['history_bg'],
            relief=tk.FLAT
        )
        self.history_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 禁用编辑
        self.history_text.config(state=tk.DISABLED)
        
        # 右侧：提示和统计
        right_frame = ttk.Frame(main_frame)
        right_frame.grid(row=1, column=2, sticky=(tk.W, tk.N, tk.S), padx=(20, 0))
        
        # 提示区域
        hint_frame = ttk.LabelFrame(right_frame, text="提示", padding="10")
        hint_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.hint_label = tk.Label(
            hint_frame,
            text="暂无提示",
            font=('Microsoft YaHei', 12),
            fg=self.colors['hint'],
            wraplength=200
        )
        self.hint_label.pack()
        
        # 统计信息
        stats_frame = ttk.LabelFrame(right_frame, text="统计信息", padding="10")
        stats_frame.pack(fill=tk.X, pady=(0, 10))
        
        self.stats_labels = {}
        stats_items = [
            ("游戏时长", "0秒"),
            ("接龙长度", "0"),
            ("已用成语", "0"),
            ("剩余成语", str(len(self.all_idioms))),
            ("正确率", "0%"),
            ("平均用时", "0秒/个")
        ]
        
        for text, value in stats_items:
            frame = ttk.Frame(stats_frame)
            frame.pack(fill=tk.X, pady=2)
            
            label = tk.Label(
                frame,
                text=text + ":",
                font=('Microsoft YaHei', 9),
                fg=self.colors['fg'],
                width=10,
                anchor=tk.W
            )
            label.pack(side=tk.LEFT)
            
            value_label = tk.Label(
                frame,
                text=value,
                font=('Microsoft YaHei', 9, 'bold'),
                fg=self.colors['accent']
            )
            value_label.pack(side=tk.LEFT, padx=(5, 0))
            self.stats_labels[text] = value_label
        
        # 消息显示
        self.message_label = tk.Label(
            right_frame,
            text="",
            font=('Microsoft YaHei', 10),
            fg=self.colors['accent'],
            wraplength=200
        )
        self.message_label.pack(fill=tk.X, pady=(10, 0))
        
        # 底部状态栏
        status_frame = ttk.Frame(main_frame, relief=tk.SUNKEN, padding="5")
        status_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=(20, 0))
        
        self.status_label = tk.Label(
            status_frame,
            text="就绪 | 成语接龙游戏 v2.0 | 按F1查看帮助",
            font=('Microsoft YaHei', 9),
            fg='gray'
        )
        self.status_label.pack(side=tk.LEFT)
        
        # 进度条
        self.progress_var = tk.DoubleVar()
        self.progress_bar = ttk.Progressbar(
            status_frame,
            variable=self.progress_var,
            maximum=len(self.all_idioms)
        )
        self.progress_bar.pack(side=tk.RIGHT, fill=tk.X, padx=(10, 0), expand=True)
    
    def setup_shortcuts(self):
        """设置快捷键"""
        self.root.bind('<Return>', lambda e: self.submit_idiom())
        self.root.bind('<F1>', lambda e: self.show_rules())
        self.root.bind('<F2>', lambda e: self.start_game())
        self.root.bind('<F3>', lambda e: self.get_hint())
        self.root.bind('<F5>', lambda e: self.restart_game())
        self.root.bind('<Escape>', lambda e: self.exit_game())
        self.input_entry.bind('<Key>', self.on_key_press)
    
    def on_key_press(self, event):
        """处理键盘输入"""
        # 限制只能输入中文
        if event.char and not ('\u4e00' <= event.char <= '\u9fff'):
            return "break"
    
    def start_game(self):
        """开始游戏"""
        if not self.game_active:
            self.reset_game()
            self.game_active = True
            self.start_time = datetime.now()
            
            # 随机选择起始成语
            self.current_idiom = random.choice(self.all_idioms)
            self.history.append(self.current_idiom)
            self.used_idioms.add(self.current_idiom)
            self.last_char = self.current_idiom[-1]
            
            # 更新显示
            self.update_display()
            self.show_message(f"游戏开始！起始成语：{self.current_idiom}", "success")
            
            # 启动计时器
            self.update_timer()
    
    def submit_idiom(self):
        """提交成语"""
        if not self.game_active or self.game_over:
            return
        
        idiom = self.input_var.get().strip()
        self.input_var.set("")
        
        if not idiom:
            self.show_message("请输入一个成语！", "warning")
            return
        
        # 验证成语
        is_valid, message = self.validate_idiom(idiom)
        
        if is_valid:
            # 成功
            self.score += 10
            self.history.append(idiom)
            self.used_idioms.add(idiom)
            self.current_idiom = idiom
            self.last_char = idiom[-1]
            self.hint_used = False
            self.hint_idiom = ""
            
            self.show_message(f"✓ 正确！+10分 (当前分数: {self.score})", "success")
        else:
            # 失败
            self.score = max(0, self.score - 5)
            self.show_message(f"✗ {message} (-5分)", "error")
        
        # 更新显示
        self.update_display()
        
        # 检查游戏是否应该结束
        if not self.has_valid_move():
            self.end_game("没有可用的接龙成语了！")
    
    def validate_idiom(self, idiom):
        """验证成语"""
        if len(idiom) != 4:
            return False, "成语必须是4个字"
        
        if idiom in self.used_idioms:
            return False, "这个成语已经用过了"
        
        if idiom not in self.all_idioms:
            return False, "这不是一个有效的成语"
        
        if idiom[0] != self.last_char:
            return False, f"请接以'{self.last_char}'开头的成语"
        
        return True, "验证通过"
    
    def get_hint(self):
        """获取提示"""
        if not self.game_active or self.game_over or self.hint_used:
            return
        
        if self.last_char in self.idiom_dict:
            # 找到可用的成语
            available = []
            for idiom in self.idiom_dict[self.last_char]:
                if idiom not in self.used_idioms:
                    available.append(idiom)
            
            if available:
                self.hint_idiom = random.choice(available)
                self.hint_used = True
                self.score = max(0, self.score - 5)
                self.show_message(f"💡 提示：{self.hint_idiom} (-5分)", "hint")
            else:
                self.show_message("没有可用的成语了！", "warning")
        else:
            self.show_message("没有以这个字开头的成语！", "warning")
        
        self.update_display()
    
    def has_valid_move(self):
        """检查是否还有合法走法"""
        if self.last_char in self.idiom_dict:
            for idiom in self.idiom_dict[self.last_char]:
                if idiom not in self.used_idioms:
                    return True
        return False
    
    def end_game(self, reason=""):
        """结束游戏"""
        self.game_active = False
        self.game_over = True
        
        if self.start_time:
            self.total_time = (datetime.now() - self.start_time).total_seconds()
        
        # 显示结束消息
        message = f"游戏结束！\n最终得分: {self.score}\n接龙长度: {len(self.history)}"
        if reason:
            message = f"{reason}\n{message}"
        
        self.show_message(message, "accent")
        messagebox.showinfo("游戏结束", message)
    
    def restart_game(self):
        """重新开始游戏"""
        if messagebox.askyesno("重新开始", "确定要重新开始游戏吗？"):
            self.start_game()
    
    def toggle_difficulty(self):
        """切换难度"""
        difficulties = ["简单", "普通", "困难", "专家"]
        current_index = difficulties.index(self.difficulty)
        self.difficulty = difficulties[(current_index + 1) % len(difficulties)]
        self.show_message(f"难度已切换为: {self.difficulty}", "accent")
        self.update_display()
    
    def show_idiom_list(self):
        """显示词库列表"""
        # 创建新窗口
        list_window = tk.Toplevel(self.root)
        list_window.title(f"成语词库 (共{len(self.all_idioms)}个)")
        list_window.geometry("600x400")
        
        # 搜索框
        search_frame = ttk.Frame(list_window, padding="10")
        search_frame.pack(fill=tk.X)
        
        search_var = tk.StringVar()
        search_entry = ttk.Entry(search_frame, textvariable=search_var, width=30)
        search_entry.pack(side=tk.LEFT, padx=(0, 10))
        
        search_button = ttk.Button(search_frame, text="搜索", 
                                 command=lambda: self.search_idioms(search_var.get(), list_text))
        search_button.pack(side=tk.LEFT)
        
        # 词库列表
        list_frame = ttk.Frame(list_window)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))
        
        list_text = scrolledtext.ScrolledText(
            list_frame,
            width=60,
            height=20,
            font=('Microsoft YaHei', 10)
        )
        list_text.pack(fill=tk.BOTH, expand=True)
        
        # 显示所有成语
        self.update_idiom_list(list_text, self.all_idioms)
        
        # 绑定搜索
        search_entry.bind('<KeyRelease>', 
                         lambda e: self.search_idioms(search_var.get(), list_text))
    
    def search_idioms(self, keyword, text_widget):
        """搜索成语"""
        if not keyword:
            self.update_idiom_list(text_widget, self.all_idioms)
        else:
            results = [idiom for idiom in self.all_idioms if keyword in idiom]
            self.update_idiom_list(text_widget, results, keyword)
    
    def update_idiom_list(self, text_widget, idioms, highlight=""):
        """更新词库列表显示"""
        text_widget.delete(1.0, tk.END)
        
        if not idioms:
            text_widget.insert(tk.END, "没有找到匹配的成语")
            return
        
        # 按拼音排序
        idioms.sort()
        
        # 显示成语
        for i, idiom in enumerate(idioms, 1):
            if highlight and highlight in idiom:
                # 高亮显示匹配部分
                start_idx = idiom.find(highlight)
                end_idx = start_idx + len(highlight)
                text_widget.insert(tk.END, f"{i:4d}. ")
                text_widget.insert(tk.END, idiom[:start_idx])
                text_widget.insert(tk.END, idiom[start_idx:end_idx], 'highlight')
                text_widget.insert(tk.END, idiom[end_idx:])
            else:
                text_widget.insert(tk.END, f"{i:4d}. {idiom}")
            
            text_widget.insert(tk.END, "\n")
        
        # 配置高亮样式
        text_widget.tag_config('highlight', background='yellow')
        
        text_widget.config(state=tk.DISABLED)
    
    def show_rules(self):
        """显示游戏规则"""
        rules = """
成语接龙游戏规则：

1. 游戏目标
   - 在60秒内获得尽可能高的分数
   - 创造最长的成语接龙链

2. 基本规则
   - 每个成语必须是4个字
   - 必须接上一个成语的最后一个字
   - 不能重复使用已用过的成语
   - 成语必须在词库中

3. 得分规则
   - 正确接龙：+10分
   - 错误接龙：-5分
   - 使用提示：-5分

4. 游戏控制
   - 回车键：提交成语
   - F1键：查看帮助
   - F2键：开始游戏
   - F3键：获取提示
   - F5键：重新开始
   - ESC键：退出游戏

5. 难度说明
   - 简单：有更多常见成语
   - 普通：标准词库
   - 困难：包含生僻成语
   - 专家：时间更短，词库更大

祝您游戏愉快！
        """
        messagebox.showinfo("游戏规则", rules)
    
    def exit_game(self):
        """退出游戏"""
        if messagebox.askyesno("退出游戏", "确定要退出游戏吗？"):
            self.root.quit()
    
    def show_message(self, message, msg_type="info"):
        """显示消息"""
        colors = {
            "success": "green",
            "error": "red",
            "warning": "orange",
            "hint": "#f39c12",
            "accent": "#3498db",
            "info": self.colors['fg']
        }
        
        self.message_label.config(
            text=message,
            fg=colors.get(msg_type, self.colors['fg'])
        )
    
    def update_timer(self):
        """更新计时器"""
        if self.game_active and not self.game_over:
            if self.start_time:
                elapsed = (datetime.now() - self.start_time).total_seconds()
                self.time_left = max(0, 60 - elapsed)
                
                if self.time_left <= 0:
                    self.end_game("时间到！")
                else:
                    # 每秒更新一次
                    self.root.after(1000, self.update_timer)
            
            self.update_display()
    
    def update_display(self):
        """更新所有显示"""
        # 更新分数和时间
        self.score_label.config(text=f"分数: {self.score}")
        self.time_label.config(text=f"剩余时间: {int(self.time_left)}秒")
        self.difficulty_label.config(text=f"难度: {self.difficulty}")
        
        # 更新当前成语
        if self.current_idiom:
            self.current_idiom_label.config(text=self.current_idiom)
            self.next_char_label.config(text=f"请接以「{self.last_char}」开头的成语")
        else:
            self.current_idiom_label.config(text="等待开始...")
            self.next_char_label.config(text="请点击'开始游戏'")
        
        # 更新历史记录
        self.history_text.config(state=tk.NORMAL)
        self.history_text.delete(1.0, tk.END)
        
        for i, idiom in enumerate(self.history, 1):
            idx = len(self.history) - i + 1
            if i == 1:  # 最新一个
                self.history_text.insert(tk.END, f"{idx:3d}. {idiom} ← 当前\n", 'current')
            else:
                self.history_text.insert(tk.END, f"{idx:3d}. {idiom}\n")
        
        self.history_text.tag_config('current', foreground='blue', font=('Microsoft YaHei', 11, 'bold'))
        self.history_text.config(state=tk.DISABLED)
        self.history_text.see(tk.END)  # 滚动到底部
        
        # 更新提示
        if self.hint_idiom:
            self.hint_label.config(text=f"提示：{self.hint_idiom}")
        else:
            self.hint_label.config(text="暂无提示\n点击'获取提示'获取帮助")
        
        # 更新统计信息
        if self.start_time and self.game_active:
            elapsed = (datetime.now() - self.start_time).total_seconds()
            self.stats_labels["游戏时长"].config(text=f"{int(elapsed)}秒")
        
        self.stats_labels["接龙长度"].config(text=str(len(self.history)))
        self.stats_labels["已用成语"].config(text=str(len(self.used_idioms)))
        self.stats_labels["剩余成语"].config(text=str(len(self.all_idioms) - len(self.used_idioms)))
        
        if len(self.history) > 1:
            correct_rate = 100  # 简化计算
            self.stats_labels["正确率"].config(text=f"{correct_rate}%")
            
            if elapsed > 0:
                avg_time = elapsed / (len(self.history) - 1)
                self.stats_labels["平均用时"].config(text=f"{avg_time:.1f}秒/个")
        
        # 更新进度条
        self.progress_var.set(len(self.used_idioms))
        self.progress_bar.config(maximum=len(self.all_idioms))
        
        # 更新状态栏
        if self.game_active:
            status = f"游戏中 | 分数: {self.score} | 剩余时间: {int(self.time_left)}秒"
        elif self.game_over:
            status = f"游戏结束 | 最终分数: {self.score} | 按F2重新开始"
        else:
            status = "就绪 | 按F2开始游戏 | 按F1查看帮助"
        
        self.status_label.config(text=status)
    
    def run(self):
        """运行游戏"""
        self.root.mainloop()

def main():
    """主函数"""
    print("=" * 50)
    print("成语接龙游戏启动")
    print("=" * 50)
    print("游戏说明:")
    print("1. 输入以当前成语最后一个字开头的成语")
    print("2. 按回车键提交")
    print("3. 按F3键获取提示")
    print("4. 按F5键重新开始")
    print("5. 按ESC键退出游戏")
    print("=" * 50)
    
    root = tk.Tk()
    game = IdiomSolitaireGame(root)
    game.run()

if __name__ == "__main__":
    main()