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

class IslandSurvival:
    def __init__(self, root):
        self.root = root
        self.root.title("完整版 荒岛求生 | 战斗+造船逃离")
        self.root.geometry("900x650")
        self.root.resizable(False, False)

        # ========== 核心生存数值 ==========
        self.hp = 100          # 生命值
        self.hunger = 100      # 饥饿值
        self.thirst = 100      # 口渴值
        self.day = 1           # 生存天数
        self.running = True    # 游戏运行状态

        # ========== 场景系统 ==========
        self.location_list = ["沙滩", "密林", "礁石区", "山洞", "淡水溪"]
        self.location = "沙滩"

        # ========== 建筑/通关进度 ==========
        self.build_hut = False       # 小屋（防野兽夜间袭击）
        self.ship_progress = 0       # 造船进度 0-100，满100通关

        # ========== 天气系统 ==========
        self.weather_list = ["晴天", "阴天", "暴雨", "大风", "酷暑"]
        self.weather = "晴天"

        # ========== 全物品系统 ==========
        self.basic_items = ["木材", "石头", "藤蔓", "细树枝"]
        self.food_items = ["野果", "鱼", "熟鱼"]
        self.medicine_items = ["草药", "绷带"]
        self.tool_items = ["火把", "石斧", "长矛","水桶"]
        self.ship_items = ["船板", "船帆", "绳索"]
        self.inventory = []
        self.water_in_bucket = 0 #水桶储水量

        # ========== 战斗属性 ==========
        self.weapon_damage = 5   # 基础徒手伤害
        self.beast_hp = 0
        self.in_battle = False
        self.now_beast = ""

        # ========== 配方表 ==========
        self.recipes = {
            "火把": {"木材":1, "细树枝":1},
            "石斧": {"木材":2, "石头":2, "藤蔓":1},
            "长矛": {"木材":2, "石头":1, "藤蔓":1},
            "绷带": {"草药":2},
            "熟鱼": {"鱼":1, "火把":1},
            "船板": {"木材":4, "藤蔓":2},
            "绳索": {"藤蔓":3},
            "船帆": {"藤蔓":4},
            "水桶":{"木材":3,"藤蔓":2}
        }

        self.init_ui()
        self.add_log("=== 荒岛求生完整版启动 ===")
        self.add_log("海难坠落荒岛，你需要喝水、觅食、造装备、抵御野兽")
        self.add_log("新增水桶：在淡水溪装水，之后随时随地可以喝水！")
        self.add_log("收集船板、绳索、船帆，完成造船即可逃离荒岛通关！")
        self.update_ui()

    def init_ui(self):
        # 左侧状态面板
        self.frame_left = tk.Frame(self.root, bd=2, relief=tk.GROOVE)
        self.frame_left.place(x=10, y=10, width=240, height=600)

        tk.Label(self.frame_left, text="【生存状态】", font=("黑体", 13, "bold")).pack(pady=3)
        self.txt_day = tk.Label(self.frame_left, text=f"生存天数：{self.day} 天", font=("微软雅黑", 10))
        self.txt_day.pack()
        self.txt_weather = tk.Label(self.frame_left, text=f"当前天气：{self.weather}", font=("微软雅黑", 10))
        self.txt_weather.pack()
        self.txt_loc = tk.Label(self.frame_left, text=f"当前位置：{self.location}", font=("微软雅黑", 10))
        self.txt_loc.pack(pady=2)

        self.txt_hp = tk.Label(self.frame_left, text=f"生命值：{self.hp}/100", fg="#e53935", font=("微软雅黑", 10))
        self.txt_hp.pack()
        self.txt_hunger = tk.Label(self.frame_left, text=f"饥饿值：{self.hunger}/100", fg="#f57c00", font=("微软雅黑", 10))
        self.txt_hunger.pack()
        self.txt_thirst = tk.Label(self.frame_left, text=f"口渴值：{self.thirst}/100", fg="#039be5", font=("微软雅黑", 10))
        self.txt_thirst.pack()
        self.txt_bucket_water = tk.Label(self.frame_left, text=f"水桶储水：{self.water_in_bucket}", font=("微软雅黑", 10),fg="#039be5")
        self.txt_bucket_water.pack()

        tk.Label(self.frame_left, text="【建造进度】", font=("黑体", 12)).pack(pady=3)
        self.txt_hut = tk.Label(self.frame_left, text=f"安全小屋：{'已建造' if self.build_hut else '未建造'}", font=("微软雅黑", 10))
        self.txt_hut.pack()
        self.txt_ship = tk.Label(self.frame_left, text=f"造船进度：{self.ship_progress}%", fg="#2e7d32", font=("微软雅黑", 10))
        self.txt_ship.pack(pady=2)

        tk.Label(self.frame_left, text="【背包物品】", font=("黑体", 12)).pack(pady=3)
        self.inv_text = tk.Text(self.frame_left, height=6, width=22, font=("微软雅黑", 9))
        self.inv_text.pack()

        tk.Label(self.frame_left, text="【操作面板】", font=("黑体", 12)).pack(pady=3)
        btn_frame = tk.Frame(self.frame_left)
        btn_frame.pack()
        btn_w = 12
        # 使用grid网格，两行多列，全部按钮完整展示
        tk.Button(btn_frame, text="探索岛屿", command=self.explore, width=btn_w).grid(row=0,column=0,pady=1,padx=1)
        tk.Button(btn_frame, text="采集物资", command=self.gather, width=btn_w).grid(row=0,column=1,pady=1,padx=1)
        tk.Button(btn_frame, text="喝水补水", command=self.drink_water, width=btn_w).grid(row=1,column=0,pady=1,padx=1)
        tk.Button(btn_frame, text="装水(淡水溪)", command=self.fill_bucket, width=btn_w).grid(row=1,column=1,pady=1,padx=1)
        tk.Button(btn_frame, text="进食饱腹", command=self.eat_food, width=btn_w).grid(row=2,column=0,pady=1,padx=1)
        tk.Button(btn_frame, text="制作物品", command=self.make_item, width=btn_w).grid(row=2,column=1,pady=1,padx=1)
        tk.Button(btn_frame, text="使用药品", command=self.use_medicine, width=btn_w).grid(row=3,column=0,pady=1,padx=1)
        tk.Button(btn_frame, text="建造/造船", command=self.build_all, width=btn_w).grid(row=3,column=1,pady=1,padx=1)
        tk.Button(btn_frame, text="存档读档", command=self.save_load, width=btn_w).grid(row=4,column=0,columnspan=2,pady=1,padx=1)

        # 右侧日志面板
        self.frame_right = tk.Frame(self.root, bd=2, relief=tk.GROOVE)
        self.frame_right.place(x=260, y=10, width=540, height=600)
        tk.Label(self.frame_right, text="游戏日志", font=("黑体", 13, "bold")).pack()
        self.log = scrolledtext.ScrolledText(self.frame_right, height=34, width=64, font=("微软雅黑", 9))
        self.log.pack()
        self.log.config(state=tk.DISABLED)

    def add_log(self, msg):
        self.log.config(state=tk.NORMAL)
        self.log.insert(tk.END, msg + "\n")
        self.log.see(tk.END)
        self.log.config(state=tk.DISABLED)

    def update_ui(self):
        self.txt_day.config(text=f"生存天数：{self.day} 天")
        self.txt_weather.config(text=f"当前天气：{self.weather}")
        self.txt_loc.config(text=f"当前位置：{self.location}")
        self.txt_hp.config(text=f"生命值：{self.hp}/100")
        self.txt_hunger.config(text=f"饥饿值：{self.hunger}/100")
        self.txt_thirst.config(text=f"口渴值：{self.thirst}/100")
        self.txt_bucket_water.config(text=f"水桶储水：{self.water_in_bucket}")
        self.txt_hut.config(text=f"安全小屋：{'已建造' if self.build_hut else '未建造'}")
        self.txt_ship.config(text=f"造船进度：{self.ship_progress}%")

        self.inv_text.delete(1.0, tk.END)
        if self.inventory:
            item_count = {}
            for i in self.inventory:
                item_count[i] = item_count.get(i, 0) + 1
            for k, v in item_count.items():
                self.inv_text.insert(tk.END, f"{k} x{v}\n")
        else:
            self.inv_text.insert(tk.END, "背包空空如也")

        # 死亡判定
        if self.hp <= 0 or self.hunger <= 0 or self.thirst <= 0:
            self.running = False
            messagebox.showerror("游戏结束", "你的生存值耗尽，永远留在了荒岛！")
        # 通关判定
        if self.ship_progress >= 100:
            self.running = False
            messagebox.showinfo("通关成功！", "恭喜你！成功造出船只，逃离荒岛重获新生！")

    def new_day_cycle(self):
        if not self.running or self.in_battle:
            return
        
        self.day += 1
        self.weather = random.choice(self.weather_list)

        self.hunger -= random.randint(10, 18)
        self.thirst -= random.randint(12, 22)

        # 天气效果
        if self.weather == "酷暑":
            self.thirst -= 15
            self.add_log("【酷暑】烈日炎炎，口渴值大幅下降！")
        elif self.weather == "暴雨":
            self.thirst +=20
            if self.thirst>100:self.thirst=100
            self.add_log("【暴雨】天降大雨，收集雨水，口渴值恢复！")
        elif self.weather == "大风":
            self.hunger -= 5
            self.add_log("【大风】狂风呼啸，消耗更多体力！")
        else:
            self.add_log(f"【天气】今日{self.weather}，平稳度过")

        # 夜间野兽袭击（无小屋触发）
        if not self.build_hut and random.random() < 0.35:
            self.trigger_beast_attack()

        self.hp = max(0, self.hp)
        self.hunger = max(0, self.hunger)
        self.thirst = max(0, self.thirst)

        self.add_log(f"===== 第 {self.day} 天 开始 =====")
        self.update_ui()

    # 野兽战斗
    def trigger_beast_attack(self):
        beast_list = ["野狼", "野猪", "丛林毒蛇"]
        self.now_beast = random.choice(beast_list)
        if self.now_beast == "野狼":
            self.beast_hp = 35
            beast_dmg = 12
        elif self.now_beast == "野猪":
            self.beast_hp = 50
            beast_dmg = 18
        else:
            self.beast_hp = 25
            beast_dmg = 8

        self.in_battle = True
        self.add_log(f"【遭遇战斗】一只{self.now_beast}突然袭击了你！")
        self.battle_loop(beast_dmg)

    def battle_loop(self, beast_dmg):
        while self.beast_hp > 0 and self.hp > 0:
            damage = self.weapon_damage + random.randint(2, 8)
            self.beast_hp -= damage
            self.add_log(f"你攻击{self.now_beast}，造成{damage}点伤害！")

            if self.beast_hp > 0:
                real_dmg = max(0, beast_dmg - random.randint(0, 4))
                self.hp -= real_dmg
                self.add_log(f"{self.now_beast}反击，你受到{real_dmg}点伤害！")
        
        self.in_battle = False
        if self.hp <= 0:
            return
        drop = random.choice(["兽肉", "藤蔓", "草药"])
        self.inventory.append(drop)
        self.add_log(f"✅ 击杀{self.now_beast}！获得物资：{drop}")
        self.update_ui()

    # 探索
    def explore(self):
        if not self.running or self.in_battle:
            self.add_log("当前无法探索！")
            return
        
        self.add_log("你起身探索荒岛四周...")
        self.location = random.choice(self.location_list)

        if self.location == "沙滩":
            self.add_log("【沙滩】松软的沙滩上，你捡到了细碎木材！")
            self.inventory.append("细树枝")
        elif self.location == "密林":
            self.add_log("【密林】茂密丛林，物资丰富，但暗藏危险！")
            self.inventory.extend(["木材", "藤蔓"])
            if random.random() < 0.4:
                self.trigger_beast_attack()
        elif self.location == "礁石区":
            self.add_log("【礁石区】海浪拍击礁石，你成功抓到一条鱼！")
            self.inventory.append("鱼")
        elif self.location == "山洞":
            self.add_log("【山洞】阴暗潮湿，发现野生草药！")
            self.inventory.append("草药")
            if random.random() < 0.25:
                self.add_log("山洞深处传来异响，小心野兽！")
                self.trigger_beast_attack()
        elif self.location == "淡水溪":
            self.add_log("【淡水溪】发现干净水源，可以自由饮水、装水！")

        self.new_day_cycle()

    # 采集
    def gather(self):
        if not self.running or self.in_battle:
            self.add_log("当前无法采集！")
            return
        
        self.add_log("你开始认真采集周边物资...")
        if self.location == "密林":
            item = random.choice(["木材", "藤蔓", "细树枝"])
        elif self.location == "礁石区":
            item = random.choice(["石头", "鱼"])
        elif self.location == "淡水溪":
            item = random.choice(["草药", "细树枝"])
        else:
            item = random.choice(self.basic_items + self.food_items[:1])
        
        self.inventory.append(item)
        self.add_log(f"采集成功：{item}")
        self.new_day_cycle()

    # 水桶装水
    def fill_bucket(self):
        if not self.running:
            return
        if "水桶" not in self.inventory:
            self.add_log("你没有水桶，无法装水！")
            self.update_ui()
            return
        if self.location != "淡水溪":
            self.add_log("只能在淡水溪装水！")
            self.update_ui()
            return
        if self.water_in_bucket >= 100:
            self.add_log("水桶已经装满水了！")
            self.update_ui()
            return
        add_water = 40
        self.water_in_bucket += add_water
        if self.water_in_bucket>100:
            self.water_in_bucket=100
        self.add_log(f"✅ 在淡水溪装水，水桶水量+{add_water}")
        self.update_ui()

    # 喝水补水
    def drink_water(self):
        if not self.running:
            return
        # 优先使用水桶储备水
        if self.water_in_bucket>0:
            use_water = random.randint(25,40)
            real_use = min(use_water,self.water_in_bucket)
            self.water_in_bucket -= real_use
            self.thirst += real_use
            if self.thirst>100:
                self.thirst=100
            self.add_log(f"✅ 喝水桶储存的淡水，口渴值+{real_use}")
        elif self.location == "淡水溪" or self.weather == "暴雨":
            add_thirst = random.randint(25,40)
            self.thirst += add_thirst
            if self.thirst>100:
                self.thirst=100
            self.add_log(f"✅ 直接饮用淡水，口渴值+{add_thirst}")
        else:
            self.add_log("❌ 这里没有干净水源，去淡水溪/等暴雨，或者用水桶存水！")
        self.update_ui()

    # 吃东西
    def eat_food(self):
        if not self.running:
            return
        food_list = ["野果","鱼","熟鱼","兽肉"]
        have_food = None
        for food in food_list:
            if food in self.inventory:
                have_food = food
                break
        if have_food:
            self.inventory.remove(have_food)
            if have_food == "熟鱼":
                recover = 40
            elif have_food == "兽肉":
                recover =35
            elif have_food == "鱼":
                recover =20
            else:
                recover =25
            self.hunger += recover
            if self.hunger>100:
                self.hunger=100
            self.add_log(f"吃掉{have_food}，饥饿值+{recover}")
        else:
            self.add_log("背包里没有食物！")
        self.update_ui()

    # 制作物品
    def make_item(self):
        if not self.running or self.in_battle:
            return
        craft_list = list(self.recipes.keys())
        target = simpledialog.askstring("制作物品", f"可制作：\n{craft_list}\n输入要制作的物品名称：")
        if target is None or target not in self.recipes:
            self.add_log("制作取消或者物品不存在！")
            return
        req = self.recipes[target]
        # 检查材料
        enough = True
        for mat,num in req.items():
            if self.inventory.count(mat) < num:
                enough=False
                break
        if not enough:
            self.add_log(f"材料不足，无法制作{target}！")
            self.update_ui()
            return
        # 扣除材料
        for mat,num in req.items():
            for _ in range(num):
                self.inventory.remove(mat)
        self.inventory.append(target)
        # 武器增加伤害
        if target == "长矛":
            self.weapon_damage = 12
            self.add_log("✅ 制作长矛！攻击力提升至12！")
        elif target == "石斧":
            self.weapon_damage = 9
            self.add_log("✅ 制作石斧！攻击力提升至9！")
        elif target == "水桶":
            self.add_log("✅ 制作水桶！前往淡水溪可以装水储存！")
        else:
            self.add_log(f"✅ 成功制作 {target}")
        self.update_ui()

    # 使用药品
    def use_medicine(self):
        if not self.running:
            return
        if "绷带" in self.inventory:
            self.inventory.remove("绷带")
            heal = 40
            self.hp += heal
            if self.hp>100:
                self.hp=100
            self.add_log(f"使用绷带，生命值+{heal}")
        elif "草药" in self.inventory:
            self.inventory.remove("草药")
            heal = 20
            self.hp += heal
            if self.hp>100:
                self.hp=100
            self.add_log(f"使用草药，生命值+{heal}")
        else:
            self.add_log("背包没有药品！")
        self.update_ui()

    # 建造小屋 / 造船
    def build_all(self):
        if not self.running or self.in_battle:
            return
        if not self.build_hut:
            # 小屋材料
            wood_cnt = self.inventory.count("木材")
            vine_cnt = self.inventory.count("藤蔓")
            if wood_cnt >=4 and vine_cnt >=3:
                for _ in range(4):
                    self.inventory.remove("木材")
                for _ in range(3):
                    self.inventory.remove("藤蔓")
                self.build_hut = True
                self.add_log("✅ 安全小屋建造完成！夜间野兽不会袭击你！")
            else:
                self.add_log(f"建造小屋需要：木材×4，藤蔓×3\n当前木材{wood_cnt} 藤蔓{vine_cnt}")
        else:
            # 造船，消耗船板绳索船帆，一次+35进度
            has_board = "船板" in self.inventory
            has_rope = "绳索" in self.inventory
            has_sail = "船帆" in self.inventory
            if has_board and has_rope and has_sail:
                self.inventory.remove("船板")
                self.inventory.remove("绳索")
                self.inventory.remove("船帆")
                self.ship_progress +=35
                if self.ship_progress>100:
                    self.ship_progress=100
                self.add_log(f"✅ 组装船只！造船进度+35%，当前{self.ship_progress}%")
            else:
                self.add_log("造船需要【船板、绳索、船帆】各一个！先去制作！")
        self.update_ui()

    # 存档读档
    def save_load(self):
        choice = simpledialog.askstring("存档/读档","输入 save 存档 | load 读档")
        if choice == "save":
            save_data = {
                "hp":self.hp,
                "hunger":self.hunger,
                "thirst":self.thirst,
                "inventory":self.inventory,
                "location":self.location,
                "day":self.day,
                "build_hut":self.build_hut,
                "ship_progress":self.ship_progress,
                "weather":self.weather,
                "weapon_damage":self.weapon_damage,
                "water_in_bucket":self.water_in_bucket
            }
            with open("island_save.json","w",encoding="utf-8") as f:
                json.dump(save_data,f,ensure_ascii=False,indent=2)
            messagebox.showinfo("存档成功","已保存 island_save.json")
        elif choice == "load":
            if not os.path.exists("island_save.json"):
                messagebox.showerror("错误","无存档文件")
                return
            with open("island_save.json","r",encoding="utf-8") as f:
                data = json.load(f)
            self.hp = data["hp"]
            self.hunger = data["hunger"]
            self.thirst = data["thirst"]
            self.inventory = data["inventory"]
            self.location = data["location"]
            self.day = data["day"]
            self.build_hut = data["build_hut"]
            self.ship_progress = data["ship_progress"]
            self.weather = data["weather"]
            self.weapon_damage = data["weapon_damage"]
            self.water_in_bucket = data["water_in_bucket"]
            self.running = True
            self.add_log("===== 读取存档成功 =====")
            self.update_ui()
        else:
            self.add_log("输入错误，取消操作")

if __name__ == "__main__":
    win = tk.Tk()
    game = IslandSurvival(win)
    game.update_ui()
    win.mainloop()
