1

我目前正在尝试使用 pygame 开发游戏,但我的一些列表存在一些问题。真的很简单,我希望镜头在屏幕外时被删除。我当前的代码可以完美运行,直到我拍摄不止一个。

当前代码:

#ManageShots
for i in range (len(ShotArray)):
    ShotArray[i].x += 10
    windowSurface.blit(ShotImage, ShotArray[i])
    if(ShotArray[i].x > WINDOWWIDTH):
        ShotArray.pop(i)

错误信息:

ShotArray[i].x += 10
IndexError: list index out of range
4

3 回答 3

5

从列表中弹出一个项目会将该项目之后的所有内容移到一个位置。因此,您最终得到的索引i很容易超出范围。

循环后从列表中删除项目,或反向循环列表:

for shot in reversed(ShotArray):
    shot.x += 10
    windowSurface.blit(ShotImage, shot)
    if shot.x > WINDOWWIDTH:
        ShotArray.remove(shot)
于 2013-02-01T17:08:53.250 回答
2

问题是len(SortArray)在循环开始时评估一次。但是,您可以通过调用来更改列表的长度ShotArray.pop(i)

i = 0
while i < len(ShotArray):
    ShotArray[i].x += 10
    windowSurface.blit(ShotImage, ShotArray[i])
    if(ShotArray[i].x > WINDOWWIDTH):
        ShotArray.pop(i)
    else:
        i += 1
于 2013-02-01T17:08:31.283 回答
2

你可能想要这样的东西:

# update stuff
for shot in ShotArray:
    shot.x += 10
    windowSurface.blit(ShotImage, shot)

# replace the ShotArray with a list of visible shots
ShotArray[:] =  [shot for shot in ShotArray if shot.x < WINDOWWIDTH]

不要更改您正在迭代的列表的长度,这会导致混乱。

于 2013-02-01T17:13:43.380 回答