《Python 游戏开发入门:Pygame 打造经典贪吃蛇(附完整源码)》
·
Python 游戏开发入门:使用 Pygame 创建经典贪吃蛇游戏
贪吃蛇是一款经典的游戏,玩家控制一条蛇在屏幕上移动,通过吃食物来增长身体,同时避免撞到墙壁或自身。本教程将使用 Python 的 Pygame 库来从头构建一个简单但完整的贪吃蛇游戏。Pygame 是一个专为游戏开发设计的库,它提供了图形、声音和输入处理功能,非常适合初学者入门。
我将逐步解释游戏开发的关键步骤,帮助你理解核心逻辑。最后,我会提供完整的可运行源码。游戏实现包括:
- 初始化游戏窗口和基本设置。
- 创建蛇的初始位置和移动逻辑。
- 生成食物并检测碰撞。
- 处理用户键盘输入(方向控制)。
- 计分系统和游戏结束条件。
步骤 1:准备工作
确保已安装 Python 和 Pygame。如果未安装 Pygame,可通过以下命令安装:
pip install pygame
步骤 2:游戏核心逻辑解释
贪吃蛇游戏基于一个网格系统,屏幕被划分为多个单元(例如,每个单元大小为 $20 \times 20$ 像素)。蛇的位置由一系列坐标点表示,例如蛇头位置为 $(x, y)$,蛇身由列表存储。食物位置随机生成在 $(food_x, food_y)$。
- 移动逻辑:蛇头根据方向(如右移时 $dx = 1$, $dy = 0$)更新位置到新坐标 $(x + dx, y + dy)$。蛇身跟随移动。
- 碰撞检测:
- 吃食物:当蛇头位置 $(x, y)$ 与食物位置 $(food_x, food_y)$ 重合时(即 $x = food_x$ 且 $y = food_y$),蛇长度增加。
- 游戏结束:如果蛇头撞墙(例如,$x < 0$ 或 $x > \text{屏幕宽度}$)或撞到自身(蛇头坐标与任何蛇身坐标重合),游戏结束。
- 方向控制:用户使用键盘箭头键改变蛇的移动方向,方向向量 $(dx, dy)$ 更新为 $(-1, 0)$、$(1, 0)$、$(0, -1)$ 或 $(0, 1)$。
步骤 3:完整源码
以下代码实现了贪吃蛇游戏的所有功能。代码结构清晰,包含初始化、游戏循环和绘图逻辑。复制粘贴后可直接运行。
import pygame
import random
import sys
# 初始化 Pygame
pygame.init()
# 游戏设置
WIDTH, HEIGHT = 600, 400 # 屏幕大小
GRID_SIZE = 20 # 网格单元大小
FPS = 10 # 游戏帧率
# 颜色定义
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
# 创建游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏")
clock = pygame.time.Clock()
# 初始化蛇
snake = [(WIDTH // 2, HEIGHT // 2)] # 蛇初始位置在屏幕中心
snake_direction = (1, 0) # 初始方向向右 (dx, dy)
# 初始化食物
food = (random.randint(0, (WIDTH - GRID_SIZE) // GRID_SIZE) * GRID_SIZE,
random.randint(0, (HEIGHT - GRID_SIZE) // GRID_SIZE) * GRID_SIZE)
# 计分
score = 0
font = pygame.font.SysFont(None, 36)
def draw_snake():
for segment in snake:
pygame.draw.rect(screen, GREEN, (segment[0], segment[1], GRID_SIZE, GRID_SIZE))
def draw_food():
pygame.draw.rect(screen, RED, (food[0], food[1], GRID_SIZE, GRID_SIZE))
def check_collision():
head_x, head_y = snake[0]
# 检查撞墙
if head_x < 0 or head_x >= WIDTH or head_y < 0 or head_y >= HEIGHT:
return True
# 检查撞自身
for segment in snake[1:]:
if head_x == segment[0] and head_y == segment[1]:
return True
return False
# 游戏主循环
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
# 处理方向键输入
if event.key == pygame.K_UP and snake_direction != (0, 1):
snake_direction = (0, -1)
elif event.key == pygame.K_DOWN and snake_direction != (0, -1):
snake_direction = (0, 1)
elif event.key == pygame.K_LEFT and snake_direction != (1, 0):
snake_direction = (-1, 0)
elif event.key == pygame.K_RIGHT and snake_direction != (-1, 0):
snake_direction = (1, 0)
# 移动蛇
head_x, head_y = snake[0]
dx, dy = snake_direction
new_head = (head_x + dx * GRID_SIZE, head_y + dy * GRID_SIZE)
snake.insert(0, new_head)
# 检查是否吃到食物
if new_head[0] == food[0] and new_head[1] == food[1]:
# 生成新食物
food = (random.randint(0, (WIDTH - GRID_SIZE) // GRID_SIZE) * GRID_SIZE,
random.randint(0, (HEIGHT - GRID_SIZE) // GRID_SIZE) * GRID_SIZE)
score += 1
else:
snake.pop() # 没吃到食物,移除尾部
# 检查碰撞
if check_collision():
running = False
# 绘制游戏
screen.fill(BLACK)
draw_snake()
draw_food()
# 显示分数
score_text = font.render(f"分数: {score}", True, WHITE)
screen.blit(score_text, (10, 10))
pygame.display.flip()
clock.tick(FPS)
# 游戏结束
pygame.quit()
sys.exit()
步骤 4:如何运行游戏
- 将上述代码保存为
.py文件(例如snake_game.py)。 - 在终端运行命令:
python snake_game.py。 - 使用键盘方向键(↑、↓、←、→)控制蛇的移动。
- 游戏结束后,窗口会自动关闭,终端会显示退出信息。
常见问题解答
- 游戏速度调整:修改代码中的
FPS变量(值越大,蛇移动越快)。 - 添加功能:例如,可以添加音效或游戏重启逻辑。在源码基础上扩展即可。
- 数学原理:游戏基于简单坐标计算,如蛇头移动时新位置为 $(x + dx \times \text{GRID_SIZE}, y + dy \times \text{GRID_SIZE})$,碰撞检测使用坐标比较。
这个贪吃蛇游戏是入门级项目,通过它你可以学习 Pygame 的基本用法。如果有问题,欢迎进一步提问!
更多推荐
所有评论(0)