如何增加蛇的长度,使其遵循前面的矩形/长度,而不是直接位于头部的后面

时间:2019-05-08 07:59:21

标签: python pygame

我当前程序的工作方式是,当蛇吃一个苹果时,蛇的长度就会增加。但是,长度跟随蛇的方式是,蛇总是始终位于头部的后方。像普通的蛇游戏一样,我该如何使其跟随蛇或跟随蛇前面的长度?

这是我向蛇添加长度时的代码。

for i in range(lengthAmount):
        if i == 0:
            previousx = snakex - (30 * i)
            previousy = snakey
        if direction == "left":
            previousx = snakex + (30 * i)
            previousy = snakey
        elif direction == "right":  
            previousx = snakex - (30 * i)
            previousy = snakey
        elif direction == "up":
            previousx = snakex 
            previousy = snakey + (30 * i)
        elif direction == "down":
            previousx = snakex  
            previousy = snakey - (30 * i)

        pygame.draw.rect(window, (0, 175, 0), (previousx, previousy, 30, 30))

1 个答案:

答案 0 :(得分:1)

您需要的是蛇体部位列表,而不是知道部位数量的变量。该列表包含蛇体的位置(不包括头部)。蛇的拥有者存储在snakexsnakey中。 在游戏开始时,身体部位列表为空:

snake_body = []

在游戏循环中移动蛇之前,请将蛇的头部位置附加到身体列表中。

while run:

    # [...]

    snake_body.append((snakex, snakey))

之后,通过改变位置移动蛇。验证蛇是否吃了一个苹果并将结果存储到状态变量(eat_appel):

# move sanke
snakex += # [...]
snakey += # [...]
eat_appel = # True if snake eats an apple else False

下一步是评估蛇的长度。
如果蛇吃了一个苹果,那么身体的长度必须增加1。这可以实现,因为我们在蛇的身体上增加了一部分。
如果蛇不吃苹果,那么身体的长度应该保持相等。在这种情况下,我们必须删除正文列表的第一部分。列表的元素可以通过del语句删除。 注意,由于我们在正文列表的末尾添加了一个元素,但是我们删除了列表的第一个元素,因此这导致正文部分不断变化并保持“跟随”蛇的头部。

if not eat_appel:
    del snake_body[0]

绘制蛇时,在存储位置绘制矩形就足够了:

# draw body
for body in snake_body:
    pygame.draw.rect(window, (0, 175, 0), (*body, 30, 30))
# draw head (in a different color)
pygame.draw.rect(window, (175, 175, 0), (snakex, snakey, 30, 30))