import randomimport osimport jsonfrom datetime import datetimeclass DungeonAdventure: def __init__(self): self.player = { "name": "冒险者", "level": 1, "hp": 30, "max_hp": 30, "mp": 15, "max_mp": 15, "attack": 5, "defense": 2, "exp": 0, "gold": 0, "floor": 1, "inventory": ["治疗药水", "治疗药水"], "equipment": {"武器": "木剑", "防具": "布衣"}, "skills": ["重击"] } self.enemies = { "slime": {"name": "史莱姆", "hp": 10, "attack": 3, "defense": 1, "exp": 5, "gold": 2}, "goblin": {"name": "哥布林", "hp": 15, "attack": 5, "defense": 2, "exp": 8, "gold": 5}, "skeleton": {"name": "骷髅", "hp": 20, "attack": 7, "defense": 3, "exp": 12, "gold": 8}, "orc": {"name": "兽人", "hp": 30, "attack": 10, "defense": 5, "exp": 20, "gold": 15}, "boss": {"name": "地牢守护者", "hp": 100, "attack": 15, "defense": 8, "exp": 50, "gold": 50} } self.items = { "治疗药水": {"type": "消耗品", "effect": "恢复20HP", "value": 10}, "魔法药水": {"type": "消耗品", "effect": "恢复10MP", "value": 15}, "木剑": {"type": "武器", "attack": 3, "value": 20}, "铁剑": {"type": "武器", "attack": 6, "value": 50}, "钢剑": {"type": "武器", "attack": 10, "value": 100}, "布衣": {"type": "防具", "defense": 2, "value": 15}, "皮甲": {"type": "防具", "defense": 4, "value": 40}, "锁子甲": {"type": "防具", "defense": 7, "value": 80}, "神秘宝箱": {"type": "特殊", "effect": "随机物品", "value": 0} } self.skills = { "重击": {"mp_cost": 5, "damage_mult": 1.5, "description": "消耗5MP,造成150%伤害"}, "治疗术": {"mp_cost": 8, "heal": 20, "description": "消耗8MP,恢复20HP"}, "火球术": {"mp_cost": 10, "damage_mult": 2.0, "description": "消耗10MP,造成200%魔法伤害"} } self.game_running = True self.current_enemy = None def show_status(self): """显示玩家状态""" os.system('cls' if os.name == 'nt' else 'clear') print(f"\n{'='*50}") print(f"🎮 地牢探险家 - 第{self.player['floor']}层") print(f"{'='*50}") print(f"👤 {self.player['name']} LV.{self.player['level']} EXP:{self.player['exp']}/{self.player['level']*20}") print(f"❤️ HP: {self.player['hp']}/{self.player['max_hp']} 💙 MP: {self.player['mp']}/{self.player['max_mp']}") print(f"⚔️ 攻击: {self.player['attack']} 🛡️ 防御: {self.player['defense']} 💰金币: {self.player['gold']}") print(f"🎒 背包: {', '.join(self.player['inventory']) if self.player['inventory'] else'空'}") print(f"⚔️ 装备: 武器[{self.player['equipment']['武器']}] 防具[{self.player['equipment']['防具']}]") print(f"🎯 技能: {', '.join(self.player['skills'])}") print(f"{'='*50}") def explore(self): """探索地牢""" events = [ self.encounter_enemy, self.find_treasure, self.find_safe_room, self.find_trap, self.find_merchant ] print("\n🚪 你开始探索地牢...") input("按回车继续...") event = random.choice(events) event() def encounter_enemy(self): """遭遇敌人""" if self.player['floor'] >= 10: enemy_type = "boss" if random.random() < 0.3 else random.choice(["orc", "skeleton"]) elif self.player['floor'] >= 7: enemy_type = random.choice(["orc", "skeleton", "goblin"]) elif self.player['floor'] >= 4: enemy_type = random.choice(["goblin", "skeleton"]) else: enemy_type = random.choice(["slime", "goblin"]) self.current_enemy = self.enemies[enemy_type].copy() self.current_enemy["current_hp"] = self.current_enemy["hp"] print(f"\n⚠️ 遭遇了{self.current_enemy['name']}!") self.battle() def battle(self): """战斗系统""" while self.current_enemy["current_hp"] > 0 and self.player["hp"] > 0: self.show_status() print(f"\n👾 敌人: {self.current_enemy['name']} HP: {self.current_enemy['current_hp']}/{self.current_enemy['hp']}") print(f"⚔️ 攻击: {self.current_enemy['attack']} 🛡️ 防御: {self.current_enemy['defense']}") print("\n1. 攻击 2. 使用技能 3. 使用物品 4. 逃跑") choice = input("选择行动: ").strip() if choice == "1": self.attack_enemy() if self.current_enemy["current_hp"] > 0: self.enemy_attack() elif choice == "2": self.use_skill() if self.current_enemy["current_hp"] > 0: self.enemy_attack() elif choice == "3": self.use_item() self.enemy_attack() elif choice == "4": if random.random() < 0.5: print("🏃 成功逃脱!") self.current_enemy = None return else: print("❌ 逃跑失败!") self.enemy_attack() else: print("❌ 无效选择") continue input("\n按回车继续...") if self.player["hp"] <= 0: print("💀 你被击败了!游戏结束。") self.game_running = False elif self.current_enemy["current_hp"] <= 0: self.defeat_enemy() def attack_enemy(self): """攻击敌人""" damage = max(1, self.player["attack"] - self.current_enemy["defense"]) self.current_enemy["current_hp"] -= damage print(f"⚔️ 你对{self.current_enemy['name']}造成了{damage}点伤害!") def enemy_attack(self): """敌人攻击""" damage = max(1, self.current_enemy["attack"] - self.player["defense"]) self.player["hp"] -= damage print(f"💥 {self.current_enemy['name']}对你造成了{damage}点伤害!") def use_skill(self): """使用技能""" print("\n可用技能:") for i, skill in enumerate(self.player["skills"], 1): print(f"{i}. {skill} - {self.skills[skill]['description']}") try: choice = int(input("选择技能: ")) - 1 if 0 <= choice < len(self.player["skills"]): skill = self.player["skills"][choice] skill_info = self.skills[skill] if self.player["mp"] < skill_info["mp_cost"]: print("❌ MP不足!") return self.player["mp"] -= skill_info["mp_cost"] if skill == "重击": damage = max(1, int(self.player["attack"] * skill_info["damage_mult"]) - self.current_enemy["defense"]) self.current_enemy["current_hp"] -= damage print(f"💥 使用{skill}!造成{damage}点伤害!") elif skill == "治疗术": heal = min(skill_info["heal"], self.player["max_hp"] - self.player["hp"]) self.player["hp"] += heal print(f"💚 使用{skill}!恢复{heal}点HP!") elif skill == "火球术": damage = max(1, int(self.player["attack"] * skill_info["damage_mult"])) self.current_enemy["current_hp"] -= damage print(f"🔥 使用{skill}!造成{damage}点魔法伤害!") except: print("❌ 无效选择") def use_item(self): """使用物品""" if not self.player["inventory"]: print("❌ 背包是空的!") return print("\n可用物品:") for i, item in enumerate(self.player["inventory"], 1): print(f"{i}. {item}") print("0. 返回") try: choice = int(input("选择物品: ")) - 1 if choice == -1: return if 0 <= choice < len(self.player["inventory"]): item = self.player["inventory"].pop(choice) self.apply_item_effect(item) except: print("❌ 无效选择") def apply_item_effect(self, item): """应用物品效果""" if item == "治疗药水": heal = min(20, self.player["max_hp"] - self.player["hp"]) self.player["hp"] += heal print(f"💊 使用治疗药水,恢复{heal}点HP!") elif item == "魔法药水": restore = min(10, self.player["max_mp"] - self.player["mp"]) self.player["mp"] += restore print(f"🔮 使用魔法药水,恢复{restore}点MP!") def defeat_enemy(self): """击败敌人""" exp = self.current_enemy["exp"] gold = self.current_enemy["gold"] self.player["exp"] += exp self.player["gold"] += gold print(f"🎉 击败了{self.current_enemy['name']}!") print(f"📈 获得{exp}经验值!") print(f"💰 获得{gold}金币!") # 随机掉落 if random.random() < 0.3: drop_item = random.choice(["治疗药水", "魔法药水"]) self.player["inventory"].append(drop_item) print(f"🎁 获得了{drop_item}!") self.check_level_up() self.current_enemy = None # 每击败3个敌人可下一层 if self.player.get("enemies_defeated", 0) % 3 == 2: self.go_deeper() else: self.player["enemies_defeated"] = self.player.get("enemies_defeated", 0) + 1 def check_level_up(self): """检查升级""" exp_needed = self.player["level"] * 20 if self.player["exp"] >= exp_needed: self.player["level"] += 1 self.player["exp"] = 0 self.player["max_hp"] += 10 self.player["hp"] = self.player["max_hp"] self.player["max_mp"] += 5 self.player["mp"] = self.player["max_mp"] self.player["attack"] += 2 self.player["defense"] += 1 # 学习新技能 if self.player["level"] == 3 and "治疗术" not in self.player["skills"]: self.player["skills"].append("治疗术") print("🎯 学会了新技能:治疗术!") elif self.player["level"] == 5 and "火球术" not in self.player["skills"]: self.player["skills"].append("火球术") print("🎯 学会了新技能:火球术!") print(f"🌟 升级到{self.player['level']}级!") print(f"❤️ HP上限增加! 💙 MP上限增加!") print(f"⚔️ 攻击力提升! 🛡️ 防御力提升!") def find_treasure(self): """找到宝藏""" treasures = [ ("💰 金币", lambda: self.player.update(gold=self.player["gold"] + random.randint(10, 30))), ("💊 治疗药水", lambda: self.player["inventory"].append("治疗药水")), ("🔮 魔法药水", lambda: self.player["inventory"].append("魔法药水")), ("⚔️ 装备", self.find_equipment) ] treasure_type, treasure_func = random.choice(treasures) print(f"\n🎁 发现了一个宝箱!") if treasure_type == "💰 金币": amount = random.randint(10, 30) self.player["gold"] += amount print(f"💰 获得了{amount}金币!") elif treasure_type == "💊 治疗药水": self.player["inventory"].append("治疗药水") print(f"💊 获得了治疗药水!") elif treasure_type == "🔮 魔法药水": self.player["inventory"].append("魔法药水") print(f"🔮 获得了魔法药水!") else: treasure_func() def find_equipment(self): """找到装备""" if self.player["floor"] >= 7: equipment = random.choice(["钢剑", "锁子甲"]) elif self.player["floor"] >= 4: equipment = random.choice(["铁剑", "皮甲"]) else: equipment = random.choice(["木剑", "布衣"]) item_info = self.items[equipment] if item_info["type"] == "武器": current_weapon = self.player["equipment"]["武器"] current_attack = self.items.get(current_weapon, {"attack": 0})["attack"] new_attack = item_info["attack"] if new_attack > current_attack: self.player["equipment"]["武器"] = equipment self.player["attack"] = 5 + new_attack print(f"⚔️ 获得了{equipment}!攻击力+{new_attack}") print(f"⚔️ 替换了{current_weapon}") else: self.player["inventory"].append(equipment) print(f"⚔️ 获得了{equipment},放入背包") elif item_info["type"] == "防具": current_armor = self.player["equipment"]["防具"] current_defense = self.items.get(current_armor, {"defense": 0})["defense"] new_defense = item_info["defense"] if new_defense > current_defense: self.player["equipment"]["防具"] = equipment self.player["defense"] = 2 + new_defense print(f"🛡️ 获得了{equipment}!防御力+{new_defense}") print(f"🛡️ 替换了{current_armor}") else: self.player["inventory"].append(equipment) print(f"🛡️ 获得了{equipment},放入背包") def find_safe_room(self): """找到安全屋""" print("\n🏠 发现了一个安全屋!") heal = min(15, self.player["max_hp"] - self.player["hp"]) self.player["hp"] += heal restore = min(8, self.player["max_mp"] - self.player["mp"]) self.player["mp"] += restore if heal > 0: print(f"💚 休息恢复了{heal}点HP") if restore > 0: print(f"💙 恢复了{restore}点MP") # 安全屋有商人 if random.random() < 0.5: self.find_merchant() def find_trap(self): """找到陷阱""" traps = [ ("💥 地刺陷阱", lambda: self.player.update(hp=max(1, self.player["hp"] - random.randint(5, 10)))), ("🕸️ 蛛网陷阱", lambda: print("🕸️ 被蛛网缠住,暂时无法行动")), ("💨 毒气陷阱", lambda: self.player.update(hp=max(1, self.player["hp"] - 8), mp=max(0, self.player["mp"] - 5))) ] trap_name, trap_func = random.choice(traps) print(f"\n⚠️ 触发了{trap_name}!") trap_func() if trap_name == "💥 地刺陷阱": damage = random.randint(5, 10) self.player["hp"] = max(1, self.player["hp"] - damage) print(f"💥 受到{damage}点伤害!") elif trap_name == "💨 毒气陷阱": self.player["hp"] = max(1, self.player["hp"] - 8) self.player["mp"] = max(0, self.player["mp"] - 5) print("💨 中毒了!HP-8, MP-5") def find_merchant(self): """遇到商人""" print("\n🛒 遇到了旅行商人!") print("1. 购买治疗药水 (20金币)") print("2. 购买魔法药水 (30金币)") print("3. 购买铁剑 (100金币)") print("4. 购买皮甲 (80金币)") print("5. 离开") shop_items = { "1": ("治疗药水", 20), "2": ("魔法药水", 30), "3": ("铁剑", 100), "4": ("皮甲", 80) } choice = input("选择: ").strip() if choice in shop_items: item_name, price = shop_items[choice] if self.player["gold"] >= price: self.player["gold"] -= price if item_name in ["铁剑", "皮甲"]: # 装备直接使用 item_info = self.items[item_name] if item_info["type"] == "武器": self.player["equipment"]["武器"] = item_name self.player["attack"] = 5 + item_info["attack"] print(f"⚔️ 购买了{item_name}并装备!攻击力+{item_info['attack']}") else: self.player["equipment"]["防具"] = item_name self.player["defense"] = 2 + item_info["defense"] print(f"🛡️ 购买了{item_name}并装备!防御力+{item_info['defense']}") else: self.player["inventory"].append(item_name) print(f"🛍️ 购买了{item_name}!") else: print("❌ 金币不足!") def go_deeper(self): """前往下一层""" self.player["floor"] += 1 print(f"\n⬇️ 发现了通往第{self.player['floor']}层的楼梯!") # 每5层恢复状态 if self.player["floor"] % 5 == 0: self.player["hp"] = self.player["max_hp"] self.player["mp"] = self.player["max_mp"] print("💚 到达新区域,状态完全恢复!") # 10层遇到BOSS if self.player["floor"] == 10: print("\n🐉 警告:前方感受到强大的气息...") print("🐉 地牢守护者在等待着你!") input("按回车继续...") def save_game(self): """保存游戏""" save_data = { "player": self.player, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") } with open("dungeon_save.json", "w", encoding="utf-8") as f: json.dump(save_data, f, ensure_ascii=False, indent=2) print("💾 游戏已保存!") def load_game(self): """加载游戏""" try: with open("dungeon_save.json", "r", encoding="utf-8") as f: save_data = json.load(f) self.player = save_data["player"] print(f"📂 游戏已加载!最后保存: {save_data.get('timestamp', '未知')}") return True except: print("📭 没有找到存档,开始新游戏") return False def show_help(self): """显示帮助""" print("\n" + "="*50) print("🎮 游戏帮助") print("="*50) print("目标:探索10层地牢,击败最终BOSS") print("\n🎯 游戏系统:") print(" • 每层需要击败3个敌人才能前往下一层") print(" • 每5层完全恢复状态") print(" • 第10层是BOSS战") print("\n⚔️ 战斗系统:") print(" • 攻击:普通攻击") print(" • 技能:消耗MP的特殊攻击") print(" • 物品:使用背包中的道具") print(" • 逃跑:50%几率成功") print("\n💡 提示:") print(" • 合理使用技能和道具") print(" • 及时更换更好的装备") print(" • 经常保存游戏进度") print("="*50) def main_menu(self): """主菜单""" while self.game_running: self.show_status() print("\n1. 🚪 探索地牢") print("2. 💾 保存游戏") print("3. 📂 加载游戏") print("4. 🆘 游戏帮助") print("5. 🚪 退出游戏") choice = input("\n选择: ").strip() if choice == "1": self.explore() elif choice == "2": self.save_game() input("按回车继续...") elif choice == "3": self.load_game() input("按回车继续...") elif choice == "4": self.show_help() input("按回车继续...") elif choice == "5": save = input("退出前是否保存?(y/n): ").lower() if save == 'y': self.save_game() print("\n🎮 感谢游玩!") self.game_running = False else: print("❌ 无效选择")def main(): """主函数""" os.system('cls' if os.name == 'nt' else 'clear') print("\n" + "="*50) print(" 🎮 地牢探险家") print("="*50) print("一个Roguelike文字冒险游戏") print("目标:探索10层地牢,击败最终BOSS") print("="*50) # 获取玩家姓名 name = input("\n请输入你的名字: ").strip() # 创建游戏实例 game = DungeonAdventure() if name: game.player["name"] = name # 尝试加载存档 load_choice = input("是否加载存档?(y/n): ").lower() if load_choice == 'y': game.load_game() input("\n按回车开始游戏...") # 启动游戏 game.main_menu()if __name__ == "__main__": main()