Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

PyFirst

13. 文字冒险王

之前你已经做了一个文字冒险游戏。现在,我们把所有学过的技能全部用上,打造一个更复杂、更好玩的地牢探险游戏!

🏰 Python 魔法学院 · 终极试炼

毕业试炼之后,你还想要更多挑战。在魔法学院的地下深处,有一扇刻着龙纹的黑铁大门——那是通往「无尽地牢」的入口。传说只有真正的代码勇士,才能活着走出来。

今天你将进入地牢:战斗系统、装备系统、随机地图……每一个房间都是新的考验。你,准备好了吗?


📖 冒险前传

拿出你的冒险笔记,看看你即将面对什么:

你的装备?一把生锈的铁剑,一件破烂的皮甲。你的使命?活下来,变强大。

但这不是一本小说——这是你亲手写的代码。每一行 Python 都是一个游戏规则,每一个函数都是游戏的一个系统。来,打开代码,逐段阅读。


🔍 代码阅读指南:如何"啃"下 200 行代码

看到下面这个 200 行的程序,别慌!职业程序员也不会从头读到尾——他们用的是"分块阅读法":

  1. 先看结构:扫描代码中 # ═══ 分割线。它们把代码分成了三块——数据区、核心函数区、主流程区。

  2. 再看数据MONSTERS 字典和 player 字典是游戏的"设定集"——所有数值都从这里来。

  3. 逐个函数show_status()spawn_monster()battle()use_item()explore(),一个一个读,每个函数只做一件事。

  4. 最后看主流程# 主游戏流程 下方是"导演脚本"——它调度所有函数运行。

💡 阅读技巧:遇到不懂的函数,先跳过。等你看到它被"调用"的地方(比如 battle(monster)),再回头读。上下文会让你更容易理解。


13.1 先看成品

🧪 试试修改:先运行一次代码(点击 ▶ ),看看完整的冒险流程。然后找到 player 字典,把 "hp": 100 改成 "hp": 200,再运行一次——看看你是不是变得更能扛打了?

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

🧪 试试修改(运行后必做):你已经运行了一次,现在试试:

  • adventures 列表改短(比如只留前 3 个事件)——冒险变短了!

  • adventures 列表改长(加 10 个 "战斗")——看看你能撑几轮?

  • 把火龙的 HP 从 100 改成 200 —— 终极 Boss 模式!

⚠️ 注意:每次修改后重新运行(点击 ▶),体验变化。这就是"试错学习法"——改一行代码,看一种结果。


13.2 游戏架构分析

这个游戏比你想象的更有层次:

🏰 地牢探险
├── 💚 玩家系统
│   ├── 属性 (HP/ATK/DEF/金币/等级)
│   └── 装备系统 (武器/防具/消耗品)
├── ⚔️ 战斗系统
│   ├── 回合制对战
│   ├── 暴击概率 (15%)
│   └── 掉落/经验/升级
├── 🎲 探索系统
│   ├── 战斗 (60%)
│   ├── 宝箱 (20%)
│   ├── 休息点 (15%)
│   └── 商人 (5%)
└── 👾 怪物图鉴
    ├── 史莱姆 → 骷髅兵 → 暗黑法师 → 火龙
    └── 随等级动态增强

🧠 每个系统的设计思路

为什么玩家数据用字典? 因为 player 的属性会频繁变动(HP 减少、金币增加、装备更换)。字典可以用 player["hp"] -= 10 直接修改,比列表用索引 player[0] -= 10 清晰一万倍——你能看懂你在改什么。

为什么怪物数据也用字典? 和玩家同理。而且 MONSTERS 外层字典的键是怪物名字(字符串),方便用 random.choice(list(MONSTERS.keys())) 随机抽取——这是"数据驱动设计":加一个新怪物只需往字典加一行,不改任何逻辑代码。

为什么 battle() 函数返回 TrueFalse 因为主流程需要知道"战斗结果"来决定继续冒险还是游戏结束。返回布尔值是函数间最清晰的"暗号"。

为什么 explore() 用累加概率而不是直接 if-elif 因为概率可以灵活调整——你想让商人出现概率从 5% 变成 10%,只需改一个数字,不用动判断逻辑。


13.3 你可以扩展的方向

以下是基于这个框架可以添加的功能,选一个试试:

难度扩展方向涉及技能
添加更多怪物、道具字典操作
⭐⭐添加技能系统(火球术、治疗术)函数 + 字典
⭐⭐⭐随机生成地牢地图列表 + 随机
⭐⭐⭐存档/读档系统字典 + 条件
⭐⭐⭐⭐多个可选角色(战士/法师/盗贼)面向对象

⚠️ 常见误区 #1:可变 vs 不可变。在 Python 中,字典和列表是"可变"的(可以直接改内容),而整数和字符串是"不可变"的(每次修改都是创建新值)。这就是为什么 player["hp"] -= 10 有效——字典允许原地修改。如果你定义 hp = 100 然后在函数里写 hp -= 10,函数外的 hp 不会变!这就是"变量作用域"问题。

⚠️ 常见误区 #2:global 关键字。看到 1.4 节技能系统里的 global player_mp 了吗?在函数内部想修改函数外部定义的变量,Python 要求你显式声明 global。忘记写它,你就会得到一个 UnboundLocalError

⚠️ 常见误区 #3:random.random() 每次都不一样。很多人以为同一个程序运行两次结果应该一样——错!random 模块每次都生成新随机数。所以每次冒险遇到的怪物、掉落的装备都不同。这是游戏的乐趣,但也意味着 bug 可能偶尔才出现。

🧪 试试修改:在扩展方向表里选一个你感兴趣的,试着加到游戏代码里!比如:

  • MONSTERS 里加一个 "幽灵": {"hp": 15, "atk": 8, "gold": 15, "emoji": "👻"}

  • explore() 加一个新事件类型 "陷阱"(扣 HP)

  • 让玩家可以花金币 "购买" 装备


13.4 扩展示例:技能系统

💡 设计思路

技能系统和普通攻击有什么不同?三个字:有代价。每个技能消耗 MP(魔法值),而且可能因 MP 不足而无法释放。

为什么 skills 也用字典?因为你可以轻松添加新技能而不改代码逻辑——和 MONSTERS 同样的"数据驱动"思想。

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

🧪 试试修改

  • 添加你的专属技能:"闪电链": {"cost": 18, "damage": 35, "emoji": "⚡", "mp_cost": 20}

  • player_mp 初始值改成 100,看你能连续放几次技能

  • 给每个技能加"命中率"——有概率 miss!(提示:用 random.random() < 0.8 判断 80% 命中率)


🎯 从学到用到创造:这个游戏从 print("Hello") 一路走到了完整的战斗+探索+装备 RPG。你已经掌握了:字典、列表、函数、循环、条件、随机……所有这些在同一个项目中协同工作。这就是编程的真正力量——把想法变成现实。

🏆 冒险王的下一步:你已经有了一款自己的 RPG 游戏!把它分享给朋友玩,听听他们的反馈。发现不好玩的地方?改!发现 bug?修!真正的程序员不是一次写完代码的人——是不断改进代码的人。你的地牢探险,才刚刚开始……