Day 089 — 游戏循环与事件:练习清单
✅ 今日完成清单
- [ ] 理解游戏循环的四个阶段(输入→更新→渲染→帧率控制)
- [ ] 能说出
Clock.tick()的两个作用 - [ ] 理解 KEYDOWN 事件和
get_pressed()的区别 - [ ] 运行并理解三个示例代码
- [ ] 完成基础练习题
- [ ] 完成进阶挑战题
📝 基础练习题
练习 1:修改帧率
要求:运行 01-game-loop-basics.py,将 FPS 从 60 改为 10,观察方块跟随鼠标的变化。再改为 120,对比效果。
思考:FPS 对游戏体验有什么影响?为什么 FPS 不是越高越好?
练习 2:添加键盘移动
要求:在 01-game-loop-basics.py 的基础上,增加 WASD 键控制方块移动(每次移动 10 像素),同时保留鼠标跟随功能。
提示:
python
# 在事件循环中处理 KEYDOWN
# 在更新阶段检查按键状态
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
player_y -= 10
练习 3:添加定时消息
要求:创建一个新程序,每 2 秒在屏幕上显示一条随机消息(从 5 条预设消息中随机选择)。
提示:使用 pygame.USEREVENT + pygame.time.set_timer()
练习 4:记录键盘输入
要求:创建一个程序,记录用户按下的所有键,在屏幕右侧显示最近 10 次按键记录。
🔥 进阶挑战题
挑战 1:暂停功能
要求:在贪吃蛇游戏基础上,添加暂停/继续功能(按 P 键切换)。暂停时显示"PAUSED"文字。
预期效果:暂停时蛇不动、食物不刷新、分数不变化。
挑战 2:速度递增
要求:修改贪吃蛇,每吃 5 个食物,蛇的移动速度增加 1(即 clock.tick() 的 FPS 增加)。
提示:
python
speed = 10 + state.score // 50
clock.tick(speed)
挑战 3:自己写一个小游戏
要求:使用今天学的游戏循环和事件处理知识,实现以下任一小游戏:
- 选项 A:打砖块(Breakout)— 小球弹射 + 挡板 + 碰撞
- 选项 B:Pong — 两人对战弹球
- 选项 C:Flappy Bird 简化版 — 点击/空格控制小鸟上下
至少要实现: 1. 完整的游戏循环 2. 键盘/鼠标输入处理 3. 基本碰撞检测 4. 分数系统 5. 游戏结束与重新开始
💡 思考题(不写代码,只思考)
-
如果游戏循环中忘记调用
clock.tick(60),CPU 使用率会怎样?为什么? -
为什么 Pygame 选择事件队列而不是回调函数?这样做的优缺点是什么?
-
在贪吃蛇中,为什么不能直接反向移动(比如向右走时不能直接向左)?你是怎么实现防掉头的?
-
如果要做一个射击游戏,子弹应该用"事件"还是用"列表"来管理?为什么?
-
pygame.event.get()调用后事件会被"消费"掉,这意味着什么?如果不调用会怎样?