Обновить список объектов класса - PullRequest
2 голосов
/ 20 октября 2019

У меня есть список объектов на уровне класса и метод класса fight, который работает с объектами из этого списка:

from Heroes import Hero
from Creatures import Creature
from random import randint

class Battle():
    """template to simulate the battle"""


    obj_list = []

    def __init__(self,obj1_name,obj2_name):

        #create  hero
        self.obj1 = Hero(obj1_name, health = randint(70,100), strength = randint(70,80), defence = randint(45,55), speed = randint(40,50), luck = randint(10,30))
        Battle.obj_list.append(self.obj1)



        #create  creature
        self.obj2 = Creature(obj2_name, health = randint(70,100), strength = randint(70,80), defence = randint(45,55), speed = randint(40,50), luck = randint(10,30))
        Battle.obj_list.append(self.obj2)

    @classmethod
    def fight(cls):
        """simulate fight"""

        # first attack is landed by the obj with highest speed
        if cls.obj_list[0].speed > cls.obj_list[1].speed:

           cls.obj_list[1].health =  cls.obj_list[0].attack() - cls.obj_list[1].defence

        # same speed first attack landed by the obj with highest luck
        elif cls.obj_list[0].speed == cls.obj_list[1].speed:

            if cls.obj_list[0].luck >= cls.obj_list[1].luck:
                cls.obj_list[1].health =  cls.obj_list[0].attack() - cls.obj_list[1].defence
            else:
                cls.obj_list[0].health =  cls.obj_list[1].attack() - cls.obj_list[0].defence

        #self.obj1.speed < self.obj2.speed
        else:
                cls.obj_list[0].health =  cls.obj_list[1].attack() - cls.obj_list[0].defence

        return cls.obj_list

if __name__ == "__main__":

    first_round =  Battle("Icarus","Beast")


    for i in Battle.obj_list:
            print(i.name,i.health)

    Battle.fight()


    for i in Battle.obj_list:
            print(i.name,i.health)

    Battle.fight()

    for i in Battle.obj_list:
            print(i.name,i.health)

Вывод:

Icarus 90
Beast 74
Icarus 30
Beast 74
Icarus 30
Beast 74

Первый вызов метода fight корректно обновляет атрибут health объектов из obj_list, но затем, независимо от того, сколько раз я вызываю метод, атрибут health больше не обновляется. Чего мне не хватает, должен ли я использовать другой подход для совместного использования состояния объектов?

1 Ответ

0 голосов
/ 20 октября 2019

Использование атрибута класса в качестве хранилища для героя и существа является ненужным и делает код нечитаемым.

При вашем подходе после трех боев Battle.obj_list будет выглядеть так:

[Герой(первый бой), Существо (первый бой), Герой (второй бой), Существо (второй бой), Герой (третий бой), Существо (третий бой)].

В вашем коде вы всегда получаете доступ [0] и [1].

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

class Battle():
    """template to simulate the battle"""
    def __init__(self, hero, creature):

        #create  hero
        self.hero = hero

        #create  creature
        self.creature = creature

    def fight(self):
        """simulate fight"""

        # first attack is landed by the obj with highest speed
        if self.hero.speed > self.creature.speed:
           self.creature.health =  self.hero.attack() - self.creature.defence

        # same speed first attack landed by the obj with highest luck
        elif self.hero.speed == self.creature.speed:
            if self.hero.luck >= self.creature.luck:
                self.creature.health =  self.hero.attack() - self.creature.defence
            else:
                self.hero.health =  self.creature.attack() - self.hero.defence

        #self.obj1.speed < self.obj2.speed
        else:
            self.hero.health =  self.creature.attack() - self.hero.defence
        return [self.hero, self.creature]


if __name__ == "__main__":
    hero = Hero(
        obj1_name, health = randint(70,100),
        strength = randint(70,80),
        defence = randint(45,55),
        speed = randint(40,50),
        luck = randint(10,30)
        )

    creature = Creature(
        obj2_name,
        health = randint(70,100),
        strength = randint(70,80),
        defence = randint(45,55),
        speed = randint(40,50),
        luck = randint(10,30)
        )

    first_round =  Battle(hero, creature)

Было бы хорошо, если быВы разместите класс существ и героев

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