python-pygame中的“for”循环不会在“if”语句下中断

时间:2012-04-11 14:43:34

标签: python for-loop 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. 检查名为“enemies”的列表中的每个项目(我附加了所有敌人实例)
  2. 如果它与英雄精灵发生碰撞或者它们已经到达屏幕的底部
  3. 然后从玩家中移除一个生命,初始化游戏(重制敌人列表,重置位置)
  4. 并打破“for”循环。
  5. 否则,像往常一样移动敌人并将它们打死。
  6. 然而,这样做实际上是从触摸播放器中移除所有生命。因为我用过休息时不应该停止计算吗?我认为它一直在计算敌人是否已达到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()
    

3 个答案:

答案 0 :(得分:1)

看起来你没有清空enemies,所以在initgame()之后,旧的加上新的加上enemies=[]。问题是行def initgame(): global enemies enemies=[] 正在创建和设置局部变量。为了做你想做的事,试试:

{{1}}

答案 1 :(得分:1)

尝试放

global enemies

在initgame()

中敌人= []之前的行

否则您不会清除全局敌人变量。一般来说,最好将所有内容放在一个类中,并使用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循环中的“enemy”)区分开来。

通过使对象成为调用运行来使用此类。

game = SpaceInvaders()
game.run()

答案 2 :(得分:0)

您的休息声明应该按预期工作。 健康必须有另一个原因一直在下降(除了循环太多)。可能在initgame()中找到了这个原因。