class Person:
    def __init__(self, name, hp, damage, armor):
        self.name = name
        self.hp = hp
        self.damage = damage
        self.armor = armor

    def run(self):
        print(f'{self.name} бежит')

    def attack(self, target):
        target_damage = self.damage - target.armor
        if target_damage > 0:
            target.hp -= target_damage
            print(f'{self.name} наносит {target_damage} урона {target.name}')
        else:
            print(f'{self.name} не пробивает броню {target.name}')

'''target объект класса Person, который использует в себе другие объекты класса Person'''

elf = Person('Эльф', 100, 20, 10)
ork = Person("Орк", 100, 30, 10)

elf.run()
'''В def run(self) в качестве self подставляется elf'''

ork.attack(elf)
'''в def attack(self, target) в качестве self подставляется ork (он инициатор метода), а в качестве target elf'''

'''Теперь понадобилось добавить новый персонаж, который старые навыки + новый летать (Dragon)
При его создании используем принцип НАСЛЕДОВАНИЯ'''

class Dragon(Person):
    def fly(self):
        print(f'Дракон {self.name} летит')

    def attack(self, target): # это метод добавлен позже. см комент с тремя ***
        print('Дракон атакует')

gorynych = Dragon("Горыныч", 200, 40, 30)

gorynych.attack(ork)

'''Вводим еще один персонаж Ведьму, которая колдует и летает, но не так как дракон'''

class Witch(Person):
    def witchcraft(self):
        print(f'Ведьма {self.name} колдует!')

    def fly(self):
        print(f'Ведьма {self.name} летит на метле')

baba_yaga = Witch('Баба Яга', 100, 20, 10)

baba_yaga.witchcraft()
gorynych.attack(gorynych)
baba_yaga.fly()

'''Игра развивается и решено ввести персонаж вельма + дракон (множественное наследование)'''

class DragonWitch(Dragon, Witch):
    def hwo_i_am(self):
        print('Что я такое')

chudo_yudo = DragonWitch("Чудо-Юдо", 200, 40, 30)

chudo_yudo.attack(ork)
chudo_yudo.witchcraft()
chudo_yudo.run()

chudo_yudo.fly()
''' ведьма и дракон умеют летать, но так как в списке наследования (class DragonWitch(Dragon, Witch)) дракон 
стоит на первом месте, то чудо юдо будет наследовать схожие фенкции в первую очередь от него
т.е. он ищет функции сначала у себя, потом у дракона, потом у ведьмы, потом у персон'''

'''*** ПОЛИФОРМИЗМ - Позволяем одному и томуже методу работать по разному в зависимости от объекта, который
его вызывает.
Сделаем атаку Дракона отличной от других, теперь атака Дракона и Чудо-Юда будет другой'''

ork.attack(elf)
chudo_yudo.attack(ork)

'''из общих методов можно сделать единый интерфейс, например у всех наших персонажей есть метод run
можно из них создать, список армия, перебрать его и заставить всех бежать, если потом мы у одного из персонажей
мы перепишем эту функцию, то ни чего не сломается, просто он будет бежать по-другому.'''

army = [elf, ork, baba_yaga, chudo_yudo, gorynych]

for unit in army:
    unit.run()