Солнце садится, и из темноты выходят трое. Зомби бьёт в лоб — броня его держит. Скелет стреляет в щели, половину брони можно не считать. Крипер не бьёт вообще: он взрывается, и броня против взрыва не работает.
Mob(name, hp, power): метод damage(armor) возвращает power - armor, метод attack(armor) — общий каркас max(0, damage(armor)). attack пишется один раз в базовом классе и больше нигде;__str__ → "Creeper Крипер (20 hp)" — вид моба берётся через type();Zombie(Mob) — не меняет ничего;Skeleton(Mob) — damage считает power - armor // 2;Creeper(Mob) — damage возвращает power + 10, броню игнорирует;- функция
night_damage(mobs, armor) — суммарный урон всей волны.
Структура программы
Отправляется целая программа. Ниже — то, что в ней должно быть объявлено: имена классов, их родители и сигнатуры методов. Имена менять нельзя, проверки обращаются именно к ним.
class Mob:
def __init__(self, name, hp, power):
...
def damage(self, armor):
...
def attack(self, armor):
...
def __str__(self):
...
class Zombie(Mob):
...
class Skeleton(Mob):
def damage(self, armor):
...
class Creeper(Mob):
def damage(self, armor):
...
def night_damage(mobs, armor):
...
Как проверяется
Проверяющая программа дописывает к твоему коду блок проверок и выполняет всё вместе. Задача засчитывается, если ни одна проверка не сработала и программа ничего не напечатала — отладочную печать перед отправкой убери.
Примеры проверок
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
# проверка
assert [m.attack(10) for m in horde] == [10, 15, 60]
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
[m.attack(10) for m in horde] == [10, 15, 60]
# проверка
assert night_damage(horde, 10) == 85
Строки #!requires — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.
Вопрос: в теле Zombie не написано ни строчки, а зомби бьёт. Откуда он берёт damage и attack?
---
| № | Входные данные | Выходные данные |
|
1
|
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
# проверка
assert [m.attack(10) for m in horde] == [10, 15, 60]
|
|
|
2
|
#!requires Mob: attack, __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
[m.attack(10) for m in horde] == [10, 15, 60]
# проверка
assert night_damage(horde, 10) == 85
|
|