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)
给我错误:
Traceback (most recent call last):
File "C:\Users\Thinkpad\Desktop\BB_Resources\game.py", line 80, in <module>
badguys.pop(index)
IndexError: pop index out of range
答案 0 :(得分:1)
你最初的问题正是M. Fabre所说的:你的循环索引在第一个循环中是有效的,但不是第二个循环。要解决这个问题,只需在每个循环之前设置 index = 0 (请记住Python在0处开始索引)。
但是,您的循环中存在更深层次的问题:在您对列表进行迭代时更改 badguys 会对您造成伤害。一段时间尝试这个测试:
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。您需要更改您的工作,以便在运行时保持原始列表的完整性。相信我,你的程序没有足够的生命值来使一个&#34;指数超出范围&#34;重击。 : - )
我推断逻辑是这样的:
我建议两次通过:一次造成伤害(使用左作为横向位置的表达式)
if abs(left) <= 64:
# do damage
healthvalue -= random.randint(5,20)
# mark for deletion
left = -999
......还有第二个制作新的坏人名单。再次浏览列表,只保留仍然在比赛场地的列表:
badguys = [badguy if badguy.left > -64 for badguy in badguys]
现在这会让你摆脱困境吗?
答案 1 :(得分:0)
摆脱这一行:
index+=1
它应该可以工作