2012-04-11 16 views
0

私はPythonで書かれた小さなゲームを持っているので、前の質問を見れば "空間侵略者"のクローンです。random "ValueError:list.remove(x):xはリストにありません" pygameのエラー

今のところ、ほぼすべてがスムーズに実行されているため、しばらくの間ランダムなエラーが発生します。これは完全にランダムであり、いくつかの弾丸が発射された後に発生する可能性があり、まったく発生しない可能性があります。

私はこのコードを持っている:

for bullet in bullets: 
     bullet.attack() 
     if bullet.posy<=-20: 
      bullet_draw=False 
     if bullet_draw==True: 
      bullet.draw() 
     for enemy in enemies: 
      if bullet.sprite.rect.colliderect(enemy.sprite.rect): 
       enemy.health-=1 
       bullets.remove(bullet) 
       bullet_draw=False 
      else: 
       bullet_draw=True 

は、時にはそれは私に、次のエラーが発生します。

Traceback (most recent call last): 
    File "\Programming\space invaders\space.py", line 280, in <module> 
    bullets.remove(bullet) 
ValueError: list.remove(x): x not in list 

このエラーは完全にランダムです。たとえそうでなくても私はその起源を辿ることはできません。どのようにそれを排除するための任意の助け?

+1

一般的に、エラーをキャッチして、死後デバッガ( 'import pdb; pdb.post_mortem()')を使用するのが良い方法です。開発中に私は通常、私のプログラムのエントリーポイントの周りにcatch-all tr​​y-except句を持っています。そうすれば、すぐに予期せぬ問題もデバッグすることができます。 –

答えて

3

あなたの弾は複数の敵に当たる。 enemiesループのうちbreakが必要です。

+0

リストからアイテムを削除すると、OPが反復処理されても問題が発生します。 – DSM

+0

@DSM:真実ですが、それは扱いやすいです。 '弾丸の中の弾丸[:]:' –

+0

完了!ところで、 ''弾丸の弾丸 'の下にインデントされた' 'bullet_draw = True'の直後に' continue'が入りますか? – mechanicarts

4

は以下にそれを変更してみてください:

for bullet in bullets[:]: # this is changed, iterating over a copy 
     bullet.attack() 
     if bullet.posy<=-20: 
      bullet_draw=False 
     if bullet_draw==True: 
      bullet.draw() 
     for enemy in enemies: 
      if bullet.sprite.rect.colliderect(enemy.sprite.rect): 
       enemy.health-=1 
       bullets.remove(bullet) 
       bullet_draw=False 
       break   # this is added, prevents multiple removes 
      else: 
       bullet_draw=True 

注変化を示し、私が追加した2件のコメントを弾シングルは、bullets.remove(bullet)が呼ばれるように原因となる複数の敵を、打つ可能性があるため、breakが必要です2回、あなたが見ているトレースバックを引き起こしています。

反復中にリストから要素を削除すると、反復中にいくつかの要素をスキップするため、予期しない結果が生じる可能性があるため、最初の変更が必要です。次のコードは、このことを示しています。それは、リストからすべての要素を削除する必要のようなコードに見えるにもかかわらず、リストのインデックスが反復中に変化しているので、

>>> data = range(10) 
>>> for x in data: 
...  data.remove(x) 
... 
>>> data 
[1, 3, 5, 7, 9] 

、それだけで他のすべてを削除します。

関連する問題