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

# ---------- 游戏核心数据 ----------
class Hero:
    def __init__(self):
        self.name = "凯恩"
        self.hp = 100
        self.max_hp = 100
        self.atk = 15
        self.defense = 5
        self.gold = 0
        self.inventory = []
        self.alive = True
        self.dragon_trust = 50

    def is_alive(self):
        return self.hp > 0

    def take_damage(self, damage):
        actual = max(1, damage - self.defense)
        self.hp -= actual
        if self.hp < 0:
            self.hp = 0
            self.alive = False
        return actual

    def heal(self, amount):
        self.hp = min(self.max_hp, self.hp + amount)

    def add_item(self, item):
        self.inventory.append(item)

    def has_item(self, item):
        return item in self.inventory


# ---------- GUI 主程序 ----------
class DragonRiderGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("🐉 骑龙勇士历险记")
        self.root.geometry("720x600")
        self.root.resizable(False, False)

        self.hero = Hero()
        self.flags = {"forest_done": False, "castle_done": False}
        self.battle_active = False  # 是否在战斗中
        self.enemy = None           # 当前敌人数据

        self.setup_ui()
        self.start_game()

    # ---------- 界面布局 ----------
    def setup_ui(self):
        # 状态栏
        self.status_frame = tk.Frame(self.root, bg="#f0f0f0")
        self.status_frame.pack(fill=tk.X, pady=5)

        self.status_labels = {}
        stats = [("❤️ HP", "hp"), ("⚔️ 攻击", "atk"), ("🛡️ 防御", "def"),
                 ("💰 金币", "gold"), ("🐉 信任", "trust")]
        for i, (label, key) in enumerate(stats):
            lbl = tk.Label(self.status_frame, text=f"{label}: ", font=("Arial", 10, "bold"), bg="#f0f0f0")
            lbl.grid(row=0, column=i*2, padx=5, pady=2, sticky="w")
            val = tk.Label(self.status_frame, text="", font=("Arial", 10), bg="#f0f0f0", width=8)
            val.grid(row=0, column=i*2+1, padx=5, pady=2, sticky="w")
            self.status_labels[key] = val

        # 日志显示区
        self.log_text = scrolledtext.ScrolledText(self.root, width=80, height=18, font=("Consolas", 10),
                                                  state='disabled', bg="#fefefe")
        self.log_text.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)

        # 按钮区域
        self.button_frame = tk.Frame(self.root)
        self.button_frame.pack(pady=10)

        self.update_status()

    # ---------- 辅助方法 ----------
    def log(self, msg):
        self.log_text.config(state='normal')
        self.log_text.insert(tk.END, msg + "\n")
        self.log_text.see(tk.END)
        self.log_text.config(state='disabled')

    def clear_buttons(self):
        for widget in self.button_frame.winfo_children():
            widget.destroy()

    def update_status(self):
        h = self.hero
        self.status_labels["hp"].config(text=f"{h.hp}/{h.max_hp}")
        self.status_labels["atk"].config(text=str(h.atk))
        self.status_labels["def"].config(text=str(h.defense))
        self.status_labels["gold"].config(text=str(h.gold))
        self.status_labels["trust"].config(text=str(h.dragon_trust))

    def show_options(self, options):
        """options: [(按钮文本, 回调函数), ...]"""
        self.clear_buttons()
        for text, cmd in options:
            btn = tk.Button(self.button_frame, text=text, command=cmd, width=18, bg="#e0e0e0")
            btn.pack(side=tk.LEFT, padx=4, pady=2)

    # ---------- 场景导航 ----------
    def start_game(self):
        self.log("🐉 欢迎来到骑龙勇士历险记！")
        self.log("你，凯恩，是大陆上唯一能与龙交流的勇士...")
        self.log("你的龙伙伴——‘烈焰之心’正翱翔于天际。")
        self.go_main_hub()

    def go_main_hub(self):
        self.log("\n--- 云端之上 ---")
        self.log("前方有三个地方可以去：")
        options = [
            ("🏡 云端村落（主线）", self.scene_village),
            ("🌲 暗影森林（探险）", self.scene_forest),
            ("🏰 荒废城堡（宝物）", self.scene_castle),
            ("🐉 与龙交流", self.interact_dragon),
            ("🎒 查看背包", self.show_inventory)
        ]
        self.show_options(options)
        self.update_status()

    # ---------- 具体场景 ----------
    def scene_village(self):
        self.log("\n🌤️ 你骑着巨龙飞过云端村落。")
        self.log("长老说：'西方的暗影火山正在喷发，只有骑龙勇士才能平息它。'")
        options = [
            ("接受任务，前往火山", self.enter_volcano),
            ("在集市闲逛（恢复）", self.market_heal)
        ]
        self.show_options(options)

    def market_heal(self):
        self.log("🛒 你在集市买了干粮和药水。")
        self.hero.heal(30)
        self.hero.add_item("治疗药水")
        self.hero.gold -= 10
        self.log("❤️ 恢复了30点生命，获得治疗药水。")
        self.go_main_hub()

    def enter_volcano(self):
        self.log("\n🌋 你振翅高飞，向暗影火山前进...")
        self.log("暗影火山口，岩浆沸腾。")
        self.log("黑魔王出现了：'愚蠢的骑龙者，你以为你能阻止我吗？'")

        # 检查结局条件
        if self.hero.has_item("龙鳞护符") and self.hero.dragon_trust > 70:
            self.log("🌟 你与巨龙心意相通，护符爆发光芒，黑魔王被封印！")
            self.log("🏆 完美结局：你成为了传说中的龙骑大英雄，世界重归和平！")
            self.game_over("完美结局")
            return
        elif self.hero.dragon_trust > 50:
            self.log("🔥 巨龙奋力喷吐火焰，你们勉强击败了黑魔王，但火山即将爆发。")
            self.log("🏆 普通结局：你拯救了世界，但火山灰覆盖了半个大陆。")
            self.game_over("普通结局")
            return
        else:
            self.log("💢 由于信任度不足，巨龙抛下你飞走了！你只能独自应战！")
            self.hero.atk -= 5
            # 进入BOSS战
            self.start_battle("黑魔王", 100, 25, 50, "传说之剑", self.boss_end)

    def boss_end(self, victory):
        if victory:
            self.log("🏆 悲壮结局：你虽然击败了黑魔王，但失去了龙伙伴。")
            self.game_over("悲壮结局")
        else:
            self.log("💀 游戏结束：世界陷入了永久的黑暗...")
            self.game_over("战败")

    def scene_forest(self):
        if self.flags["forest_done"]:
            self.log("森林里的怪物已经被你清除了，继续前进吧。")
            self.go_main_hub()
            return
        self.log("\n🌲 你降落在暗影森林中歇脚，四周弥漫着雾气。")
        self.log("突然，一条巨大的毒蟒挡住了去路！")
        if self.hero.has_item("龙鳞护符"):
            self.log("✨ 龙鳞护符发出光芒，毒蟒畏惧地让开了路。")
            self.hero.dragon_trust += 10
            self.flags["forest_done"] = True
            self.go_main_hub()
        else:
            self.start_battle("暗影毒蟒", 60, 18, 30, "解毒草", self.forest_end)

    def forest_end(self, victory):
        if victory:
            self.flags["forest_done"] = True
            self.hero.dragon_trust += 5
            self.log("🌿 你成功通过了森林。")
        self.go_main_hub()

    def scene_castle(self):
        if self.flags["castle_done"]:
            self.log("城堡已经空无一人。")
            self.go_main_hub()
            return
        self.log("\n🏰 城堡里有一位被囚禁的精灵。")
        self.log("她请求你释放她，但守卫是石像鬼。")
        self.start_battle("石像鬼", 50, 15, 25, "龙鳞护符", self.castle_end)

    def castle_end(self, victory):
        if victory:
            self.flags["castle_done"] = True
            self.hero.dragon_trust += 15
            self.log("🧚 精灵给了你龙族秘宝作为报答！")
        self.go_main_hub()

    # ---------- 交互 ----------
    def interact_dragon(self):
        self.log("🐉 你抚摸着巨龙的鳞片，与它心灵对话。")
        gain = random.randint(5, 15)
        self.hero.dragon_trust = min(100, self.hero.dragon_trust + gain)
        self.log(f"信任度增加了 {gain}！")
        if random.random() < 0.1:
            self.log("🎁 龙从嘴里吐出一颗宝石给你！")
            self.hero.gold += 50
        self.update_status()
        self.go_main_hub()

    def show_inventory(self):
        items = ', '.join(self.hero.inventory) if self.hero.inventory else "空空如也"
        self.log(f"🎒 背包: {items}")
        self.log(f"💰 金币: {self.hero.gold}")
        self.go_main_hub()

    # ---------- 战斗系统（GUI回合制） ----------
    def start_battle(self, enemy_name, enemy_hp, enemy_atk, reward_gold, reward_item, on_end):
        self.battle_active = True
        self.enemy = {
            "name": enemy_name,
            "hp": enemy_hp,
            "max_hp": enemy_hp,
            "atk": enemy_atk,
            "reward_gold": reward_gold,
            "reward_item": reward_item,
            "on_end": on_end
        }
        self.log(f"\n⚔️ 遭遇敌人：{enemy_name}！HP: {enemy_hp}")
        self.show_battle_buttons()

    def show_battle_buttons(self):
        options = [
            ("🗡️ 攻击", self.battle_attack),
            ("🛡️ 防御", self.battle_defend),
            ("🐉 龙之吐息", self.battle_dragon_breath)
        ]
        self.clear_buttons()
        for text, cmd in options:
            btn = tk.Button(self.button_frame, text=text, command=cmd, width=18, bg="#ffcccc")
            btn.pack(side=tk.LEFT, padx=4, pady=2)
        self.update_status()

    def battle_attack(self):
        if not self.battle_active:
            return
        damage = random.randint(self.hero.atk - 5, self.hero.atk + 5)
        self.enemy["hp"] -= damage
        self.log(f"🗡️ 你造成 {damage} 点伤害！")
        self.enemy_turn()
        self.update_battle_ui()

    def battle_defend(self):
        if not self.battle_active:
            return
        self.log("🛡️ 你采取防御姿态，本回合受伤减半。")
        # 临时加防
        old_def = self.hero.defense
        self.hero.defense += 10
        self.enemy_turn()
        self.hero.defense = old_def
        self.update_battle_ui()

    def battle_dragon_breath(self):
        if not self.battle_active:
            return
        if self.hero.dragon_trust >= 60:
            damage = random.randint(30, 50)
            self.enemy["hp"] -= damage
            self.log(f"🐉 巨龙吐出烈焰，造成 {damage} 点巨额伤害！")
            self.hero.dragon_trust -= 5
            self.enemy_turn()
        else:
            self.log("❌ 龙的信任度不足，它不理会你的请求！")
        self.update_battle_ui()

    def enemy_turn(self):
        if not self.battle_active:
            return
        e = self.enemy
        if e["hp"] <= 0:
            self.battle_victory()
            return
        dmg = random.randint(e["atk"] - 3, e["atk"] + 3)
        if random.random() < 0.2:
            dmg = int(dmg * 1.5)
            self.log(f"💢 {e['name']} 发动了暴击！")
        self.hero.take_damage(dmg)
        self.log(f"👾 {e['name']} 对你造成 {dmg} 点伤害。")
        if not self.hero.is_alive():
            self.battle_defeat()

    def update_battle_ui(self):
        if self.battle_active:
            self.log(f"👾 {self.enemy['name']} HP: {self.enemy['hp']}/{self.enemy['max_hp']}")
        self.update_status()
        # 如果敌人或英雄死亡，战斗已结束
        if not self.battle_active:
            return
        if self.enemy["hp"] <= 0:
            self.battle_victory()
        elif not self.hero.is_alive():
            self.battle_defeat()

    def battle_victory(self):
        if not self.battle_active:
            return
        self.battle_active = False
        self.log(f"\n🎉 击败了 {self.enemy['name']}！")
        self.hero.gold += self.enemy["reward_gold"]
        self.log(f"💰 获得 {self.enemy['reward_gold']} 金币。")
        if self.enemy["reward_item"]:
            self.hero.add_item(self.enemy["reward_item"])
            self.log(f"🎒 获得道具：{self.enemy['reward_item']}！")
        # 随机额外掉落
        if random.random() < 0.3:
            bonus = random.choice(["力量药水", "龙鳞护符"])
            self.hero.add_item(bonus)
            self.log(f"🎁 额外获得：{bonus}")
            if bonus == "力量药水":
                self.hero.atk += 3
                self.log("💪 攻击力永久提升！")
        self.update_status()
        # 调用结束回调
        on_end = self.enemy.get("on_end")
        if on_end:
            on_end(True)
        else:
            self.go_main_hub()

    def battle_defeat(self):
        if not self.battle_active:
            return
        self.battle_active = False
        self.log(f"😵 你被 {self.enemy['name']} 击败了...")
        self.hero.alive = False
        self.update_status()
        on_end = self.enemy.get("on_end")
        if on_end:
            on_end(False)
        else:
            self.game_over("战败")

    # ---------- 游戏结束 ----------
    def game_over(self, title="游戏结束"):
        self.clear_buttons()
        self.log(f"\n=== {title} ===")
        self.log("感谢游玩！")
        btn = tk.Button(self.button_frame, text="🔄 重新开始", command=self.restart_game, width=20, bg="#ffaa00")
        btn.pack(side=tk.LEFT, padx=5)
        btn2 = tk.Button(self.button_frame, text="❌ 退出", command=self.root.quit, width=20, bg="#ff6666")
        btn2.pack(side=tk.LEFT, padx=5)

    def restart_game(self):
        # 重置所有状态
        self.hero = Hero()
        self.flags = {"forest_done": False, "castle_done": False}
        self.battle_active = False
        self.enemy = None
        self.log_text.config(state='normal')
        self.log_text.delete(1.0, tk.END)
        self.log_text.config(state='disabled')
        self.start_game()


# ---------- 启动 ----------
if __name__ == "__main__":
    root = tk.Tk()
    app = DragonRiderGUI(root)
    root.mainloop()