# Моя зверюшка
# Виртуальный питомец, о котором пользователь может заботиться
#
# Программа «Моя зверюшка» доработана так, что пользователь сам решает, сколько еды скормить
# зверюшке и сколько времени потратить на игру с ней в условных единицах.
# В зависимости от передаваемых величин зверюшка неодинаково быстро насыщается и веселеет.
#
# В программе «Моя зверюшка» создан своего рода «черный ход» - способ увидетЬ точные значения
# числовых атрибутов объекта.
# В меню сделан секретный пункт 9, который подсказка не отражает, если пользователь его выбирает,
# то на экран выводится объект.
# Реализовано с помощью специального метода _str_().
#
# Программа "Зооферма".
# Создается несколько объектов класса Critter, манипулировать ими всеми можно с помощью списка.
# Теперь пользователь заботится не об одной зверюшке, а о нескольких обитателях зоофермы.
# Выбирая пункт меню, пользователь выбирает действие, которое делается со всеми зверюшками сразу.
# При создании каждой зверюшки, случайным образом выбираеются уровни голода и уныния.
import random

class Critter(object):
    """Виртуальный питомец"""
    def __init__(self, name, hunger = 0, boredom = 0):
        self.name = name         # имя зверюшки
        self.hunger = hunger     # уровень голода
        self.boredom = boredom   # уровень уныния
        
    """Отражает точные значения атрибутов объекта"""    
    # Вызов производится по нажатию 9
    def __str__(self):
        rep = "Объект класса Critter\n"
        rep += "Имя: " + self.name + "\n"
        rep += "Уровень голода: " + str(self.hunger) + "\n"
        rep += "Уровень уныния: " + str(self.boredom) + "\n"
        return rep

    """ Увеличивает уровень голода и уныния """
    def __pass_time(self):
        self.hunger += 1         # увеличить уровень голода
        self.boredom += 1        # увеличить уровень уныния

    """ Отражает самочувствие зверей """
    @property
    def mood(self):
        unhappiness = self.hunger + self.boredom
        if unhappiness < 5:
            m = "прекрасно"
        elif 5 <= unhappiness <= 10:
            m = "неплохо"
        elif 11 <= unhappiness <= 15:
            m = "не сказать чтобы хорошо"
        else:
            m = "ужасно"
        return m
    
    """ Беседуем с хозяином """
    def talk(self):
        print("Меня зовут", self.name, "и сейчас я чувствую себя", self.mood)
        self.__pass_time()
        
    """ Едим """    
    def eat(self, food = 4):
        print("Мррр... Спасибо!")
        self.hunger -= food
        if self.hunger < 0:
            self.hunger = 0
        self.__pass_time()
        
    """ Играем """
    def play(self, fun = 4):
        print("Yиии!")
        self.boredom -= fun
        if self.boredom < 0:
            self.boredom = 0
        self.__pass_time()
        

def main():
    print(
    """
    Программа "Зооферма".
    Создается несколько объектов класса Critter.
    Теперь пользователь заботится не об одной зверюшке, а о нескольких обитателях зоофермы.
    Выбирая пункт меню, пользователь выбирает действие, которое делается со всеми зверюшками сразу.
    При создании каждой зверюшки, случайным образом выбираеются уровни голода и уныния.
    """
    )
    
    crit_list = []                                          # список зверей
    # Цикл создания зоофермы
    yes_no = "да"                                           # индикатор окончания формирования списка зверей
    while yes_no != "нет":
        # минимум создается один зверь
        crit_name = input("Kaк вы назовете зверя?: ")                     # имя зверя
        amount_of_food = random.randint(0, 15)                            # количество еды
        amount_of_boredom = random.randint(0, 15)                         # количество уныния
        crit = Critter(crit_name, amount_of_food, amount_of_boredom)      # создаем зверя(экземпляр объекта)
        crit_list.append(crit)                                            # добавляем зверя в зооферму, т.е. в список
        yes_no = input("Добавить еще одного зверя в зооферму?(да/нет): ")
        

    choice = None  
    while choice != "0":
        print \
        ("""
        Моя зооферма
    
        0 - Выйти
        1 - Узнать о самочувствии зверей
        2 - Покормить зверей
        3 - Поиграть с зверями
        """)
    
        choice = input("Ваш выбор: ")
        print()

        # выход
        if choice == "0":
            print("До свиданья.")

        # беседа со зверями
        elif choice == "1":
            for x in crit_list: # цикл по всему списку экземпляров объектов
                x.talk()
        
        # кормление зверей
        elif choice == "2":
            for x in crit_list:
                # Запрос количества еды и вызов метода с уменьшением чувства голода
                amount_of_food = int(input("Сколько еды дадим зверю - " + x.name + "?:"))
                x.eat(amount_of_food)
         
        # игра с зверями
        elif choice == "3":
            for x in crit_list:
                # Запрос количества времени игры и вызов метода уменьшения уровня уныния
                amount_of_boredom = int(input("Как долго поиграем со зверем - " + x.name + "?:"))           
                x.play(amount_of_boredom)
            
        # вывод точных значений атрибутов объектов
        elif choice == "9":
            for x in crit_list:
                print(x)

        # непонятный пользовательский ввод
        else:
            print("\nИзвините. в меню нет пункта.")

main()
