当前位置:首页>python>我用Python写了个地牢探险游戏,300行代码实现完整RPG系统!

我用Python写了个地牢探险游戏,300行代码实现完整RPG系统!

  • 2026-09-11 02:38:02
我用Python写了个地牢探险游戏,300行代码实现完整RPG系统!
大家好!没错依旧是我,《临近中年但是一点不秃且185长相帅过吴彦祖身材胜过彭于晏》的程序员,今天给大家分享一个我最近用Python写的文字冒险游戏——《地牢探险家》!这是一个完整的Roguelike游戏,包含战斗系统、角色成长、装备收集、随机事件等核心玩法。文末有完整代码,可以直接体验!

🎯 游戏概览

《地牢探险家》是一款用纯Python编写的文字冒险游戏。玩家将扮演一名冒险者,探索10层随机生成的地牢,击败怪物,收集装备,学习技能,最终挑战地牢守护者!
游戏特色:
  • ✅ 完整RPG系统:等级、属性、技能、装备

  • ✅ 随机生成:每次冒险都不同

  • ✅ 策略战斗:回合制战斗,技能组合

  • ✅ 收集要素:多种装备和道具

  • ✅ 进度保存:JSON存档功能

  • ✅ 代码简洁:约300行,结构清晰

📱 游戏截图

🎮 游戏玩法详解

1. 核心目标

探索10层地牢,击败最终BOSS地牢守护者!每层需要击败3个敌人才能前往下一层。

2. 属性系统

  • ❤️ HP:生命值,归零则游戏结束

  • 💙 MP:魔法值,释放技能需要

  • ⚔️ 攻击:影响伤害输出

  • 🛡️ 防御:减少受到的伤害

  • 💰 金币:购买物品和装备

  • 📈 经验:积累经验升级

3. 成长系统

升级奖励:

  • 每级需要:当前等级 × 20 经验

  • HP上限 +10,MP上限 +5

  • 攻击力 +2,防御力 +1

  • 3级学会治疗术,5级学会火球术

4. 装备系统

装备类型

效果

获取方式

木剑 → 铁剑 → 钢剑

攻击力+3 → +6 → +10

击败敌人、开宝箱、商人购买

布衣 → 皮甲 → 锁子甲

防御力+2 → +4 → +7

击败敌人、开宝箱、商人购买

装备自动比较:获得更好装备时自动替换!

5. 技能系统

技能

解锁

MP消耗

效果

重击

初始

5

造成150%伤害

治疗术

3级

8

恢复20HP

火球术

5级

10

造成200%魔法伤害

🎯 战斗系统详解

遭遇敌人时:

战斗指令:

  1. ⚔️ 攻击 - 普通攻击

  2. 🎯 技能 - 使用特殊技能

  3. 💊 物品 - 使用背包道具

  4. 🏃 逃跑 - 50%几率逃离战斗

敌人类型:

敌人

HP

攻击

防御

经验

出现层数

史莱姆

10

3

1

5

1-3层

哥布林

15

5

2

8

1-6层

骷髅

20

7

3

12

4-9层

兽人

30

10

5

20

7-9层

地牢守护者

100

15

8

50

第10层

🎲 随机事件系统

每次探索都会随机触发以下事件:

1. 👾 遭遇敌人 (40%)

  • 与各种怪物战斗

  • 击败后获得经验、金币

  • 30%几率掉落物品

2. 🎁 发现宝藏 (20%)

  • 获得金币(10-30)

  • 获得药水(治疗/魔法)

  • 获得装备(自动比较)

3. 🏠 安全屋 (15%)

  • 恢复HP和MP

  • 有时会遇到商人

  • 安全的休息点

4. ⚠️ 陷阱 (15%)

  • 地刺陷阱:扣血5-10

  • 蛛网陷阱:暂时无法行动

  • 毒气陷阱:HP-8,MP-5

5. 🛒 商人 (10%)

  • 出售药水和装备

  • 价格合理

  • 装备直接使用

🎮 操作指南

主菜单操作:

1. 🚪 探索地牢2. 💾 保存游戏3. 📂 加载游戏4. 🆘 游戏帮助5. 🚪 退出游戏
  • 输入 1-5 选择对应功能

  • 按 回车 确认

战斗操作:

  • 1 - 攻击

  • 2 - 技能(需选择技能编号)

  • 3 - 物品(需选择物品编号)

  • 4 - 逃跑(50%成功率)

快捷键总结:

操作

按键

说明

探索

1

开始冒险

攻击

1

普通攻击

技能

2

使用技能

物品

3

使用道具

逃跑

4

尝试逃跑

保存

2(主菜单)

保存进度

加载

3(主菜单)

读取存档

🎯 游戏策略

新手必看攻略:

1. 前期发育(1-3层)

  • 多打史莱姆积累经验

  • 保留治疗药水应对强敌

  • 遇到商人优先买治疗药水

2. 中期成长(4-7层)

  • 学会治疗术后战斗更轻松

  • 收集铁剑和皮甲

  • 注意MP管理

3. 后期挑战(8-10层)

  • 学会火球术对付强敌

  • 装备钢剑和锁子甲

  • 保留大量药水应对BOSS

4. 经济管理

  • 优先购买治疗药水

  • 装备看属性不看价格

  • 商人出现时尽量购物

5. 战斗技巧

  • 普通敌人用普通攻击

  • 强敌使用技能连招

  • HP低于30%考虑逃跑

  • 合理使用治疗术

📢 互动时间

  1. 你通关时的等级是多少?

  2. 你觉得哪个BOSS最难打?

  3. 你希望游戏添加什么新功能?

  4. 你最高收集了多少金币?

欢迎在评论区留言讨论!点赞最高的3位读者,将获得Python编程课程一份!

以下是小游戏完整代码,复制粘贴本地运行即可开玩

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()

最新文章

随机文章