Загрузка данных


# ===== ТАМАГОЧИ: итоговая сборка =====
from typing import List, Tuple, Callable

# Вставляй присланные методы на место строк raise NotImplementedError(...)

# ===== Ошибки — Епифанцев =====
class PetError(Exception):
    """Базовая ошибка питомца."""


class PetIsSleepingError(PetError):
    """Действие невозможно: питомец спит."""


class PetTooTiredError(PetError):
    """Питомец слишком устал (energy < 2)."""


class PetNotHungryError(PetError):
    """Питомец не голоден (hunger == 0)."""


# ===== Питомец =====
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() ещё подключается")


# ===== Меню и основной цикл — Шевелько =====
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()