一、环境搭建:5 分钟配置开发环境
Pygame 的安装过程非常简单,只需确保你的电脑已安装 Python 3.6+ 版本(推荐 3.8 及以上),然后通过 pip 命令完成安装。
1. 检查 Python 环境
首先打开终端(Windows 系统为 cmd 或 PowerShell,macOS/Linux 为终端),输入以下命令验证 Python 版本:
python --version # 或 python3 --version(部分系统)
若输出类似 Python 3.10.12 的结果,则说明 Python 环境正常。
2. 安装 Pygame
在终端中执行以下命令安装 Pygame 官方稳定版:
pip install pygame # 或 pip3 install pygame
安装完成后,可通过以下代码验证是否安装成功:
import pygame
print(pygame.__version__) # 输出 Pygame 版本号,如 2.5.2 即表示成功
二、Pygame 核心概念:理解游戏开发的 “骨架”
在开始写游戏前,我们需要先掌握 Pygame 的几个核心概念,它们是所有 Pygame 项目的基础框架。
1. 初始化与窗口创建
任何 Pygame 程序都需要先初始化库,并创建一个游戏窗口(即 “屏幕”)。示例代码如下:
import pygame
import sys
# 1. 初始化 Pygame
pygame.init()
# 2. 设置窗口大小和标题
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("我的第一个 Pygame 程序")
# 3. 游戏主循环(核心)
running = True
while running:
# 处理事件(如点击关闭、键盘输入等)
for event in pygame.event.get():
# 点击窗口关闭按钮时退出
if event.type == pygame.QUIT:
running = False
# 填充屏幕背景色(RGB 颜色,此处为浅灰色)
screen.fill((230, 230, 230))
# 更新屏幕显示(必须调用,否则绘制内容不生效)
pygame.display.flip()
# 退出 Pygame
pygame.quit()
sys.exit()
关键说明:
- pygame.init():初始化 Pygame 的所有模块(如音频、图形等),必须放在程序开头。
- 游戏主循环:是游戏的 “心脏”,负责持续处理事件、更新游戏状态、绘制画面,直到游戏结束。
- pygame.display.flip():刷新屏幕,将绘制的内容显示出来(也可用 pygame.display.update() 更灵活地刷新指定区域)。
2. 绘制基本图形
Pygame 提供了丰富的绘图函数,可快速绘制矩形、圆形、线段等基本图形,这是制作游戏元素的基础。
函数 | 功能 | 示例 |
pygame.draw.rect() | 绘制矩形 | pygame.draw.rect(screen, (255,0,0), (100,100,50,30)) |
pygame.draw.circle() | 绘制圆形 | pygame.draw.circle(screen, (0,255,0), (400,300), 20) |
pygame.draw.line() | 绘制线段 | pygame.draw.line(screen, (0,0,255), (0,0), (800,600), 2) |
参数说明:
- 第一个参数:绘制的目标屏幕(即 screen 对象);
- 第二个参数:颜色(RGB 元组,范围 0-255);
- 后续参数:图形的位置和尺寸(如矩形为 (x, y, 宽度, 高度),圆形为 (圆心x, 圆心y, 半径))。
3. 事件处理与键盘控制
游戏的交互性依赖于事件处理,Pygame 会将用户的操作(如键盘按键、鼠标点击)封装为 “事件”,开发者只需在主循环中捕获并处理这些事件。
示例:键盘控制矩形移动
# 在主循环中添加以下代码
# 初始化矩形位置和速度
rect_x = 100
rect_y = 100
rect_speed = 5
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 检测键盘按键(持续按键有效)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and rect_x > 0: # 左移,不超出屏幕左边界
rect_x -= rect_speed
if keys[pygame.K_RIGHT] and rect_x < SCREEN_WIDTH - 50: # 右移
rect_x += rect_speed
if keys[pygame.K_UP] and rect_y > 0: # 上移
rect_y -= rect_speed
if keys[pygame.K_DOWN] and rect_y < SCREEN_HEIGHT - 30: # 下移
rect_y += rect_speed
# 绘制
screen.fill((230,230,230))
pygame.draw.rect(screen, (255,0,0), (rect_x, rect_y, 50, 30))
pygame.display.flip()
关键函数:
- pygame.key.get_pressed():返回所有按键的状态(布尔值),适合处理 “持续按键”(如移动);
- event.type == pygame.KEYDOWN:适合处理 “单次按键”(如发射子弹),需在事件循环中判断。
三、实战项目:制作简易打砖块游戏
掌握了核心概念后,我们来实现一个完整的 “打砖块” 游戏,包含挡板控制、小球反弹、砖块消除三大核心功能。
1. 游戏设计思路
- 挡板:通过左右方向键控制,用于反弹小球;
- 小球:初始时向下运动,碰到挡板、上下左右边界时反弹;
- 砖块:排列在屏幕上方,小球碰到砖块后砖块消失,同时小球反弹。
2. 完整代码实现
import pygame
import sys
# 1. 初始化与常量设置
pygame.init()
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("简易打砖块游戏")
# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# 游戏元素参数
PADDLE_WIDTH = 100
PADDLE_HEIGHT = 15
PADDLE_SPEED = 8
BALL_SIZE = 15
BALL_SPEED_X = 5
BALL_SPEED_Y = 5
BRICK_WIDTH = 70
BRICK_HEIGHT = 20
BRICK_GAP = 5
BRICK_ROWS = 5
BRICK_COLS = 10
BRICK_TOP_MARGIN = 50
# 2. 初始化游戏元素
# 挡板(居中底部)
paddle_x = (SCREEN_WIDTH - PADDLE_WIDTH) // 2
paddle_y = SCREEN_HEIGHT - 40
# 小球(初始位置在挡板中央上方)
ball_x = paddle_x + PADDLE_WIDTH // 2 - BALL_SIZE // 2
ball_y = paddle_y - BALL_SIZE
ball_dx = BALL_SPEED_X # x方向速度
ball_dy = -BALL_SPEED_Y # y方向速度(初始向上)
# 砖块矩阵(通过二维列表存储砖块位置和状态)
bricks = []
for row in range(BRICK_ROWS):
brick_row = []
for col in range(BRICK_COLS):
brick_x = col * (BRICK_WIDTH + BRICK_GAP) + (SCREEN_WIDTH - BRICK_COLS*(BRICK_WIDTH+BRICK_GAP))//2
brick_y = row * (BRICK_HEIGHT + BRICK_GAP) + BRICK_TOP_MARGIN
brick_row.append({"rect": pygame.Rect(brick_x, brick_y, BRICK_WIDTH, BRICK_HEIGHT), "active": True})
bricks.append(brick_row)
# 3. 游戏主循环
running = True
clock = pygame.time.Clock() # 控制游戏帧率
while running:
# 控制帧率为60 FPS(避免游戏速度因电脑性能差异过大)
clock.tick(60)
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 4. 挡板控制
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle_x > 0:
paddle_x -= PADDLE_SPEED
if keys[pygame.K_RIGHT] and paddle_x < SCREEN_WIDTH - PADDLE_WIDTH:
paddle_x += PADDLE_SPEED
# 5. 小球移动与碰撞检测
# 小球位置更新
ball_x += ball_dx
ball_y += ball_dy
# 小球与左右边界碰撞(x方向反弹)
if ball_x <= 0 or ball_x >= SCREEN_WIDTH - BALL_SIZE:
ball_dx = -ball_dx
# 小球与上边界碰撞(y方向反弹)
if ball_y <= 0:
ball_dy = -ball_dy
# 小球与挡板碰撞(y方向反弹,确保只从上方碰撞)
paddle_rect = pygame.Rect(paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT)
ball_rect = pygame.Rect(ball_x, ball_y, BALL_SIZE, BALL_SIZE)
if ball_rect.colliderect(paddle_rect) and ball_dy > 0:
ball_dy = -ball_dy
# 小球与砖块碰撞
for row in bricks:
for brick in row:
if brick["active"] and ball_rect.colliderect(brick["rect"]):
brick["active"] = False # 消除砖块
ball_dy = -ball_dy # 小球反弹
break
# 6. 游戏结束判断(小球落地)
if ball_y >= SCREEN_HEIGHT:
font = pygame.font.Font(None, 74)
text = font.render("Game Over", True, RED)
screen.blit(text, (200, 250))
pygame.display.flip()
pygame.time.wait(3000) # 等待3秒后退出
running = False
# 7. 绘制所有元素
screen.fill(BLACK) # 黑色背景
# 绘制挡板
pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT))
# 绘制小球
pygame.draw.circle(screen, RED, (ball_x + BALL_SIZE//2, ball_y + BALL_SIZE//2), BALL_SIZE//2)
# 绘制砖块
for row in bricks:
for brick in row:
if brick["active"]:
# 不同行砖块用不同颜色
color = (0, 255 - row*40, 255)
pygame.draw.rect(screen, color, brick["rect"])
# 更新屏幕
pygame.display.flip()
# 退出游戏
pygame.quit()
sys.exit()
3. 代码核心解析
(1)砖块矩阵的创建
通过二维列表 bricks 存储每块砖块的位置(rect 对象)和激活状态(active),利用循环计算砖块的排列位置,确保居中显示。
(2)碰撞检测
Pygame 的 Rect.colliderect() 函数可快速检测两个矩形是否重叠,我们用它实现:
- 小球与挡板的碰撞;
- 小球与砖块的碰撞(碰撞后砖块设为 inactive,即 “消失”)。
(3)帧率控制
pygame.time.Clock().tick(60) 确保游戏每秒运行 60 次,避免小球移动速度因电脑性能不同而出现差异。
四、进阶方向:扩展你的打砖块游戏
掌握了基础版本后,你可以尝试添加以下功能,提升游戏的可玩性:
- 计分系统:每消除一块砖块增加分数,在屏幕上显示当前分数;
- 生命值:小球落地后减少一条生命,生命为 0 时游戏结束;
- 道具系统:随机掉落 “扩大挡板”“多球” 等道具,被挡板接住后生效;
- 关卡设计:增加砖块的行数、调整小球速度,实现多关卡难度递进;
- 音效与音乐:使用 pygame.mixer 模块添加碰撞音效和背景音乐。
五、常见问题与解决方案
- Q:运行程序后窗口闪退?
A:检查是否忘记写 游戏主循环,或循环内缺少 pygame.event.get()(会导致系统认为程序无响应)。
- Q:小球穿透砖块 / 挡板?
A:确保碰撞检测在小球位置更新后执行,且帧率不要过低(建议 60 FPS)。
- Q:无法正常安装 Pygame?
A:尝试使用国内镜像源安装:pip install pygame -i Simple Index。