Python 现代开发学习笔记

(一)建立第一个可以关闭的窗口

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 表示暂停。下面的画面由配套游戏实际绘制,之后逐步构建其中的状态和操作:

躲避障碍小游戏画面,青色玩家位于底部,橙色障碍向下移动,顶部显示本局与最高分

笔记正文与全部题解 · Ctrl / ⌘ K