Pygame Snake,第3部分

发布: (2026年4月22日 GMT+8 07:25)
4 分钟阅读
原文: Dev.to

Source: Dev.to

使用键盘输入控制方块

使用方向向量

一种方便的方式来存储蛇的速度和方向是使用 pygame.Vector2
四个方向可以表示为:

方向向量
向右Vector2(1, 0)
向左Vector2(-1, 0)
向上Vector2(0, -1)
向下Vector2(0, 1)

注意: 在 Pygame 中,Y 轴向递增,所以“向上”使用负的 Y 分量。

在创建点(dot)后添加一个速度变量:

vel = pygame.Vector2(1, 0)   # 初始向右移动

在事件循环中,处理方向键:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RIGHT:
        vel = pygame.Vector2(1, 0)
    if event.key == pygame.K_DOWN:
        vel = pygame.Vector2(0, 1)
    if event.key == pygame.K_LEFT:
        vel = pygame.Vector2(-1, 0)
    if event.key == pygame.K_UP:
        vel = pygame.Vector2(0, -1)

最后,在每一帧更新点的位置:

dot = dot + vel   # 或者直接写成: dot += vel

运行程序后,你就可以用方向键移动方块了。

完整示例(步骤 1)

import pygame

W = 30
H = 30
S = 20

# pygame 设置
pygame.init()
screen = pygame.display.set_mode((W * S, H * S))
clock = pygame.time.Clock()
running = True

dot = pygame.Vector2(W / 2, H / 2)
vel = pygame.Vector2(1, 0)

while running:
    # 轮询事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                vel = pygame.Vector2(1, 0)
            if event.key == pygame.K_DOWN:
                vel = pygame.Vector2(0, 1)
            if event.key == pygame.K_LEFT:
                vel = pygame.Vector2(-1, 0)
            if event.key == pygame.K_UP:
                vel = pygame.Vector2(0, -1)

    # 清屏
    screen.fill("white")

    # 移动并绘制方块
    dot += vel
    square = pygame.Rect(dot * S, (S, S))
    screen.fill("black", square)

    # 更新显示
    pygame.display.flip()
    clock.tick(20)

pygame.quit()

使用字典进行重构

重复的 if 语句可以用一个字典来映射键到速度向量:

key_vel = {
    pygame.K_RIGHT: pygame.Vector2(1, 0),
    pygame.K_DOWN:  pygame.Vector2(0, 1),
    pygame.K_LEFT:  pygame.Vector2(-1, 0),
    pygame.K_UP:    pygame.Vector2(0, -1)
}

将此定义放在主循环之前。随后 KEYDOWN 的处理可以写成:

if event.type == pygame.KEYDOWN and event.key in key_vel:
    vel = key_vel[event.key]

完整示例(重构后)

import pygame

W = 30
H = 30
S = 20

# pygame 设置
pygame.init()
screen = pygame.display.set_mode((W * S, H * S))
clock = pygame.time.Clock()
running = True

dot = pygame.Vector2(W / 2, H / 2)
vel = pygame.Vector2(1, 0)

# 将键映射到速度向量
key_vel = {
    pygame.K_RIGHT: pygame.Vector2(1, 0),
    pygame.K_DOWN:  pygame.Vector2(0, 1),
    pygame.K_LEFT:  pygame.Vector2(-1, 0),
    pygame.K_UP:    pygame.Vector2(0, -1)
}

while running:
    # 轮询事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in key_vel:
            vel = key_vel[event.key]

    # 清屏
    screen.fill("white")

    # 移动并绘制方块
    dot += vel
    square = pygame.Rect(dot * S, (S, S))
    screen.fill("black", square)

    # 更新显示
    pygame.display.flip()
    clock.tick(20)

pygame.quit()

使用字典的方法可以让代码更短、更清晰,也更容易扩展(例如添加更多控制键)。

0 浏览
Back to Blog

相关文章

阅读更多 »

Pygame Snake,第2部分

介绍 在第一部分,我们建立了一个基本的 pygame 窗口,拥有 1000 × 1000 像素的画布和一个 50 × 50 像素的方块,该方块持续移动。对于贪吃蛇游戏 w...

Pygame 贪吃蛇,第1部分

介绍 Pygame 是一个让我们使用 Python 创建 2D 游戏的模块。它是学习编程概念的好方法,经典游戏 Snake 也是一个很好的例子。

如何使用 Python 验证印度邮政编码

如何使用 Python 验证印度邮政编码(Pincode)并查找地区、子地区和区。以下脚本验证 6 位印度邮政编码,并返回相应的地区、子地区和区。