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("成语接龙游戏")
        self.root.geometry("800x600")

        # 设置图标和样式
        self.root.configure(bg="#f0f0f0")
        self.setup_styles()

        # 加载成语数据
        self.idioms = self.load_idioms()

        # 游戏状态
        self.used_idioms = set()
        self.current_idiom = None
        self.game_history = []
        self.player_score = 0
        self.computer_score = 0
        self.player_turn = True
        self.game_started = False

        # 创建界面
        self.create_widgets()

        # 初始化游戏
        self.setup_game()

    def setup_styles(self):
        """设置界面样式"""
        style = ttk.Style()
        style.theme_use('clam')

        # 自定义颜色
        self.bg_color = "#f0f0f0"
        self.frame_bg = "#ffffff"
        self.button_bg = "#4CAF50"
        self.button_fg = "white"
        self.highlight_color = "#FF9800"
        self.text_bg = "#f5f5f5"

    def load_idioms(self):
        """加载成语数据"""
        idioms_list = [
            "一心一意", "一马当先", "一帆风顺", "一见钟情", "一举两得", "一鸣惊人", "一鼓作气", "一箭双雕",
            "意味深长", "意气风发", "意料之外", "意气用事", "意犹未尽", "意气相投", "意在言外", "意乱情迷",
            "长年累月", "长风破浪", "长篇大论", "长生不老", "长驱直入", "长治久安", "长此以往", "长相厮守",
            "月明星稀", "月下老人", "月满则亏", "月黑风高", "月白风清", "月落星沉", "月缺花残", "月晕而风",
            "高山流水", "高瞻远瞩", "高枕无忧", "高高在上", "高谈阔论", "高风亮节", "高歌猛进", "高人一等",
            "上行下效", "上下一心", "上天入地", "上善若水", "上蹿下跳", "上下其手", "上行下效", "上当受骗",
            "水到渠成", "水落石出", "水滴石穿", "水涨船高", "水乳交融", "水泄不通", "水火不容", "水月镜花",
            "成竹在胸", "成人之美", "成千上万", "成败得失", "成家立业", "成年累月", "成双成对", "成王败寇",
            "万紫千红", "万众一心", "万无一失", "万水千山", "万象更新", "万籁俱寂", "万不得已", "万念俱灰",
            "山清水秀", "山高水长", "山穷水尽", "山盟海誓", "山崩地裂", "山珍海味", "山高水低", "山遥路远",
            "尽心尽力", "尽善尽美", "尽如人意", "尽力而为", "尽收眼底", "尽人皆知", "尽忠报国", "尽其所能",
            "为人师表", "为非作歹", "为所欲为", "为期不远", "为民除害", "为虎作伥", "为人父母", "为国为民",
            "远见卓识", "远走高飞", "远亲近邻", "远交近攻", "远渡重洋", "远水近火", "远在天边", "远涉重洋",
            "飞黄腾达", "飞檐走壁", "飞沙走石", "飞短流长", "飞扬跋扈", "飞禽走兽", "飞蛾扑火", "飞针走线",
            "长篇大论", "长治久安", "长驱直入", "长此以往", "长生不老", "长江后浪", "长年累月", "长风破浪",
            "事在人为", "事与愿违", "事无巨细", "事半功倍", "事出有因", "事不过三", "事实胜于", "事不关己",
            "为所欲为", "为非作歹", "为虎作伥", "为民除害", "为富不仁", "为期不远", "为人师表", "为国为民",
            "人山人海", "人定胜天", "人云亦云", "人杰地灵", "人面兽心", "人心所向", "人言可畏", "人微言轻",
            "海阔天空", "海底捞月", "海市蜃楼", "海纳百川", "海枯石烂", "海誓山盟", "海角天涯", "海内无双",
            "空前绝后", "空穴来风", "空中楼阁", "空谷幽兰", "空口无凭", "空前未有", "空空如也", "空头支票",
            "后来居上", "后发制人", "后会有期", "后顾之忧", "后继有人", "后生可畏", "后起之秀", "后来之人",
            "上善若水", "上行下效", "上天入地", "上下同心", "上蹿下跳", "上当受骗", "上下一心", "上吐下泻",
            "水木清华", "水深火热", "水到渠成", "水滴石穿", "水落石出", "水乳交融", "水泄不通", "水火无情",
            "火树银花", "火中取栗", "火烧眉毛", "火眼金睛", "火冒三丈", "火上浇油", "火耕水耨", "火伞高张",
            "花好月圆", "花容月貌", "花前月下", "花团锦簇", "花言巧语", "花枝招展", "花花公子", "花天酒地",
            "圆圆满满", "圆颅方趾", "圆孔方木", "圆凿方枘", "圆首方足", "圆通自在", "圆明上座", "圆通大士",
            "地久天长", "地大物博", "地动山摇", "地广人稀", "地利人和", "地覆天翻", "地老天荒", "地灵人杰",
            "天经地义", "天衣无缝", "天马行空", "天壤之别", "天罗地网", "天南海北", "天花乱坠", "天高地厚",
        ]

        # 创建索引字典
        idioms_dict = defaultdict(list)
        for idiom in idioms_list:
            if len(idiom) == 4:  # 确保是四字成语
                first_char = idiom[0]
                idioms_dict[first_char].append(idiom)

        return idioms_dict

    def create_widgets(self):
        """创建界面组件"""
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="20")
        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(0, weight=1)
        main_frame.rowconfigure(4, weight=1)

        # 标题
        title_label = ttk.Label(
            main_frame,
            text="成语接龙游戏",
            font=("微软雅黑", 24, "bold"),
            foreground="#2196F3"
        )
        title_label.grid(row=0, column=0, columnspan=3, pady=(0, 20))

        # 游戏信息区域
        info_frame = ttk.LabelFrame(main_frame, text="游戏信息", padding="10")
        info_frame.grid(row=1, column=0, columnspan=3,
                        sticky=(tk.W, tk.E), pady=(0, 10))
        info_frame.columnconfigure(1, weight=1)

        # 当前成语
        self.current_label = ttk.Label(
            info_frame,
            text="当前成语: 无",
            font=("宋体", 16, "bold"),
            foreground="#FF5722"
        )
        self.current_label.grid(
            row=0, column=0, columnspan=2, sticky=tk.W, pady=5)

        # 下一个成语要求
        self.next_label = ttk.Label(
            info_frame,
            text="下一个成语需要以: 任意字开头",
            font=("宋体", 14)
        )
        self.next_label.grid(
            row=1, column=0, columnspan=2, sticky=tk.W, pady=5)

        # 得分
        score_frame = ttk.Frame(info_frame)
        score_frame.grid(row=2, column=0, columnspan=2, sticky=tk.W, pady=5)

        self.player_score_label = ttk.Label(
            score_frame,
            text="玩家: 0",
            font=("宋体", 12, "bold"),
            foreground="#4CAF50"
        )
        self.player_score_label.pack(side=tk.LEFT, padx=(0, 20))

        self.computer_score_label = ttk.Label(
            score_frame,
            text="电脑: 0",
            font=("宋体", 12, "bold"),
            foreground="#F44336"
        )
        self.computer_score_label.pack(side=tk.LEFT)

        # 当前回合
        self.turn_label = ttk.Label(
            info_frame,
            text="当前回合: 玩家",
            font=("宋体", 12),
            foreground="#2196F3"
        )
        self.turn_label.grid(
            row=3, column=0, columnspan=2, sticky=tk.W, pady=5)

        # 输入区域
        input_frame = ttk.LabelFrame(main_frame, text="输入成语", padding="10")
        input_frame.grid(row=2, column=0, columnspan=3,
                         sticky=(tk.W, tk.E), pady=(0, 10))

        # 输入框
        ttk.Label(input_frame, text="请输入四字成语:", font=(
            "宋体", 12)).grid(row=0, column=0, sticky=tk.W)

        self.idiom_entry = ttk.Entry(input_frame, width=30, font=("宋体", 12))
        self.idiom_entry.grid(row=0, column=1, padx=(10, 5))

        # 提交按钮
        self.submit_button = ttk.Button(
            input_frame,
            text="提交",
            command=self.submit_idiom,
            width=10
        )
        self.submit_button.grid(row=0, column=2, padx=5)

        # 绑定回车键
        self.idiom_entry.bind('<Return>', lambda e: self.submit_idiom())

        # 提示标签
        self.hint_label = ttk.Label(
            input_frame,
            text="提示: 输入'随机'让电脑随机选择一个成语开始",
            font=("宋体", 10),
            foreground="#9E9E9E"
        )
        self.hint_label.grid(row=1, column=0, columnspan=3,
                             sticky=tk.W, pady=(10, 0))

        # 提示成语
        self.hint_text = tk.StringVar()
        self.hint_display = ttk.Label(
            input_frame,
            textvariable=self.hint_text,
            font=("宋体", 10),
            foreground="#FF9800"
        )
        self.hint_display.grid(
            row=2, column=0, columnspan=3, sticky=tk.W, pady=(5, 0))

        # 控制按钮区域
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=3, column=0, columnspan=3, pady=(0, 10))

        # 各种按钮
        ttk.Button(button_frame, text="提示", command=self.give_hint,
                   width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(button_frame, text="随机", command=self.random_start,
                   width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(button_frame, text="重新开始", command=self.restart_game,
                   width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(button_frame, text="帮助", command=self.show_help,
                   width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(button_frame, text="退出", command=self.root.quit,
                   width=10).pack(side=tk.LEFT, padx=2)

        # 游戏历史区域
        history_frame = ttk.LabelFrame(main_frame, text="游戏历史", padding="10")
        history_frame.grid(row=4, column=0, columnspan=3,
                           sticky=(tk.W, tk.E, tk.N, tk.S), pady=(0, 10))
        history_frame.columnconfigure(0, weight=1)
        history_frame.rowconfigure(0, weight=1)

        # 历史记录文本框
        self.history_text = scrolledtext.ScrolledText(
            history_frame,
            width=60,
            height=10,
            font=("宋体", 10),
            wrap=tk.WORD
        )
        self.history_text.grid(
            row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))

        # 状态栏
        self.status_var = tk.StringVar(value="就绪")
        status_bar = ttk.Label(
            main_frame,
            textvariable=self.status_var,
            relief=tk.SUNKEN,
            anchor=tk.W
        )
        status_bar.grid(row=5, column=0, columnspan=3,
                        sticky=(tk.W, tk.E), pady=(10, 0))

    def setup_game(self):
        """初始化游戏"""
        self.update_display()
        self.status_var.set("游戏就绪，请开始游戏！")

    def submit_idiom(self):
        """提交成语"""
        if not self.game_started:
            messagebox.showinfo("提示", "请先点击'随机'按钮或输入一个成语开始游戏！")
            return

        idiom = self.idiom_entry.get().strip()

        if not idiom:
            messagebox.showwarning("警告", "请输入成语！")
            return

        if idiom == "随机":
            self.random_start()
            return

        # 验证成语
        if not self.validate_idiom(idiom):
            return

        # 添加到已用列表
        self.used_idioms.add(idiom)
        self.current_idiom = idiom
        self.game_history.append(("玩家", idiom))
        self.player_score += 1

        # 清空输入框
        self.idiom_entry.delete(0, tk.END)

        # 更新显示
        self.update_display()
        self.status_var.set(f"玩家输入: {idiom}")

        # 检查游戏是否结束
        if self.check_game_over():
            return

        # 切换到电脑回合
        self.player_turn = False
        self.computer_turn()

    def validate_idiom(self, idiom):
        """验证成语有效性"""
        # 检查长度
        if len(idiom) != 4:
            messagebox.showwarning("警告", "成语必须是四个字！")
            return False

        # 检查是否是已知成语
        first_char = idiom[0]
        if idiom not in self.idioms.get(first_char, []):
            messagebox.showwarning("警告", f"'{idiom}' 不是一个有效的成语！")
            return False

        # 检查是否已使用
        if idiom in self.used_idioms:
            messagebox.showwarning("警告", "这个成语已经用过了！")
            return False

        # 检查是否符合接龙规则
        if self.current_idiom and idiom[0] != self.current_idiom[-1]:
            messagebox.showwarning(
                "警告", f"接龙失败！需要以 '{self.current_idiom[-1]}' 开头")
            return False

        return True

    def computer_turn(self):
        """电脑回合"""
        self.status_var.set("电脑正在思考...")
        self.root.update()

        # 模拟思考时间
        self.root.after(1000, self.do_computer_turn)

    def do_computer_turn(self):
        """执行电脑回合"""
        if not self.current_idiom:
            # 随机开始
            all_chars = list(self.idioms.keys())
            start_char = random.choice(all_chars)
            available = [idiom for idiom in self.idioms[start_char]
                         if idiom not in self.used_idioms]
        else:
            start_char = self.current_idiom[-1]
            available = [idiom for idiom in self.idioms.get(
                start_char, []) if idiom not in self.used_idioms]

        if not available:
            # 电脑无法接龙
            self.game_history.append(("电脑", "无法接龙"))
            messagebox.showinfo("游戏结束", "电脑无法接龙，玩家获胜！")
            self.player_score += 5  # 奖励分数
            self.update_display()
            self.status_var.set("游戏结束，玩家获胜！")
            return

        # 随机选择一个成语
        computer_choice = random.choice(available)
        self.used_idioms.add(computer_choice)
        self.current_idiom = computer_choice
        self.game_history.append(("电脑", computer_choice))
        self.computer_score += 1

        # 更新显示
        self.update_display()
        self.status_var.set(f"电脑选择: {computer_choice}")

        # 检查游戏是否结束
        if self.check_game_over():
            return

        # 切换回玩家回合
        self.player_turn = True
        self.idiom_entry.focus()

    def random_start(self):
        """随机开始游戏"""
        if not self.game_started:
            self.game_started = True
            self.status_var.set("游戏开始！")

        all_chars = list(self.idioms.keys())
        start_char = random.choice(all_chars)
        available = [idiom for idiom in self.idioms[start_char]
                     if idiom not in self.used_idioms]

        if not available:
            messagebox.showwarning("警告", "没有可用的成语了，请重新开始游戏！")
            return

        random_idiom = random.choice(available)
        self.used_idioms.add(random_idiom)
        self.current_idiom = random_idiom
        self.game_history.append(("随机", random_idiom))

        self.update_display()
        self.status_var.set(f"随机成语: {random_idiom}")

        # 让玩家开始
        self.player_turn = True

    def give_hint(self):
        """给出提示"""
        if not self.current_idiom:
            messagebox.showinfo("提示", "还没有开始游戏，请输入第一个成语！")
            return

        start_char = self.current_idiom[-1]
        available = [idiom for idiom in self.idioms.get(
            start_char, []) if idiom not in self.used_idioms]

        if not available:
            self.hint_text.set(f"没有以 '{start_char}' 开头的可用成语了！")
        else:
            hints = random.sample(available, min(3, len(available)))
            hint_str = f"可以尝试: {'、'.join(hints)}"
            self.hint_text.set(hint_str)

            # 3秒后清除提示
            self.root.after(5000, lambda: self.hint_text.set(""))

    def check_game_over(self):
        """检查游戏是否结束"""
        if not self.current_idiom:
            return False

        start_char = self.current_idiom[-1]
        available = [idiom for idiom in self.idioms.get(
            start_char, []) if idiom not in self.used_idioms]

        if not available:
            if self.player_turn:
                messagebox.showinfo(
                    "游戏结束", f"玩家无法接上以 '{start_char}' 开头的成语，电脑获胜！")
                self.computer_score += 5
            else:
                messagebox.showinfo(
                    "游戏结束", f"电脑无法接上以 '{start_char}' 开头的成语，玩家获胜！")
                self.player_score += 5

            self.update_display()
            self.status_var.set("游戏结束！")
            return True

        return False

    def update_display(self):
        """更新界面显示"""
        # 更新当前成语
        if self.current_idiom:
            self.current_label.config(text=f"当前成语: {self.current_idiom}")
            self.next_label.config(
                text=f"下一个成语需要以: '{self.current_idiom[-1]}' 开头")
        else:
            self.current_label.config(text="当前成语: 无")
            self.next_label.config(text="下一个成语需要以: 任意字开头")

        # 更新得分
        self.player_score_label.config(text=f"玩家: {self.player_score}")
        self.computer_score_label.config(text=f"电脑: {self.computer_score}")

        # 更新回合显示
        if self.player_turn:
            self.turn_label.config(text="当前回合: 玩家", foreground="#4CAF50")
        else:
            self.turn_label.config(text="当前回合: 电脑", foreground="#F44336")

        # 更新历史记录
        self.history_text.delete(1.0, tk.END)
        for i, (player, idiom) in enumerate(self.game_history, 1):
            if player == "玩家":
                color = "#4CAF50"  # 绿色
            elif player == "电脑":
                color = "#F44336"  # 红色
            else:
                color = "#2196F3"  # 蓝色

            self.history_text.insert(
                tk.END, f"{i:2d}. {player:6s}: ", "normal")
            self.history_text.insert(tk.END, f"{idiom}\n", color)

        # 添加颜色标签
        self.history_text.tag_config("normal", foreground="black")
        self.history_text.tag_config(
            "#4CAF50", foreground="#4CAF50", font=("宋体", 10, "bold"))
        self.history_text.tag_config(
            "#F44336", foreground="#F44336", font=("宋体", 10, "bold"))
        self.history_text.tag_config(
            "#2196F3", foreground="#2196F3", font=("宋体", 10, "bold"))

        # 滚动到底部
        self.history_text.see(tk.END)

    def restart_game(self):
        """重新开始游戏"""
        if messagebox.askyesno("确认", "确定要重新开始游戏吗？"):
            self.used_idioms.clear()
            self.current_idiom = None
            self.game_history.clear()
            self.player_score = 0
            self.computer_score = 0
            self.player_turn = True
            self.game_started = False
            self.hint_text.set("")
            self.idiom_entry.delete(0, tk.END)

            self.update_display()
            self.status_var.set("游戏已重置，请开始新游戏！")

    def show_help(self):
        """显示帮助信息"""
        help_text = """成语接龙游戏规则：

1. 输入一个四字成语
2. 新成语的第一个字必须与上一个成语的最后一个字相同
3. 不能重复使用已用过的成语
4. 谁无法接龙谁就输掉这一局

操作方法：
- 在输入框中输入成语，按回车或点击提交
- 点击"随机"按钮随机开始游戏
- 点击"提示"按钮获取提示
- 点击"重新开始"按钮重置游戏
- 点击"帮助"按钮查看此帮助

提示：
- 输入"随机"可以让电脑随机选择一个成语开始
- 玩家和电脑轮流进行
- 游戏历史记录会显示在下方"""

        messagebox.showinfo("游戏帮助", help_text)


def main():
    """主函数"""
    root = tk.Tk()
    app = IdiomGameGUI(root)

    # 设置窗口居中
    root.update_idletasks()
    width = root.winfo_width()
    height = root.winfo_height()
    x = (root.winfo_screenwidth() // 2) - (width // 2)
    y = (root.winfo_screenheight() // 2) - (height // 2)
    root.geometry(f'{width}x{height}+{x}+{y}')

    # 设置窗口图标（如果有的话）
    try:
        root.iconbitmap('idiom.ico')  # 如果有图标文件的话
    except:
        pass

    root.mainloop()


if __name__ == "__main__":
    main()
