2017-02-02 7 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

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

最初のループは 'len(badguys)'まで 'index'を増やして、2番目のループでこの変数を再利用しています... –

答えて

1

あなたの最初の問題はM.ファーブルが言っただけで何である:あなたのループインデックスは、最初のループで有効です。 2番目のものではありません。これを修正するには、各ループの前に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です。あなたは、あなたがそれを実行している間、元のリストをそのまま維持するためにあなたの仕事を変更する必要があります。あなたのプログラムはヒットポイントを持っていないので、「範囲外のインデックス」クリティカルヒットをとることはできません。 :-)

私は、ロジックは、このようなものであることを推測:

  1. 城(位置< -64)を過ぎて走ったすべての悪者を削除します。
  2. 城に達したばかりの悪い人には、5〜20枚のHPダメージを与え、その悪者を取り除く。 ...

    if abs(left) <= 64: 
        # do damage 
        healthvalue -= random.randint(5,20) 
        # mark for deletion 
        left = -999 
    

    は、横方向の位置のためのあなたの表現としてを左に使用して)1がダメージを行うために、2つ目は、悪いの新しいリストを作成する:

私はこのために2つのパスを提案しますみんなリストをもう一度見て、プレイフィールドにまだ残っているものだけを残してください。

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

これは今のところ問題を解決しますか?

+0

私はまだパスをどこに追加すべきですか? (私は新しいプログラマーですので、私は何をしているのか分かりません:P)すべての助けをありがとう:) –

+0

あなたの現在のロジックをそれらのパスに置き換えてください。これには、フローチャート(または使用するプリコード計画ツール)を少し変更する必要があります。 – Prune

関連する問題