arrays - 如何检查数组中是否存在特定对象和特定数量的所述对象?
问题描述
我有一个我正在制作的游戏。现在游戏需要生成特定数量的特定类型的敌人。为了优化,我决定将它们全部放入一个列表/数组中。虽然我完全知道如何检查所述特定对象是否在数组中,但我不确定如何检查其中有多少。游戏按预期运行,但那是在我尝试将其放入一个列表之前。
我目前正在尝试使用“检查”模块来执行此操作。我已经尝试过使用 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 个攻击敌人”等。
也欢迎任何替代方案。
解决方案
我会在他的评论中接受@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:
块保留在循环之外。
推荐阅读
- android - “此图像不支持编辑”
- python - Spark - 如何计算特定列下存储在数组中的所有单个产品的数量?
- python - PyCharm 日志记录颜色始终为红色
- javascript - Tampermonkey 脚本检测 HTML 上的更改并自动转到链接
- .net - 如果 OutputType 不是“Exe”,则不会复制 .NET 中引用的包
- elasticsearch - 匹配对象数组中多个字段匹配的文档
- .net-core - 响应缓存在 MVC 核心项目中不起作用
- java - 字符串 str1=new String("abc"); 字符串 str2="abc" 返回相同的哈希码
- google-api - Google Sheets API - 从 google 登录迁移
- python - 在 __init__ 函数中读取类中的文件不起作用