Пора решить, что происходит при падении с высоты. Правило должно быть одно на весь мир: здоровье не уходит в минус, не поднимается выше максимума, а мёртвого не лечит даже золотое яблоко.
Класс 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
|
|