Pygame Snake Game



好吧,这是我第一次来这个网站,所以我希望我写对了。

我正在Pygame中制作一个蛇游戏,用于学校的评估任务,我有一个问题。我无法让蛇的身体部分消失。

目前,身体部分是这样生成的:

def more_body(bodyparts, x, y, z):
    body = pygame.sprite.Sprite()
    body.image = pygame.image.load('body.png')
    body.rect = head.image.get_rect()
    body.rect.right = x
    body.rect.top = y
    body.timeleft = z
    bodyparts.add(body)

正文删除检查的工作原理如下:

for x in bodyparts:
    body.timeleft -= 1
    if body.timeleft == 0:
        body = False
很明显,

Bodyparts是Bodyparts的分组。这是一个ordereduupdates精灵组

问题是代码似乎不喜欢这个解决方案。目前,该错误显示为"NameError: name 'body' is not defined"。如果我把它扩展到引用bodyparts。body。timeleft而不是body。timeleft,我反而得到"AttributeError: ' ordereduupdates '对象没有属性'body'"。

我想到了第二个解决方案。由于bodyparts是一个ordereduupdates组,因此应该可以根据它们在列表中的位置选择和删除特定的部件。因此,计划的步骤如下:

  1. 将len(bodyparts)与先前设置的变量进行比较。
  2. 如果长度超过了蛇的长度,删除添加到身体部位的第一个项目-我不确定这是第一个还是最后一个。

我的主要问题是:

这是一个可行的解决方案,你能提供代码做到这一点吗?我是否可以将其视为一个列表,并将其拆分,以便删除身体部位组的前面(或后面,取决于它们如何添加)?

for x in bodyparts:
    body.timeleft -= 1
    if body.timeleft == 0:
        body = False

在这里,你迭代精灵组,将每个精灵存储在变量x中。您从未定义body,因此会引发异常。

即使你这样做了,将body设置为False也不会神奇地将精灵从精灵组中移除。为此,使用remove方法。

所以你应该把循环改成:

for body in bodyparts:
    body.timeleft -= 1
    if body.timeleft == 0:
        bodyparts.remove(body)

除了使用精灵组,你还可以使用一个简单的列表,并在它变得太大时删除元素:

max_len = 4 # current max length of snake
bodyparts = []
def more_body(bodyparts, x, y, z):
    body = ...
    bodyparts.append(body)
    bodyparts=bodyparts[-max_len:]

另外,您应该只加载一次图像'body.png'并重用它,而不是每次都加载它。

最新更新