Pygame Zero之贪吃蛇(二)

本文来研究如何移动小蛇,而且仅限于向右移动,严格的说其实是「前进」。这里需要思考的问题是:为什么不是上下左右移动呢?

因为在游戏中,上下左右是相对于游戏窗口的,小蛇的移动方向只有前进,也就是朝着蛇头的方向(小蛇是不能倒退的哦)。如果想要往其他方向移动,只能改变蛇头的方向,这时蛇的形状就会发生改变,我们下次再来研究。

在小蛇向右移动一格的时,大概经历了下边的过程。

移动一格分为两步完成:

  1. 在旧蛇头右侧添加一个新蛇头,旧蛇头编程蛇身的一部分
  2. 删除旧蛇尾,原来挨着旧蛇尾的蛇身变成了新蛇尾

这样,我们可以在update()函数中编写这部分代码:

1
2
3
4
5
6
7
8
9
10
11
# 前置代码见9-1.py

def update():
newSnakeHead = Actor('snake1') # 创建新蛇头
newSnakeHead.x = Snake[0].x + TILE_SIZE # 初始化新蛇头横坐标,为旧蛇头加一个格子宽
newSnakeHead.y = Snake[0].y # 初始化新蛇头纵坐标,和旧蛇一样
Snake.insert(0, newSnakeHead) # 列表中插入新蛇头
del Snake[len(Snake) - 1] # 列表中删除旧蛇尾


pgzrun.go()

结果如下:

可以看到小蛇移动速度非常快,因此我们可以导入time库来减速。比如每次update()以后,暂停0.2秒:

1
2
3
4
5
6
7
8
9
10
11
12
13
import time
# 前置代码见9-1.py

def update():
newSnakeHead = Actor('snake1')
newSnakeHead.x = Snake[0].x + TILE_SIZE
newSnakeHead.y = Snake[0].y
Snake.insert(0, newSnakeHead)
del Snake[len(Snake) - 1]
time.sleep(0.2) # 暂停0.2秒


pgzrun.go()

运行程序,有一种古老游戏的感觉了,小蛇看起来是在一格一格的前进!