Загрузка данных
# ===== ТАМАГОЧИ: итоговая сборка =====
from typing import List, Tuple, Callable
# Вставляй присланные методы на место строк raise NotImplementedError(...)
# ===== Ошибки — Епифанцев =====
class PetError(Exception):
pass
class PetNotHungryError(PetError):
pass
class PetIsSleepingError(PetError):
pass
class PetTooTiredError(PetError):
pass
# ===== Питомец =====
class Pet:
MIN_VALUE = 0
MAX_VALUE = 10
# --- Демченков: состояние ---
def __init__(self, name):
# name: str, hunger/mood/energy: int 0..10
# hunger: 0 = сыт, 10 = очень голоден
# hour: int 0..23, старт 8; is_sleeping: bool
raise NotImplementedError("__init__() ещё подключается")
def _clamp(self, value):
# вернуть value, зажатое в 0..10
raise NotImplementedError("_clamp() ещё подключается")
def __str__(self):
# вернуть строку, например:
# "Барсик | 08:00 | голод 3/10 | настроение 7/10 | энергия 7/10 | бодрствует"
raise NotImplementedError("__str__() ещё подключается")
# --- Демченков: действия (возвращают строку, НЕ печатают) ---
def feed(self):
# спит -> PetIsSleepingError; hunger == 0 -> PetNotHungryError
# hunger -3, mood +1; вернуть "Барсик поел"
raise NotImplementedError("feed() ещё подключается")
def play(self):
# спит -> PetIsSleepingError; energy < 2 -> PetTooTiredError
# mood +2, energy -2, hunger +1; вернуть сообщение
raise NotImplementedError("play() ещё подключается")
def sleep(self):
# уже спит -> PetIsSleepingError; is_sleeping = True; вернуть сообщение
raise NotImplementedError("sleep() ещё подключается")
def wake_up(self):
# не спит -> PetError("уже не спит"); is_sleeping = False; сообщение
raise NotImplementedError("wake_up() ещё подключается")
# --- Стельмах: время ---
def pass_time(self, hours=1):
# hours не целое или <= 0 -> ValueError
# каждый час: hour = (hour + 1) % 24, hunger +1,
# спит: energy +2, не спит: energy -1,
# hunger >= 8: mood -1
# вернуть сообщение "Прошло N ч., сейчас HH:00"
raise NotImplementedError("pass_time() ещё подключается")
def wants_to_sleep(self, hour):
# вернуть True, если hour >= 22 или hour < 7 или energy <= 2
raise NotImplementedError("wants_to_sleep() ещё подключается")
# ===== Тесты — Епифанцев =====
# Для проверки: внизу файла замени main() на test()
def test():
# 1. Создаём питомца (проверяем __init__)
pet = Pet(name="Жора")
# 2. Проверка __str__
print(pet)
# 3. Проверка базовых действий
print(pet.feed())
print(pet.play())
# 4. Проверка течения времени и сна
print(pet.pass_time(3))
print(pet.sleep())
# 5. Проверка ошибок
# 5.1 PetIsSleepingError
try:
pet.play()
print("Ошибка: PetIsSleepingError не вызвалась")
except PetIsSleepingError:
pass
pet.wake_up()
# 5.2 PetNotHungryError
try:
for _ in range(5):
pet.feed()
print("Ошибка: PetNotHungryError не вызвалась")
except PetNotHungryError:
pass
# 5.3 PetTooTiredError
try:
for _ in range(10):
pet.play()
pet.pass_time(1)
print("Ошибка: PetTooTiredError не вызвалась")
except PetTooTiredError:
pass
print("Тесты завершены")
# ===== Меню и основной цикл — Шевелько =====
def choice_menu(menu: List[Tuple[str, Callable[[], str]]]) -> str:
for id, item in enumerate(menu):
print(f"{id + 1}. {item[0]}") # item[0] - имя действия
while True:
choice = input("Выберите действие: ")
if not choice.isdecimal(): # неправильный ввод, спрашиваем заново
print("Неверный ввод")
continue
choice = int(choice) - 1
if choice < 0 or choice >= len(menu): # нет такого пункта
print("Неверный ввод")
continue
chosen = menu[choice]
return chosen[1]() # вызываем действие и выходим
def main():
print("Добро пожаловать в Тамагочи!")
name = input("Введите имя питомца: ")
pet = Pet(name)
def skip_time():
hours = int(input("Сколько часов пропустить: "))
return pet.pass_time(hours)
menu = [
("Покормить", pet.feed),
("Поиграть", pet.play),
("Уложить спать", pet.sleep),
("Разбудить", pet.wake_up),
("Пропустить время", skip_time),
("Показать состояние", lambda: str(pet)),
("Выйти", exit),
]
while True:
print()
try:
print(choice_menu(menu))
except PetError as e:
print("Нельзя:", e)
except ValueError:
print("Ошибка: нужно ввести целое положительное число")
except NotImplementedError as e:
print("Пока не готово:", e)
main()