首页 > 解决方案 > 如何检查数组中是否存在特定对象和特定数量的所述对象?

问题描述

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

我目前正在尝试使用“检查”模块来执行此操作。我已经尝试过使用 for 循环。IE

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 个攻击敌人”等。

也欢迎任何替代方案。

标签: arraysclassobjectpygamepython-3.7

解决方案


我会在他的评论中接受@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)andisinstance(i, EnemyAttack)因为,从文档中引用:

isinstance()如果 object 参数是 classinfo 参数或其(直接、间接或虚拟)子类的实例,则返回 true。

因此,例如,如果EnemyAttack是 的子项Enemy,则第一行将两者都计算在内,而我猜这不是您想要的。

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


推荐阅读