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

Задача . Свой мир. 05. Крипер


Задача

Темы:

Крипер — единственный моб, который тратит себя целиком. Он подходит, шипит и наносит урон всему вокруг, а сам после этого перестаёт существовать. Никаких особых правил для его здоровья не нужно: он живёт по тем же законам, что и всё в мире.

Взять Entity из главы 4 и написать Creeper(Entity):

  • explode(target, power) — наносит цели урон, после чего крипер теряет всё своё здоровье;
  • работает только через методы take_damage и heal, к полю hp напрямую не обращается;
  • __str__ → "Крипер: 60/100 (взрывоопасен)".

Важно. В решение нужно включить и код задач 4 этого набора: проверки обращаются к нему напрямую.

Структура программы

Отправляется целая программа. Ниже — то, что в ней должно быть объявлено: имена классов, их родители и сигнатуры методов. Имена менять нельзя, проверки обращаются именно к ним.

class Creeper(Entity):
    def explode(self, target, power):
        ...

    def __str__(self):
        ...

Как проверяется

Проверяющая программа дописывает к твоему коду блок проверок и выполняет всё вместе. Задача засчитывается, если ни одна проверка не сработала и программа ничего не напечатала — отладочную печать перед отправкой убери.

Примеры проверок

#!requires Entity: is_alive, take_damage, heal, __str__
#!requires Creeper: explode, __str__

# подготовка
boom = Creeper("Крипер", 100)
player = Entity("Стив", 100)
boom.take_damage(40)

# проверка
assert boom.hp == 60
#!requires Entity: is_alive, take_damage, heal, __str__
#!requires Creeper: explode, __str__

# подготовка
boom = Creeper("Крипер", 100)
player = Entity("Стив", 100)
boom.take_damage(40)

# проверка
assert str(boom) == "Крипер: 60/100 (взрывоопасен)"

Строки #!requires — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.

Вопрос: в Creeper нет ни слова про максимум здоровья и про ноль. Почему после взрыва получается ровно 0, а лечение игрока упирается в 100?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Entity: is_alive, take_damage, heal, __str__
#!requires Creeper: explode, __str__

# подготовка
boom = Creeper("Крипер", 100)
player = Entity("Стив", 100)
boom.take_damage(40)

# проверка
assert boom.hp == 60

                         
2
#!requires Entity: is_alive, take_damage, heal, __str__
#!requires Creeper: explode, __str__

# подготовка
boom = Creeper("Крипер", 100)
player = Entity("Стив", 100)
boom.take_damage(40)

# проверка
assert str(boom) == "Крипер: 60/100 (взрывоопасен)"

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