class Unit:
"""В этом классе определим нашего героя
заметим, что если он ничего не наследует то и скобки можно не ставить"""
def __init__(self, name, hp, position, **kwargs):
"""инициализируем наш класс основными параметрами, имя, здоровье, позиция"""
self.name = name
self.hp = hp
self.position = position
self.disabled = False
def show_unit(self):
"""Печатает все основные параметры юнита"""
print('The unit {0}, has {1} hp, and its coordinate is {2}'.format(str(self.name), str(self.hp), str(self.position)))
def move(self, distance):
"""Перемещает юнит, если он не disabled"""
if self.disabled:
print('Unit is disabled and can\'t move')
else:
self.position = self.position + distance
class Archer(Unit):
"""Этот класс наследует класс Unit, он описывает лучнка"""
def __init__(self, name, hp, position, **kwargs):
"""Инициализируем лучника, помимо основных параметров - позиция, здоровье и имя,
у него ещё есть параметр: урон"""
super().__init__(name, hp, position) # берём инициализатор из родительского класса
if kwargs['damage'] is not None:
self.damage = kwargs['damage'] # каждому лучнику можно установить свой урон
else:
self.damage = 15 # если урон не указали
def attack(self, obj):
"""метод атаки другого юнита, атакует, если не disabled"""
if self.disabled:
print('Unit is disabled and can\'t shoot')
else:
obj.hp = obj.hp - self.damage
class Magician(Unit):
"""Описываем волшебника, который также может атаковать"""
def __init__(self, name, hp, position, mp, **kwargs):
super().__init__(name, hp, position)
self.damage = 5
self.mp = mp
def disable(self, obj):
"""Описываем заклинание заморозки юнита"""
if self.mp < 30:
print('Недостаточно маны')
else:
obj.disabled = True
self.mp = self.mp - 40
class Hero(Archer, Magician):
def __init__(self, name, hp, position, mp, **kwargs):
super().__init__(name, hp, position, mp)
Y2xhc3MgVW5pdDoKICAgICIiItCSINGN0YLQvtC8INC60LvQsNGB0YHQtSDQvtC/0YDQtdC00LXQu9C40Lwg0L3QsNGI0LXQs9C+INCz0LXRgNC+0Y8KICAgINC30LDQvNC10YLQuNC8LCDRh9GC0L4g0LXRgdC70Lgg0L7QvSDQvdC40YfQtdCz0L4g0L3QtSDQvdCw0YHQu9C10LTRg9C10YIg0YLQviDQuCDRgdC60L7QsdC60Lgg0LzQvtC20L3QviDQvdC1INGB0YLQsNCy0LjRgtGMIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaHAsIHBvc2l0aW9uLCAqKmt3YXJncyk6CiAgICAgICAgIiIi0LjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDQvdCw0Ygg0LrQu9Cw0YHRgSDQvtGB0L3QvtCy0L3Ri9C80Lgg0L/QsNGA0LDQvNC10YLRgNCw0LzQuCwg0LjQvNGPLCDQt9C00L7RgNC+0LLRjNC1LCDQv9C+0LfQuNGG0LjRjyIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmhwID0gaHAKICAgICAgICBzZWxmLnBvc2l0aW9uID0gcG9zaXRpb24KICAgICAgICBzZWxmLmRpc2FibGVkID0gRmFsc2UKCiAgICBkZWYgc2hvd191bml0KHNlbGYpOgogICAgICAgICIiItCf0LXRh9Cw0YLQsNC10YIg0LLRgdC1INC+0YHQvdC+0LLQvdGL0LUg0L/QsNGA0LDQvNC10YLRgNGLINGO0L3QuNGC0LAiIiIKICAgICAgICBwcmludCgnVGhlIHVuaXQgezB9LCBoYXMgezF9IGhwLCBhbmQgaXRzIGNvb3JkaW5hdGUgaXMgezJ9Jy5mb3JtYXQoc3RyKHNlbGYubmFtZSksIHN0cihzZWxmLmhwKSwgc3RyKHNlbGYucG9zaXRpb24pKSkKCiAgICBkZWYgbW92ZShzZWxmLCBkaXN0YW5jZSk6CiAgICAgICAgIiIi0J/QtdGA0LXQvNC10YnQsNC10YIg0Y7QvdC40YIsINC10YHQu9C4INC+0L0g0L3QtSBkaXNhYmxlZCIiIgogICAgICAgIGlmIHNlbGYuZGlzYWJsZWQ6CiAgICAgICAgICAgIHByaW50KCdVbml0IGlzIGRpc2FibGVkIGFuZCBjYW5cJ3QgbW92ZScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IHNlbGYucG9zaXRpb24gKyBkaXN0YW5jZQogICAgICAgICAgICAKICAgICAgICAgICAgCmNsYXNzIEFyY2hlcihVbml0KToKICAgICIiItCt0YLQvtGCINC60LvQsNGB0YEg0L3QsNGB0LvQtdC00YPQtdGCINC60LvQsNGB0YEgVW5pdCwg0L7QvSDQvtC/0LjRgdGL0LLQsNC10YIg0LvRg9GH0L3QutCwIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaHAsIHBvc2l0aW9uLCAqKmt3YXJncyk6CiAgICAgICAgIiIi0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDQu9GD0YfQvdC40LrQsCwg0L/QvtC80LjQvNC+INC+0YHQvdC+0LLQvdGL0YUg0L/QsNGA0LDQvNC10YLRgNC+0LIgLSDQv9C+0LfQuNGG0LjRjywg0LfQtNC+0YDQvtCy0YzQtSDQuCDQuNC80Y8sCiAgICAgICAg0YMg0L3QtdCz0L4g0LXRidGRINC10YHRgtGMINC/0LDRgNCw0LzQtdGC0YA6INGD0YDQvtC9IiIiCiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lLCBocCwgcG9zaXRpb24pICAjINCx0LXRgNGR0Lwg0LjQvdC40YbQuNCw0LvQuNC30LDRgtC+0YAg0LjQtyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LPQviDQutC70LDRgdGB0LAKICAgICAgICBpZiBrd2FyZ3NbJ2RhbWFnZSddIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmRhbWFnZSA9IGt3YXJnc1snZGFtYWdlJ10gICMg0LrQsNC20LTQvtC80YMg0LvRg9GH0L3QuNC60YMg0LzQvtC20L3QviDRg9GB0YLQsNC90L7QstC40YLRjCDRgdCy0L7QuSDRg9GA0L7QvQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZGFtYWdlID0gMTUgICMg0LXRgdC70Lgg0YPRgNC+0L0g0L3QtSDRg9C60LDQt9Cw0LvQuAoKICAgIGRlZiBhdHRhY2soc2VsZiwgb2JqKToKICAgICAgICAiIiLQvNC10YLQvtC0INCw0YLQsNC60Lgg0LTRgNGD0LPQvtCz0L4g0Y7QvdC40YLQsCwg0LDRgtCw0LrRg9C10YIsINC10YHQu9C4INC90LUgZGlzYWJsZWQiIiIKICAgICAgICBpZiBzZWxmLmRpc2FibGVkOgogICAgICAgICAgICBwcmludCgnVW5pdCBpcyBkaXNhYmxlZCBhbmQgY2FuXCd0IHNob290JykKICAgICAgICBlbHNlOgogICAgICAgICAgICBvYmouaHAgPSBvYmouaHAgLSBzZWxmLmRhbWFnZQoKCmNsYXNzIE1hZ2ljaWFuKFVuaXQpOgogICAgIiIi0J7Qv9C40YHRi9Cy0LDQtdC8INCy0L7Qu9GI0LXQsdC90LjQutCwLCDQutC+0YLQvtGA0YvQuSDRgtCw0LrQttC1INC80L7QttC10YIg0LDRgtCw0LrQvtCy0LDRgtGMIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaHAsIHBvc2l0aW9uLCBtcCwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZSwgaHAsIHBvc2l0aW9uKQogICAgICAgIHNlbGYuZGFtYWdlID0gNQogICAgICAgIHNlbGYubXAgPSBtcAoKICAgIGRlZiBkaXNhYmxlKHNlbGYsIG9iaik6CiAgICAgICAgIiIi0J7Qv9C40YHRi9Cy0LDQtdC8INC30LDQutC70LjQvdCw0L3QuNC1INC30LDQvNC+0YDQvtC30LrQuCDRjtC90LjRgtCwIiIiCiAgICAgICAgaWYgc2VsZi5tcCA8IDMwOgogICAgICAgICAgICBwcmludCgn0J3QtdC00L7RgdGC0LDRgtC+0YfQvdC+INC80LDQvdGLJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBvYmouZGlzYWJsZWQgPSBUcnVlCiAgICAgICAgICAgIHNlbGYubXAgPSBzZWxmLm1wIC0gNDAKCgpjbGFzcyBIZXJvKEFyY2hlciwgTWFnaWNpYW4pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGhwLCBwb3NpdGlvbiwgbXAsICoqa3dhcmdzKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIGhwLCBwb3NpdGlvbiwgbXAp