Не могу выбрать объект в списке и удалить его - PullRequest
1 голос
/ 27 января 2020

Я потратил час или два вместе, пытаясь разобраться в этой проблеме, но я не получил никаких результатов. В моей программе, когда защищающееся животное «убито», оно должно быть удалено из его реестра, но, что бы я ни делал, я не могу этого добиться. В этом случае, если бы я должен был инициировать охотника и буйвола, то атаковать () буйвола с охотником, буйвол должен быть убит и удален из реестра его классов, но я не могу python выбрать этот конкретный c буйвол из реестра.

Любая помощь приветствуется.

class IterRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)

class Buffalo(object):
    __metaclass__ = IterRegistry
    _registry = []
    hp = 1
    price = 150
    attacks = 0
    regeneration = 2

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createBuffalo():
    for i in range(len(Buffalo._registry),len(Buffalo._registry)+1):
        varname = ("b" + str(i))
        globals()[varname] = Buffalo("b" + str(i))

class Wolf:
    __metaclass__ = IterRegistry
    _registry = []
    hp = 1
    price = 0
    attacks = 2
    regeneration = 1.5

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createWolf():
    for i in range(len(Wolf._registry),len(Wolf._registry)+1):
        varname = ("w" + str(i))
        globals()[varname] = Wolf("w" + str(i))

class Hunter:
    __metaclass__ = IterRegistry
    _registry = []
    hp = 2
    price = 0
    attacks = 1
    regeneration = 0
    balance = 0

    def __init__(self, name):
        self._registry.append(self)
        self.name = name

def createHunter():
    for i in range(len(Hunter._registry),len(Hunter._registry)+1):
        varname = ("h" + str(i))
        globals()[varname] = Hunter("h" + str(i))

def attack(attacker, target):
    if attacker.attacks >= 1:
        target.hp -= 1
        if target.hp == 0:
            if type(attacker) == Hunter:
                attacker.balance += 150
            print(target)
            if type(target) == Wolf:
                del Wolf._registry[[n for n in Wolf._registry if n == target]]
            if type(target) == Hunter:
                del Hunter._registry[[n for n in Hunter._registry if n == target]]
            if type(target) == Buffalo:
                del Buffalo._registry[[n for n in Hunter._registry if n == target]]

Еще одно замечание, причина в том, что у меня двойные скобки, потому что это был неправильный синтаксис с одинарными скобками, но синтаксис был хорош с двойными .

Если вам нужно больше кода, задайте его в комментариях ниже (я не включил все это, но этого должно быть достаточно).

1 Ответ

0 голосов
/ 27 января 2020

Проблема, которую вы пытаетесь решить, вызвана попыткой использовать список в качестве индекса, который будет удален из вашего списка

[n for n in Wolf._registry if n == target]

Все, что вы пытаетесь выбрать из этого списка, это цель, так что просто используйте это.

Wolf._registry.remove(target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...