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. 检查名为“enemies”的列表中的每个项目(我在其中附加了所有敌人实例)
  2. 如果它与英雄精灵碰撞或者他们已经到达屏幕底部
  3. 然后从玩家身上移除一条生命,初始化游戏(重新制作敌人列表,重置位置)
  4. 并打破“for”循环。
  5. 否则,像往常一样移动敌人并攻击他们。

然而,这实际上是从接触到的玩家身上移除所有生命。自从我使用休息后,它不应该停止计算吗?我认为它会一直计算敌人中是否有任何达到 400 像素,从而不断从我的玩家身上移除生命。

这是我的初始化游戏功能

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

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

def initgame():
    global enemies
    enemies=[]
于 2012-04-11T15:22:34.490 回答
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 循环中的“敌人”)区分开来。

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

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

您的 break 语句应该按预期工作。健康状况一直下降肯定还有另一个原因(除了循环太多)。大概这个原因可以在initgame()中找到。

于 2012-04-11T14:54:05.853 回答