Всё готово: блоки, инструменты, мобы, сундук. Осталось пережить первую ночь. Стив надел железо и стоит у двери. Считать надо до рассвета, а не после — иначе считать будет некому.
Нужны Entity из главы 4 и мобы из главы 11.
ArmoredPlayer(Entity) — добавляет поле armor, конструктор идёт через super(), __str__ → "Стив: 15/100, броня 10";Night(title, mobs): __len__, __str__ → "Первая ночь: 3 моба", damage_list(armor) — список урона по каждому мобу, total(armor) — сумма, run(player) — наносит удары по очереди и возвращает, выжил ли игрок;HardNight(Night) — хардкорный режим: та же ночь, но урон каждого моба удваивается. Переопределяется только damage_list, через super(); остальное достаётся по наследству.
Важно. В решение нужно включить и код задач 4, 11 этого набора: проверки обращаются к нему напрямую.
Структура программы
Отправляется целая программа. Ниже — то, что в ней должно быть объявлено: имена классов, их родители и сигнатуры методов. Имена менять нельзя, проверки обращаются именно к ним.
class ArmoredPlayer(Entity):
def __init__(self, name, max_hp, armor):
...
def __str__(self):
...
class Night:
def __init__(self, title, mobs):
...
def __len__(self):
...
def __str__(self):
...
def damage_list(self, armor):
...
def total(self, armor):
...
def run(self, player):
...
class HardNight(Night):
def damage_list(self, armor):
...
Как проверяется
Проверяющая программа дописывает к твоему коду блок проверок и выполняет всё вместе. Задача засчитывается, если ни одна проверка не сработала и программа ничего не напечатала — отладочную печать перед отправкой убери.
Примеры проверок
#!requires Entity: __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
#!requires ArmoredPlayer: __str__
#!requires Night: __len__, __str__, damage_list, total, run
#!requires HardNight: damage_list
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
night = Night("Первая ночь", horde)
# проверка
assert len(night) == 3
assert str(night) == "Первая ночь: 3 моба"
#!requires Entity: __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
#!requires ArmoredPlayer: __str__
#!requires Night: __len__, __str__, damage_list, total, run
#!requires HardNight: damage_list
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
night = Night("Первая ночь", horde)
# проверка
assert night.damage_list(10) == [10, 15, 60]
assert night.total(10) == 85
Строки #!requires — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.
Расширения (на оценку выше):
PeacefulNight(Night) — мирный режим: урон всех мобов равен нулю. Переопределить только damage_list.- Сундук из главы 8 в руках у игрока: если внутри есть «Золотое яблоко», после ночи оно тратится и лечит на 20.
Night.__str__ с правильным окончанием: «1 моб», «3 моба», «5 мобов».- Второй игрок рядом: волна бьёт по очереди обоих, отчёт — кто дожил до рассвета.
---
| № | Входные данные | Выходные данные |
|
1
|
#!requires Entity: __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
#!requires ArmoredPlayer: __str__
#!requires Night: __len__, __str__, damage_list, total, run
#!requires HardNight: damage_list
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
night = Night("Первая ночь", horde)
# проверка
assert len(night) == 3
assert str(night) == "Первая ночь: 3 моба"
|
|
|
2
|
#!requires Entity: __str__
#!requires Zombie
#!requires Skeleton
#!requires Creeper
#!requires ArmoredPlayer: __str__
#!requires Night: __len__, __str__, damage_list, total, run
#!requires HardNight: damage_list
# подготовка
horde = [Zombie("Зомби", 20, 20), Skeleton("Скелет", 20, 20), Creeper("Крипер", 20, 50)]
night = Night("Первая ночь", horde)
# проверка
assert night.damage_list(10) == [10, 15, 60]
assert night.total(10) == 85
|
|