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

11. 动手创造

恭喜!你已经掌握了 Python 的基础工具:变量、条件判断、循环、列表和函数。现在是时候把这些"乐高积木"拼成一件完整的作品了。

本章我们将从零开始,一步一步打造一个 文字冒险游戏——你在终端里探索神秘城堡、收集道具、解开谜题!

⚔️ Python 魔法学院 · 毕业试炼

你已不再是那个刚入学的新手了。变量是你的封印盒,循环是你的永动引擎,函数是你的魔法卷轴。现在——是时候把它们组合起来,完成你的第一件史诗级作品

今天你将打造一座神秘城堡——一个完整的文字冒险游戏。这不仅仅是一段代码,这是你的毕业证书。拔出你的键盘(剑),我们开始吧!

准备好了吗?先运行下面的代码,感受一下最终成品的效果。

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

🎨 把一切拼成一件作品

回想一下你学到的所有魔法:变量是封印盒、if 是分岔路、循环是永动机、列表是百宝箱、函数是魔法卷轴——每一件都是强大的工具。但单独一件工具,只能做一件事。

真正的魔法发生在你把它们拼在一起时:用列表存地图,用字典管道具,用函数封装逻辑,用循环驱动游戏——这些零件咬合在一起,就像乐高积木搭成了一座城堡。

本章的目标不是学新知识,而是证明你已经能创造。准备好了吗?开始拼装你的第一个完整作品!

11.1 项目拆解:从零开始搭积木

上一节的完整游戏看起来很复杂?别担心,我们一块块来拆解。每个零件你其实都学过了:

游戏零件用到的 Python 知识
房间地图列表字典(上面用字典,稍后详解)
玩家移动条件判断(if/else)
游戏主循环while 循环
道具系统列表(inventory)
上锁的门条件判断 + 列表查找
各模块封装函数

11.2 第一步:搭一个最简单的地图

先不要管道具和锁。从一个最简单的"能走动的房间"开始:

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

💡 字典(dict) 是 Python 的另一个重要数据结构。它和列表的区别:列表用数字编号(索引),字典用名字(键)来索引。比如 map_data["门外"] 通过名字拿到对应的值。

🧠 设计思考:为什么用字典而不是列表来存地图?

游戏地图的核心需求是:通过房间名快速找到它的出口。玩家说"往北走",你需要在"门外"这个房间里查到"北"连接的是"大厅"。

如果用列表:你得遍历所有房间才能找到"门外",每走一步都要扫描全部数据——太慢了。

用字典:map_data["门外"],Python 直接定位到"门外"这个键,瞬间返回 {"北": "大厅"}——就像查字典一样,翻到那一页就能看到答案。

这就是数据结构选择的智慧:根据"怎么查数据"来决定"怎么存数据"。

🎮 如果你是玩家会怎么想?

你现在写出了第一版能走动的地图。但站在玩家的角度想想:

  • 光走路有什么意思?“我来到了厨房,然后呢?”

  • 玩家需要目标奖励来驱动继续探索。

所以下一步,我们给房间加入道具——让玩家有东西可以收集!


11.3 第二步:加入道具收集系统

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

🧠 设计思考:为什么用 del 删除道具?

如果不删,厨房里的"魔法药水"就是无限供应的——玩家可以反复进出厨房刷 100 瓶药水!这样道具就失去了稀缺性,游戏变得无聊。

del room_items[room_name] 移除道具后,第二次进厨房就什么也没有了——和现实世界一样,拿了就是拿了。

🎮 如果你是玩家会怎么想?

“我有药水了!但拿着它能干什么?如果它能打开一扇神秘的门,那就太酷了!”

道具的意义不只是"收集"——更在于"使用"。下一步,我们加入上锁的门,让道具变得有价值。


11.4 第三步:加上锁的门

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

11.5 完整游戏结构回顾

🏰 文字冒险游戏
├── 游戏数据层
│   ├── rooms(房间地图)
│   ├── inventory(背包列表)
│   └── game_over(是否结束)
├── 游戏逻辑层
│   ├── show_room() — 展示房间信息
│   ├── process_command() — 处理玩家指令
│   └── move / pick / use — 具体动作
└── 游戏循环层
    └── while not game_over

三层架构的好处:想加新房间?只改 rooms 字典。想加新指令?只改 process_command 函数。互不影响。

⚠️ 💡 常见误区:global 变量陷阱

在游戏中,current_roominventory 被多个函数共享(移动函数修改 current_room,拾取函数修改 inventory)。如果不加 global 声明:

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

正确做法

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

更好的做法:让函数 return 新值,而不是直接修改全局变量。这也是为什么在完整版游戏中,我们用 process_command() 集中管理所有状态变化——只在一个地方用 global,其他地方通过函数调用传递数据。

⚠️ 💡 常见误区:忘了更新变量状态

游戏开发中最常见的 Bug 是"状态不同步":

  • 玩家捡了钥匙,但 inventory 列表没更新 → 有钥匙却打不开门

  • 门被打开了,但 locked 字典没删除记录 → 下次经过还是锁着的

  • 游戏结束了,但 game_over 没变成 True → 循环停不下来

检查方法:每次写完一个功能,在心里模拟一遍:玩家拿钥匙 → 背包里有了吗?→ 走到锁门前 → 能检测到钥匙吗?→ 门开了 → 锁的记录删了吗?

11.6 动手练习

Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...
📋 参考答案(点击展开)
Python
14
准备加载编辑器...
🔧 正在准备编程环境...0%
等待编辑器...
等待 Python 环境...

11.7 你的下一步

print("Hello, World!") 到你刚刚创造出一个完整的文字冒险游戏——这不到 7 章的距离,你已经完成了从"编程小白"到"能动手创造"的飞跃。

接下来你可以:

方向你可以……
🎮 继续完善游戏加更多房间、更多道具、NPC(非玩家角色)对话系统
🔢 挑战算法题去 LeetCode、牛客网刷刷 Python 简单题
🖥️ 做个小工具写一个批量重命名文件的脚本,或者一个计算器
🕸️ 学 Web 开发用 Flask 或 FastAPI 把你的游戏做成网页版
🤖 探索 AI用 Python 调用 OpenAI 等大模型 API,做个聊天机器人

编程的世界是无限广阔的,而你已经拿到了最重要的钥匙:用代码创造东西的能力


11.8 趣味编程结语

你在趣味编程中学会了具体内容
✅ 变量给数据贴上标签,随时取用
✅ 条件判断if/elif/else,让程序做选择
✅ 循环for/while,自动化重复任务
✅ 列表收纳大量数据,增删改查一手搞定
✅ 函数封装代码,打造可复用的工具箱
✅ 综合项目将以上所有技能融合,创造出完整应用

🎉 恭喜你完成了「趣味编程」全部内容! 接下来可以继续选学「人工智能」模块,在 Python 的世界里继续探索。

11.9 📚 参考资料

资源链接说明
Python 官方教程 — 数据结构docs.python.org/3/tutorial/datastructures.html本项目大量使用的字典和列表详解
inventwithpython.cominventwithpython.com/invent4thed用 Python 做游戏的经典教程(英文)
Real Python — PyGame 入门realpython.com/pygame-a-primer进阶:用 PyGame 做图形化游戏

本章内容基于 Python 官方教程 改编,遵循 PSF License 许可。