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

Задача . Свой мир. 04. Полоса здоровья


Задача

Темы:

Пора решить, что происходит при падении с высоты. Правило должно быть одно на весь мир: здоровье не уходит в минус, не поднимается выше максимума, а мёртвого не лечит даже золотое яблоко.

Класс Entity(name, max_hp) — общий предок для игрока и мобов:

  • поля name, max_hp, hp; в начале здоровье полное;
  • is_alive() — жив, пока hp > 0;
  • take_damage(amount) — уменьшает здоровье, но не ниже нуля;
  • heal(amount) — поднимает здоровье, но не выше max_hp; возвращает True. Мёртвого лечить нельзя: тогда ничего не меняется и возвращается False;
  • __str__ → "Стив: 100/100".

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

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

class Entity:
    def __init__(self, name, max_hp):
        ...

    def is_alive(self):
        ...

    def take_damage(self, amount):
        ...

    def heal(self, amount):
        ...

    def __str__(self):
        ...

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

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

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

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

# подготовка
steve = Entity("Стив", 100)
steve.take_damage(30)

# проверка
assert steve.hp == 70
#!requires Entity: is_alive, take_damage, heal, __str__

# подготовка
steve = Entity("Стив", 100)
steve.take_damage(30)

# проверка
assert steve.heal(50) is True

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

Вопрос: что случится, если написать steve.hp = -50 напрямую? Почему методы всё равно полезны, хотя поле открыто?

---


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

# подготовка
steve = Entity("Стив", 100)
steve.take_damage(30)

# проверка
assert steve.hp == 70

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

# подготовка
steve = Entity("Стив", 100)
steve.take_damage(30)

# проверка
assert steve.heal(50) is True

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