(一)建立第一个可以关闭的窗口
1. 从绘制一个方块开始
先进入配套的 dodge_project,使用 Python 3.12 安装项目依赖:
# 项目文件:dodge_project/pyproject.toml
# 图像与音效跟随包一起安装,开发组提供不依赖人工操作的检查。
[build-system]
requires = ["setuptools>=80,<83"]
build-backend = "setuptools.build_meta"
[project]
name = "pygame-dodge-notes"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = ["pygame>=2.6,<3"]
[project.scripts]
dodge-game = "dodgegame.app:main"
[dependency-groups]
dev = ["pytest>=9.1,<10"]
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
dodgegame = ["assets/*.png", "assets/*.wav"]
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra --import-mode=importlib"Pygame 提供窗口、输入、绘制和声音接口。package-data 把 assets 下的 PNG 与 WAV 一起装进包,后面安装游戏后也能找到这些文件。
# 在 dodge_project 中按锁定记录建立环境,运行第一个窗口。
uv sync --locked
uv run python ../demos/window.py
pip 路线在 Python 3.12 的虚拟环境执行 python -m pip install -e . 和 python -m pip install -r requirements-dev.txt,再使用该环境解释器运行 python ../demos/window.py。
# 项目文件:demos/window.py
# 清空背景后重新绘制方块,每一轮都处理退出事件;finally 负责关闭窗口。
import pygame
def main():
pygame.init()
try:
screen = pygame.display.set_mode((480, 320))
pygame.display.set_caption("First Pygame Window")
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if not running:
break
screen.fill("#F5F7FB")
pygame.draw.rect(screen, "#087F82", (60, 140, 48, 36))
pygame.display.flip()
clock.tick(60)
finally:
pygame.quit()
if __name__ == "__main__":
main()pygame.init() 尝试初始化显示、字体、声音等模块;set_mode((480, 320)) 建立宽 480、高 320 的窗口,交回可以绘制的 screen。fill 清掉上一轮画面,draw.rect 画一个青色方块,flip 将这轮绘制交给显示。Clock 的 tick 让循环按接近每秒 60 次的节奏推进,第四节再拆开经过时间与帧率。
系统把关闭按钮操作放成 QUIT 事件。每轮用 event.get 取出事件,看到 QUIT 就结束循环,最后由 finally 关闭 Pygame。窗口停在屏幕上,是循环一直运行的结果,不是 set_mode 自己替程序处理了后续动作。
2. 完整小游戏的操作目标
自拟任务:躲避障碍。 玩家在画面底部左右移动,障碍从上方落下。每个完整离开游戏区域的障碍加 1 分;碰撞后停止本局,显示分数并允许重开。
| 操作 | 游戏中的动作 |
|---|---|
| Enter、空格或开始按钮 | 进入一局;结束后也可以再次开始 |
| A/D 或左右方向键 | 持续向对应方向移动 |
| P 或右上角按钮 | 暂停与继续 |
| R 或重开按钮 | 结束后清空本局,重新开始 |
| M | 切换声音 |
| F1 | 显示或隐藏矩形碰撞框 |
| Esc 或窗口关闭按钮 | 退出,保存最高分 |
本局分数重开后归零,最高分保留。界面中的 SCORE 表示本局分数,BEST 表示最高分,PAUSE 表示暂停。下面的画面由配套游戏实际绘制,之后逐步构建其中的状态和操作: