用Pygame Zero复刻Flappy Bird:Scratch学习者迁移Python的完整教程(含源码对比)
Pygame Zero 是一个基于 Pygame 的零样板 Python 游戏开发框架,它让你用几十行代码就能写出完整的游戏。本文将带你用 Pygame Zero 复刻经典游戏 Flappy Bird,并逐行对比项目内置的 Scratch 版本与 Python 版本源码,帮助 Scratch 学习者以最小的认知成本迁移到 Python 游戏开发。
为什么 Pygame Zero 是 Scratch 学习者的最佳过渡框架
很多初学者在 Scratch 里写过小游戏,但面对真正的 Python 项目却被"初始化显示模块、创建窗口、事件循环"这些样板代码劝退。Pygame Zero 的核心卖点正是零样板代码(zero-boilerplate):
- ✅ 不需要手写
while事件循环,框架自动管理 60 帧每秒的游戏主循环 - ✅
Actor(角色)、screen(画面)、keyboard(键盘)等对象开箱即用 - ✅ 一个完整的 Flappy Bird 只需约 100 行 Python 代码
- ✅ 项目官方就提供了 Scratch 与 Python 两个版本的对照教程
换句话说,你在 Scratch 积木上建立的"角色 + 舞台 + 事件"心智模型,可以几乎原封不动地搬到 Pygame Zero 里。
环境准备:一条命令安装 Pygame Zero
只需安装 Python 3 后,在终端执行:
pip install pgzero
该命令会同时安装 Pygame,Windows、Linux、macOS 均有预编译包,无需额外编译。安装完成后,输入 pgzrun 看到帮助信息即表示成功。
运行官方 Flappy Bird 示例:先玩起来再拆解
Pygame Zero 源码仓库自带一个完整的 Flappy Bird 示例,包含游戏逻辑、计分管线与全套图片资源。示例入口文件为 examples/flappybird/flappybird.py,配套资源位于 examples/flappybird/images/ 目录(小鸟、上下管道、背景图)。
在仓库根目录运行:
pgzrun examples/flappybird/flappybird.py
游戏窗口会直接弹出:按任意键小鸟向上飞,穿过管道缝隙计分,底部还会显示你的历史最高分(由框架内置的 storage 持久化功能保存)。
💡 建议先玩两把熟悉手感,再回头读源码,效果翻倍。
源码对比:Scratch 积木到 Python 函数的完整映射
示例目录里同时保留了 Scratch 工程文件(examples/flappybird/Flappy Bird.sb 与 .sb3),官方教程 doc/from-scratch.rst 对两者做了逐段对照。两者的结构惊人地相似:
| Scratch 积木 | Pygame Zero 写法 | 说明 |
|---|---|---|
| 舞台上的角色 | bird = Actor('bird1', (75, 200)) | 一行创建角色并定位 |
forever 循环里的"移动" | 放进 update() 函数 | 框架每帧自动调用一次 |
When [space] key pressed | def on_key_down(): | 键盘事件回调 |
if touching edge? | bird.colliderect(pipe_top) | 矩形碰撞检测 |
pick random 1 to 10 | random.randint(a, b) | 随机数 |
set dead to 0 | bird.dead = False | 布尔值取代 0/1 |
换造型 set costume | bird.image = 'bird2' | 换图即换帧动画 |
可以看到:Scratch 里"角色 + 广播 + 造型"的三大概念,分别对应 Pygame Zero 的 Actor、回调函数和 image 属性,迁移路径非常平滑。
三大核心差异:循环、坐标系与布尔值
迁移时真正需要"换脑子"的地方只有三处:
1. 没有 forever 循环:每次只更新一帧
Scratch 习惯把逻辑写进 forever 积木。Python 版则相反——update() 函数每次只把游戏推进一帧就立刻返回,把处理输入、重绘屏幕的机会交还给框架。写死一个死循环,游戏窗口就会卡死,这是新手最常见的坑。
def update():
update_pipes()
update_bird()
2. 坐标系原点不同:y 轴朝下
Scratch 的原点 (0, 0) 在舞台中心,向上为正;Pygame Zero 的原点在窗口左上角,y 值向下增大。这正是源码中重力加速度 GRAVITY = 0.3 为正数、而跳跃速度 FLAP_STRENGTH = 6.5 以负值赋给 vy 的原因:
def on_key_down():
if not bird.dead:
bird.vy = -FLAP_STRENGTH
3. 布尔值更 Pythonic
Scratch 用 dead = 0 表示"没死",Python 直接用 bird.dead = False,判断时写作 if not bird.dead:,可读性明显更高。
此外还有一个隐藏福利:Pygame Zero 的 Actor 支持 anchor(锚点)属性,管道判定"飞出屏幕"只需写 pipe_top.right < 0,而 Scratch 里得硬编码 x position < -240 这样的魔法数字。
动手改参数:用大写下限常量调出自己的难度
示例源码把调参项集中放在文件头部,这是 Python 相比 Scratch 的一大进步——改难度只需动一个数字:
GAP = 130 # 管道缝隙宽度
GRAVITY = 0.3 # 重力加速度
FLAP_STRENGTH = 6.5 # 扇翅力度
SPEED = 3 # 管道移动速度
试试把 GAP 改成 180 做"休闲模式",或把 SPEED 调到 5 挑战"地狱模式",改完重跑 pgzrun 即可生效。
从 Flappy Bird 进阶:仓库里还有这些示例可学
跑通 Flappy Bird 后,仓库的 examples/ 目录还有大量现成游戏源码供你阅读和魔改,难度循序渐进:
- Pong(乒乓球):
examples/pong/pong.py,学习鼠标控制与双角色碰撞 - Snake(贪吃蛇):
examples/snake/snake.py,学习列表结构与角色生长 - Memory(记忆翻牌):
examples/memory/memory.py,学习界面布局与状态管理 - Asteroids、Lander、Mines 等:进阶的音效、粒子与关卡设计
总结:Scratch 到 Python 游戏开发的完整路径
pip install pgzero安装框架- 跑通
examples/flappybird/flappybird.py,建立手感 - 对照
doc/from-scratch.rst的官方迁移教程,理解"一帧更新"与坐标系的差异 - 改
GAP、SPEED等常量,输出自己的游戏版本 - 沿
examples/目录逐局进阶,把 Scratch 思维升级成 Python 思维
Pygame Zero 用最小的语法门槛保住了 Python 的完整表达力,是 Scratch 学习者通往真实 Python 游戏开发(乃至 Pygame 全家桶)最稳的跳板。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








