2017-02-02 2 views
-2
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) 

:IndexError : 범위를 벗어난 팝 지수 (파이썬) 나에게 오류를주는 3

귀하의 초기 문제가 M. 파브르가 말한 것입니다
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 
+1

첫 번째 루프는'index'를'len (badguys)'까지 늘리고 두 번째 루프에서이 변수를 재사용하고 있습니다 ... –

답변

1

: 루프 지수는 첫 번째 루프를 통해 유효 그러나 두 번째는 아닙니다. 이 문제를 해결하려면 각 루프 앞에 index = 0을 설정하면됩니다 (파이썬은 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입니다. 원래 목록을 그대로 유지하면서 작업을 변경해야합니다. 당신의 프로그램은 "범위를 벗어난 인덱스"치명타를 맞추기에 충분한 히트 포인트를 가지고 있지 않습니다.

  1. 는 성 (위치 < -64)를지나 실행 어떤 나쁜 사람을 제거합니다 :-)

    나는 논리가이 같은 것을 추론.

  2. 방금성에 도달 한 나쁜 놈의 경우 HP 5-20의 피해를 입히고 그 나쁜 놈을 제거하십시오. ...

    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] 

지금은 문제가 해결되지 않습니까?

+0

나는 패스를 어디에 추가해야합니까? (나는 새로운 프로그래머이므로 내가하는 일을 정말로 알지 못한다 : P) 모든 도움에 감사드립니다. –

+0

당신은 현재 로직을 그 패스로 교체합니다. 이를 위해서는 순서도 (또는 사용하는 모든 사전 코드 계획 도구)를 약간 재구성해야합니다. – Prune

관련 문제