我一直在尝试用PyGame创建一个游戏,但有时会因为这个错误而崩溃:
ValueError: <main.projectile object at 0x0000024699C2C670> is not in list您是否知道任何可能的修复方法?
正如我从其他人那里看到的,可能是我在迭代的同时修改了项目符号列表,但我找不到解决方案,甚至在阅读这个线程时也找不到解决方案。
PS。我知道我可以使用一个函数来生成小精灵,而不仅仅是复制和粘贴,但这是一个我试图克服的快速项目。代码如下:
def enemy():
def __init__(self, x, y, width, height, end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.path = [self.x, self.end]
self.walkCount = 0
self.vel = 3
self.hitbox = (self.x + 17, self.y + 2, 31, 57)
self.health = 10
self.visible = True
bullets = []
goblin = enemy(100, 410, 64, 64, 450)
# mainloop
while run:
if not goblin.visible:
goblin.hitbox = 0
for bullet in bullets:
if 0 < bullet.x < 500:
bullet.x += bullet.vel
else:
if len(bullets) != 0:
bullets.pop(bullets.index(bullet))发布于 2021-06-28 16:23:33
这里的问题似乎是,您迭代了for循环中的项目符号,并在中途删除了一个项目符号。下面这行
for bullet in bullets:在实践中,将通过index从第一个项目符号到最后一个项目符号逐一进行检查。也就是说,如果您的列表是bullets = [bullet1, bullet2, bullet3],它将针对bullets[0]执行,然后针对bullets[1]执行,最后针对bullets[2]执行。当您从列表中删除项目符号时,此处会出现问题。假设在循环中删除了bullet2 (即bullets[1] )。现在索引仍将跳转到2,并且将访问bullets[2]。但是,现在只有两个项目符号bullets = [bullet1, bullet3],并且出现错误。
另一方面,如果bullet1被移除,bullets现在就是bullets = [bullet2, bullet3]了。循环继续到索引1,但这完全跳过了bullet2。
在许多编程语言中,这是一个非常常见的问题。在许多语言中,从最后一项到第一项迭代列表可以解决这个问题,但在python中这并不简单。
看看this StackOverflow answer,更好地了解你的选择。
一种解决方案
解决这个问题的一种方法不是最有效的,但相对容易理解的是,在评估项目的同时,构建一个新的项目列表。您将添加保留在新项目列表中的所有项目符号,而不是删除项目符号。
newBullets = []
for bullet in bullets:
if 0 < bullet.x < 500:
bullet.x += bullet.vel
# append bullet to keep it
newBullets.append(bullet)
# else don't do anything
# after the loop, update the bullets list
# which now contains only bullets that have an x between 0 and 500
bullets = newBulletshttps://stackoverflow.com/questions/68152947
复制相似问题