← 返回 Day 89 正文

Day 89 · 练习与清单

Day 089 — 游戏循环与事件:练习清单

✅ 今日完成清单


📝 基础练习题

练习 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:自己写一个小游戏

要求:使用今天学的游戏循环和事件处理知识,实现以下任一小游戏:

至少要实现: 1. 完整的游戏循环 2. 键盘/鼠标输入处理 3. 基本碰撞检测 4. 分数系统 5. 游戏结束与重新开始


💡 思考题(不写代码,只思考)

  1. 如果游戏循环中忘记调用 clock.tick(60),CPU 使用率会怎样?为什么?

  2. 为什么 Pygame 选择事件队列而不是回调函数?这样做的优缺点是什么?

  3. 在贪吃蛇中,为什么不能直接反向移动(比如向右走时不能直接向左)?你是怎么实现防掉头的?

  4. 如果要做一个射击游戏,子弹应该用"事件"还是用"列表"来管理?为什么?

  5. pygame.event.get() 调用后事件会被"消费"掉,这意味着什么?如果不调用会怎样?