Как проверить, есть ли конкретный объект и конкретное количество указанного объекта в массиве? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть игра, которую я делаю.Прямо сейчас в игре потребуется порождение определенного количества противника определенного типа.Для оптимизации я решил поместить все это в один список / массив.Хотя я полностью осведомлен о том, как проверить, находится ли указанный конкретный объект в массиве, я не уверен, как проверить, сколько его существует.Игра работала так, как задумывалось ранее, но это было до того, как я попытался поместить ее в один список.

В настоящее время я пытаюсь сделать это с помощью модуля «Проверка».Я уже пытался использовать для петель.т.е.

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 голосов
/ 30 апреля 2019

Я бы пошел с советом @furas в его комментарии, чтобы составить отдельные списки, или лучше разделить pygame.sprite.Group s.

Но если вы хотите сохранить их в одном списке, вы можете посчитать разные типы следующим образом:

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() возвращает значение true, если аргумент объекта является экземпляром аргумента classinfo или его (прямого, косвенного или виртуального) подкласса.

Так что, если, например, EnemyAttack был дочерним по отношению к Enemy, первая строка будет учитывать оба, и я думаю, это не то, что вы хотите.

Еще одно замечание: в моем решении вам не нужен цикл, но в общем случае не редактируйте список, для которого вы выполняете итерацию. В вашем решении вы должны держать блок if enemyApresent == 0: вне цикла.

...