0

私はpygameで「スペースインベーダー」ゲームを作ろうとしています...私はすでにゲームの多くを実行していますが、自分で解決できない厄介な問題に遭遇しました(これは私が取った最初のプログラミングコースです)。問題のコードは次のとおりです。

for enemy in enemies:
   if hero.sprite.rect.colliderect(enemy.sprite.rect) or enemy.posy>400:
      hero.health-=1
      initgame()
      break
   else:
      enemy.moveBy(enemyPos, ENEMYVERT)
      enemy.draw()

したがって、これが行うべきことは次のとおりです。

  1. 「敵」という名前のリスト内のすべてのアイテムを確認します(すべての敵インスタンスを追加しました)
  2. ヒーロースプライトと衝突した場合、または画面の下部に到達した場合
  3. 次に、プレイヤーからライフを1つ削除し、ゲームを初期化します(敵リストを作り直し、位置をリセットします)
  4. 「for」ループを壊します。
  5. それ以外の場合は、通常どおり敵を動かしてブリットします。

ただし、これが実際に行うことは、タッチしたプレイヤーからすべてのライフを削除することです。ブレークしたから計算やめた方がいいんじゃないの?敵のいずれかが 400px に達したかどうかを計算し続けているため、プレイヤーからライフを削除し続けていると思います。

これは私のinitgame関数です

def initgame():
    enemies=[]
    createEnemies("1.png", 50, 250)
    createEnemies("2.png", 50, 190)
    createEnemies("3.png", 50, 130)
    createEnemies("4.png", 50, 70)
    createEnemies("5.png", 50, 10)
    enemyPos=0
    enemyDir=-1
    hero.score=0
    restartFlag=False
    for enemy in enemies:
        enemy.draw()
4

3 に答える 3

1

入れてみて

global enemies

initgame()のenes=[]の前の行

それ以外の場合は、グローバル敵変数をクリアしていません。一般に、グローバル変数に依存するよりも、すべてをクラスに入れ、self.enemies を使用して関数間でデータを共有する方が適切です。

次のように、関数をクラスに配置します。

class SpaceInvaders:
  def __init__(self):
    self.initgame()

  def initgame(self):
    self.enemies = []
    ...#createEnemies
    self.enemyPos = 0
    self.enemyDir = -1
    #etc

  def run(self):
    #your while loop here

関数間で共有する必要があるすべての変数は、self. と呼ばれるようになりました。これにより、関数内でのみ使用されるローカル変数 (for ループの「敵」など) と区別されます。

このクラスを使用するには、オブジェクトを呼び出し実行にします。

game = SpaceInvaders()
game.run()
于 2012-04-11T15:23:15.787 に答える
0

break ステートメントは期待どおりに機能するはずです。ヘルスが完全に低下する別の理由があるはずです (ループが多すぎること以外)。おそらく、この理由は initgame() で見つけることができます。

于 2012-04-11T14:54:05.853 に答える