【问题标题】:How to check if there is a specific object and a specific number of said object in an array?如何检查数组中是否存在特定对象和特定数量的所述对象?
【发布时间】:2019-04-29 19:30:52
【问题描述】:

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

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

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

也欢迎任何替代品。

【问题讨论】:

  • 您可以创建许多列表 - entitiesenemy_entitiesenemyattack_entities,然后您可以创建 len(enemy_entities) - 但您必须自己从所有列表中插入和删除项目。或者您可以使用pygame.sprite.Group,您可以将相同的对象保留在不同的组中,即。 all_groupenemy_groupenemyattack_group,然后你可以做len(enemy_group)。您必须手动将项目添加到组中,但如果您杀死项目,那么它将自动从所有组中删除。

标签: arrays class object pygame python-3.7


【解决方案1】:

我会按照@furas 在他的评论中的建议制作单独的列表,或者更好地单独列出pygame.sprite.Groups。

但如果你想把它们放在一个列表中,你可以这样计算不同的类型:

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),因为引用自文档:

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

因此,例如,如果 EnemyAttackEnemy 的子级,则第一行将同时计算,我猜这不是你想要的。

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

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2018-01-03
    • 2013-09-13
    • 2012-11-12
    • 1970-01-01
    • 2019-01-12
    • 2014-07-31
    • 2019-05-24
    相关资源
    最近更新 更多