繁体   English   中英

Pygame蛇游戏

[英]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是身体部位的分组。 这是一个OrderedUpdates精灵组。

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

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

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

我的主要问题是:

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

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'并重复使用它,而不是每次都加载它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM