索引器错误:弹出索引超出范围(python)3

2024-04-29 04:10:57 发布

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

arrows=[]
badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=196

index=1

for badguy in badguys:
    if badguy[0]<-64:
        badguys.pop(index)
    badguy[0]-=7
    index+=1
for badguy in badguys:
    screen.blit(badguyimg, badguy)
# 6.3.1 - Attack castle
    badrect=pygame.Rect(badguyimg.get_rect())
    badrect.top=badguy[1]
    badrect.left=badguy[0]
    if badrect.left<64:
        healthvalue -= random.randint(5,20)
        badguys.pop(index)

告诉我错误:

^{pr2}$

Tags: inforindexifleftpopscreenarrows
1条回答
网友
1楼 · 发布于 2024-04-29 04:10:57

你最初的问题就是M.Fabre所说的:你的循环索引在第一个循环中是有效的,而不是第二个循环。要解决这个问题,只需在每个循环之前设置index=0(记住Python从0开始索引)。在

然而,循环中有一个更深层次的问题:在遍历列表时更改坏人会伤害到你。找个时间试试这个测试:

badguys = [0, 1, 2, 3, 4, 5, 6, 7]
for i in badguys:
    print "Before:", i, badguys
    badguys.pop(i)
    print "After: ", i, badguys

这是一个MCVE的代码。你需要改变你的工作来保持原始列表的完整性。相信我,你的程序没有足够的生命值来承受“指数超出范围”的致命一击。:-)

我推断逻辑是这样的:

  1. 把所有跑过城堡的坏人赶走(位置-64)。在
  2. 对于任何刚到达城堡的坏人,造成5-20点的生命伤害,然后移除这个坏人。在

我建议两次传球:一次造成伤害(用作为侧位的表达式)

^{pr2}$

。。。还有一秒钟来列一个新的坏人名单。再看一遍名单,只保留那些还在比赛场地上的人:

badguys = [badguy if badguy.left > -64 for badguy in badguys]

这能让你暂时摆脱麻烦吗?在

相关问题 更多 >