所以我有一个用python编写的小游戏,如果你看到我之前的问题,你知道它是一个“太空入侵者”克隆。
所以几乎所有东西现在都在顺利运行,除了偶尔出现的随机错误。这是完全随机的,它可能在一些子弹发射后发生,或者根本不会发生。
我有这段代码:
for bullet in bullets:
bullet.attack()
if bullet.posy<=-20:
bullet_draw=False
if bullet_draw==True:
bullet.draw()
for enemy in enemies:
if bullet.sprite.rect.colliderect(enemy.sprite.rect):
enemy.health-=1
bullets.remove(bullet)
bullet_draw=False
else:
bullet_draw=True
有时它会给我以下错误。
Traceback (most recent call last):
File "\Programming\space invaders\space.py", line 280, in <module>
bullets.remove(bullet)
ValueError: list.remove(x): x not in list
请注意,此错误完全是随机的;即使不是,我也无法追溯它的起源。关于如何消除它的任何帮助?
答案 0 :(得分:5)
尝试将其更改为以下内容:
for bullet in bullets[:]: # this is changed, iterating over a copy
bullet.attack()
if bullet.posy<=-20:
bullet_draw=False
if bullet_draw==True:
bullet.draw()
for enemy in enemies:
if bullet.sprite.rect.colliderect(enemy.sprite.rect):
enemy.health-=1
bullets.remove(bullet)
bullet_draw=False
break # this is added, prevents multiple removes
else:
bullet_draw=True
请注意我添加的两条评论显示更改,break
是必要的,因为单个子弹可能会击中多个敌人,这会导致bullets.remove(bullet)
被调用两次,这会导致追溯你看到了。
第一个更改是必要的,因为在迭代时从列表中删除元素可能会导致一些意外后果,因为在迭代期间最终会跳过某些元素。以下代码说明了这一点:
>>> data = range(10)
>>> for x in data:
... data.remove(x)
...
>>> data
[1, 3, 5, 7, 9]
即使代码看起来应该从列表中删除每个元素,但它只会删除所有其他元素,因为列表索引在迭代期间会发生变化。
答案 1 :(得分:4)
你的子弹击中了多个敌人。您需要break
循环中的enemies
。