【问题标题】:Pygame Snake GamePygame 蛇游戏
【发布时间】:2014-06-12 10:22:45
【问题描述】:

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

我正在 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

很明显,身体部位是身体部位的分组。这是一个 OrderedUpdates 精灵组。

问题是代码似乎不喜欢这个解决方案。目前,该错误被列为“NameError: name 'body' is not defined”。如果我尝试扩展检查以引用 bodyparts.body.timeleft 而不是 body.timeleft,我会得到“AttributeError: 'OrderedUpdates' object has no attribute 'body'”。

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

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

我的主要问题是:

这是一个可行的解决方案,您能否提供代码来实现它?我可以将它视为一个列表,然后拆分它以便删除 bodyparts 组的前面(或后面,取决于它们的添加方式)吗?您能提供的任何解决方案都会有很大帮助。

【问题讨论】:

    标签: python pygame


    【解决方案1】:
    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' 并重复使用它,而不是每次都加载它。

    【讨论】:

    • 我实际上并不知道 remove 方法。话虽如此,x-body 的冲突应该已经很明显了……>.
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多