0

だから私はPythonで書かれた小さなゲームを持っています.私の前の質問を見たなら、あなたはそれが「スペースインベーダー」のクローンであることを知っています.

そのため、ランダムなエラーが時々発生することを除いて、ほとんどすべてが現在スムーズに実行されています。これは完全にランダムで、いくつかの弾丸が発射された後に発生する場合もあれば、まったく発生しない場合もあります。

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

    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

このエラーは完全にランダムであることに注意してください。そうでなくても、その起源をたどることはできません。それを排除する方法について何か助けはありますか?

4

2 に答える 2

5

次のように変更してみてください。

    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 つのコメントを追加したことに注意してください。これはbreak、1 つの弾丸が複数の敵に当たる可能性があり、bullets.remove(bullet)2 回呼び出される可能性があるため必要です。これにより、表示されているトレースバックが発生します。

最初の変更が必要なのは、反復中にリストから要素を削除すると、反復中にいくつかの要素をスキップすることになり、予期しない結果が生じる可能性があるためです。次のコードはこれを示しています。

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

コードはリストからすべての要素を削除する必要があるように見えますが、反復中にリストのインデックスが変化しているため、他の要素をすべて削除するだけです。

于 2012-04-11T19:08:47.817 に答える
4

あなたの弾丸は複数の敵に当たっています。ループからbreak抜け出す必要があります。enemies

于 2012-04-11T19:06:24.270 に答える