如何检查数组中是否存在特定对象和特定数量的所述对象?

时间:2019-04-29 19:30:53

标签: arrays class object pygame python-3.7

我正在做一个游戏。现在,游戏将需要生成特定数量的特定类型的敌人。为了优化起见,我决定将它们全部放入一个列表/数组中。虽然我完全知道如何检查特定对象是否在数组中,但是我不确定如何检查其中有多少。游戏以前曾按预期工作,但那是在我尝试将其放入一个列表之前。

我目前正在尝试使用“检查”模块来执行此操作。 香港专业教育学院已经尝试过使用循环。即

for enemy in entities:
   if isinstance(enemy,Enemy)#"Enemy" is a class
   #do something worthwhile

列表

Entities = []

控制生成的代码。

if len(entities) == 0:
        global enemypresent,enemyApresent,alienApresent
        enemypresent = 0
        enemyApresent = 0
        alienApresent = 0
        for enemy in entities:
            if isinstance(enemy,Enemy):
                enemypresent += 1
            if isinstance(enemy,EnemyAttack):
                enemyApresent += 1
            #if enemypresent < 5:
            #   entities.append(Enemy(random.randint(0,WIDTH-70),-50,70,70))
            if enemyApresent == 0:
                if random.randint(0,100) >= 75:
                    entities.append(AlienAttack(random.randint(0,WIDTH-70),-50,70,70))
                else:
                    entities.append(EnemyAttack(random.randint(0,WIDTH-70),-50,70,70))

我希望代码能够检查列表中有多少个特定对象。即“实体列表中有4个常规敌人” “实体列表中有5个攻击敌人”等

也欢迎其他选择。

1 个答案:

答案 0 :(得分:0)

在他的评论中,我会接受@furas的建议,以列出单独的列表,或者最好列出单独的pygame.sprite.Group

但是,如果要将它们保留在一个列表中,则可以通过这种方式计算不同的类型:

enemypresent = len([i for i in entities if type(i).__name__ == 'Enemy'])
enemyApresent = len([i for i in entities if type(i).__name__ == 'EnemyAttack'])

,依此类推,针对您拥有的每种“类型”敌人。请注意,我避免使用isinstance(i, Enemy)isinstance(i, EnemyAttack),因为引自文档:

  如果对象参数是classinfo参数或其(直接,间接或虚拟)子类的实例,则

isinstance()返回true。

因此,例如,如果EnemyAttackEnemy的子代,则第一行将两者都计算在内,这不是我想的。

另一句话:在我的解决方案中,您不需要循环,但是通常不编辑要迭代的列表。在解决方案中,应将if enemyApresent == 0:块保留在循环之外。