Олимпиадный тренинг

Задача . Свой мир. 12. Первая ночь


Задача

Темы:

Всё готово: блоки, инструменты, мобы, сундук. Осталось пережить первую ночь. Стив надел железо и стоит у двери. Считать надо до рассвета, а не после — иначе считать будет некому.

Нужны 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 — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.

Расширения (на оценку выше):

  1. PeacefulNight(Night) — мирный режим: урон всех мобов равен нулю. Переопределить только damage_list.
  2. Сундук из главы 8 в руках у игрока: если внутри есть «Золотое яблоко», после ночи оно тратится и лечит на 20.
  3. Night.__str__ с правильным окончанием: «1 моб», «3 моба», «5 мобов».
  4. Второй игрок рядом: волна бьёт по очереди обоих, отчёт — кто дожил до рассвета.

---


Примеры
№Входные данныеВыходные данные
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

                         
Статистика успешных решений по компиляторам
Комментарий учителя