我当前程序的工作方式是,当蛇吃一个苹果时,蛇的长度就会增加。但是,长度跟随蛇的方式是,蛇总是始终位于头部的后方。像普通的蛇游戏一样,我该如何使其跟随蛇或跟随蛇前面的长度?
这是我向蛇添加长度时的代码。
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))
答案 0 :(得分:1)
您需要的是蛇体部位列表,而不是知道部位数量的变量。该列表包含蛇体的位置(不包括头部)。蛇的拥有者存储在snakex
和snakey
中。
在游戏开始时,身体部位列表为空:
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))