2012-04-11 98 views
0

我想在pygame中制作一个“太空入侵者”游戏......我已经有很多游戏已经运行,但是我遇到了烦人的问题我无法解决自己(这是我采取的第一个编程课程)。这是有问题的代码:“for”循环在python-pygame中不会在“if”语句下中断

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. 的底部,然后从播放器中取出一个生命,初始化游戏(重拍敌人名单,复位位置)
  4. 和Br挤压“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() 
+0

你确定你在'initgame()'中正确地重置敌人位置吗?我怀疑你的错误在那里。 – devsnd 2012-04-11 14:54:38

+0

请检查我的initgame的原始问题。 – mechanicarts 2012-04-11 14:57:19

回答

1

它看起来像你没有排空enemies,所以旧的加上新的initgame()之后。问题是行enemies=[]正在创建和设置一个局部变量。为了做到你想要什么,尝试:

def initgame(): 
    global enemies 
    enemies=[] 
+1

这听起来不错,我会用它,但上次我用“全球化”时,教授告诉我这是一个不适合编程的问题......并将任务等级降低了3!也许我可以在initgame的输入中加入“敌人”,然后做一个“回归敌人”? – mechanicarts 2012-04-11 15:24:02

+0

好吧,由于这些函数并不以'enemies'作为参数,因此您已经在使用全局变量。只是在大多数情况下你不必声明'global'。如果不允许使用全局变量,则必须确保将“enemies”传递给每个需要了解它的函数(如果正在更改,则返回它)。 – 2012-04-11 15:42:03

+0

我用全球,我想我可以忍受几点错过。我现在很厌倦它。 – mechanicarts 2012-04-11 16:02:17

0

你的break语句应该工作。 除了循环太多以外,还必须有另一个健康降低的原因。可能这个原因可以在initgame()中找到。

+0

请检查我的initgame的原始问题。 – mechanicarts 2012-04-11 15:00:42

+0

运行循环之前什么是hero.health?在循环之后究竟是hero.health(大概为0)。 – 2012-04-11 15:11:15

+0

hero.health起始为3(“Hero”类变量),并且循环应该使其成为2.我在“if ... collide”语句中添加了打印语句,输出为3 2 1. – mechanicarts 2012-04-11 15:15:16

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 

应该功能之间共享的所有变量将现在被称为自我。这从局部变量区分(如“敌人”在for循环中)只在函数内部使用。

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

game = SpaceInvaders() 
game.run() 
+0

它确实与“全球”一起工作,但我恐怕这会再一次让我失去点......再加上我听说如果使用“全球”,它不是很好的编程。你能详细说明类方法吗?我已经有了一个针对敌人的课程。 – mechanicarts 2012-04-11 15:28:35

+0

你的敌人名单已经是全球性的。你对“全球敌人”所做的一切就是承认这一点:)。我会做一个快速的编辑来解释如何避免这种情况。 – Gurgeh 2012-04-12 09:22:06