Pygame蛇游戏

时间:2014-06-12 10:22:45

标签: python pygame

好的,这是我第一次访问这个网站,所以我希望我能做到这一点。

我正在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是身体部位的分组。这是一个OrderedUpdates精灵组。

问题是代码似乎不喜欢这个解决方案。目前,错误列为“NameError:name'body'未定义”。如果我尝试扩展它,检查引用bodyparts.body.timeleft而不是body.timeleft,我改为“AttributeError:'OrderedUpdates'对象没有属性'body'”。

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

  1. 将len(bodyparts)与先前设置的变量进行比较。
  2. 如果长度超过蛇的长度,请删除添加到bodyparts的第一项 - 我不确定这是第一项还是最后一项。
  3. 我的主要问题是:

    这是一个可行的解决方案,你能提供代码吗?我可以像对待列表一样对待它,并将其拆分,以便丢弃bodyparts组的前面(或后面,取决于它们的添加方式)吗?你能提供的任何解决方案都会有很大的帮助。

1 个答案:

答案 0 :(得分: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'并重复使用,而不是每次都加载它。