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