遍历列表(索引超出范围)

2024-05-16 20:48:45 发布

您现在位置:Python中文网/ 问答频道 /正文

快速总结一下我正在创建的内容:这是一个游戏,其中一个外星飞船在屏幕上反弹(如戴尔标志/加载屏幕)有一定的边界,使它停留在屏幕顶部附近。在屏幕底部附近有一个玩家飞船,它必须以点击的方式射击敌人的太空入侵者,同时左右移动(但目前我仍在使用键盘/鼠标同时工作,因为事件只在队列的顶部进行)。母舰也从你下面发射母牛。如果你抓住那头牛,你就会得到分数。如果你没能躲开一个,你就会失去分数和生命。如果你用“网”抓住一个,你就会得到分数。你知道吗

我遇到的问题是这个错误(cowRect = (cow_x[i], cow_y[i], 127, 76) IndexError: list index out of range),我认为这可能是由于程序试图在列表仍然为空的情况下遍历列表而导致的,尽管它在“扫描”列表时似乎列表中有项目。你知道吗

我的一些代码片段(大约170行,所以我不会全部发布):

开始-

cowList = []
statusList = []
cow_x = []
cow_y = []

主回路内部-

if hits >= hitsNeeded and time.time() >= currentTime + 1:
        cowList.append(cownumber)
        cownumber += 1
        statusList.append(3)
        cow_x.append(random.randint(0, 573))
        cow_y.append(700)

也在主回路内-

for i in statusList:
        cowRect = (cow_x[i], cow_y[i], 127, 76)
        if cow_y[i] + 111 < 0:
            statusList[i] = 0  #offscreen
        if cowRect.colliderect(missileRect):
            statusList[i] = 1  #exploded
            points -= 15
        netRect = (net_x, net_y, 127, 127)
        if cowRect.colliderect(netRect):
            points += 90
            screen.blit(milkplus, (cow_x[i], cow_y[i]))
            powerup = pygame.mixer.Sound("C:/Python35/powerup.mp3")
            powerup.play()
            shotNet = 0
            statusList[i] = 2  #caught
        if cowRect.colliderect(playerRect):
            points -= 10
            lives -= 1
            statusList[i] = 4  #player collision

    for i in statusList:
        if statusList[i] == 3:  #alive
            screen.blit(cow, (cow_x[i], cow_y[i]))
            cow_y[i] -= cowSpeed

是的,我确实意识到我并不需要有4种状态的牛,它只是帮助我保持头脑有条理(这也适用于这里的其他一些事情)。你知道吗

如果我犯了什么错误,我很抱歉,我已经很久没来这里了。你知道吗


Tags: 列表if屏幕time错误分数pointsappend
1条回答
网友
1楼 · 发布于 2024-05-16 20:48:45

您看到的问题是由于for循环在Python中的工作方式造成的。它们遍历列表的内容,而不是列表索引。正如在评论中提到的,您可以通过简单地执行for i in range(len(statusList))来修复错误,但是我想建议您使用稍微不同的策略来编码关于奶牛的信息,方法是使用一个奶牛列表,而不是四个关于奶牛的列表。你知道吗

class Cow:
    def __init__(x, y):
        self.status = 'alive'
        self.x = x
        self.y = y

开始-

cows = []

主回路内部-

if hits >= hitsNeeded and time.time() >= currentTime + 1:
    cows.append(Cow(random.randint(0, 573), 700))

也在主回路内-

for cow in cows:
    cowRect = (cow.x, cow.y, 127, 76)
    if cow.y + 111 < 0:
        cow.status = 'offscreen'
    if cowRect.colliderect(missileRect):
        cow.status = 'exploded'
        points -= 15
    netRect = (net_x, net_y, 127, 127)
    if cowRect.colliderect(netRect):
        points += 90
        screen.blit(milkplus, (cow.x, cow.y))
        powerup = pygame.mixer.Sound("C:/Python35/powerup.mp3")
        powerup.play()
        shotNet = 0
        cow.status = 'caught'  #caught
    if cowRect.colliderect(playerRect):
        points -= 10
        lives -= 1
        cow.status = 'collision'

for cow in cows:
    if cow.status == 'alive':
        screen.blit(cow_pic, (cow.x, cow.y))
        cow.y -= cowSpeed

这将使事情在未来变得更容易。如果您对类感到不舒服,那么可以使用collections.namedtuple获得类似的行为。你知道吗

相关问题 更多 >