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:如何运行游戏
  1. 将上述代码保存为 .py 文件(例如 snake_game.py)。
  2. 在终端运行命令:python snake_game.py
  3. 使用键盘方向键(↑、↓、←、→)控制蛇的移动。
  4. 游戏结束后,窗口会自动关闭,终端会显示退出信息。
常见问题解答
  • 游戏速度调整:修改代码中的 FPS 变量(值越大,蛇移动越快)。
  • 添加功能:例如,可以添加音效或游戏重启逻辑。在源码基础上扩展即可。
  • 数学原理:游戏基于简单坐标计算,如蛇头移动时新位置为 $(x + dx \times \text{GRID_SIZE}, y + dy \times \text{GRID_SIZE})$,碰撞检测使用坐标比较。

这个贪吃蛇游戏是入门级项目,通过它你可以学习 Pygame 的基本用法。如果有问题,欢迎进一步提问!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐