Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 6

Игра "Зооферма". Майкл Доусон "Программируем на Python". Глава 8

11.05.2020, 22:38. Показов 5545. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!

Задача: Напишите программу «Зооферма», в которой будет создано несколько объектов класса Critter, а манипулировать ими всеми можно будет с помощью списка. Теперь пользователь должен заботиться не об одной зверюшке, а обо всех обитателях зоофермы. Выбирая пункт в меню, пользователь выбирает действие, которое хотел бы выполнить со всеми зверюшками: покормить их, поиграть с ними или узнать об их самочувствии. Чтобы программа была интереснее, при создании каждой зверюшки следует назначать ей случайно выбранные уровни голода и уныния.

Мой изначальный код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Critter Caretaker
# A virtual pet to care for
 
import random
 
class Critter(object):
    """A virtual pet"""
    def __init__(self, name, hunger, boredom):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom
 
    def __pass_time(self):
        self.hunger += 1
        self.boredom += 1
 
    @property
    def mood(self):
        unhappiness = self.hunger + self.boredom
        if unhappiness < 5:
            m = "happy"
        elif 5 <= unhappiness <= 10:
            m = "okay"
        elif 11 <= unhappiness <= 15:
            m = "frustrated"
        else:
            m = "mad"
        return m
    
    def talk(self):
        print("I'm", self.name, "and I feel", self.mood, "now.\n")
        self.__pass_time()
    
    def eat(self, food):
        food = int(input("How many food do you want to feed? (1-4):"))
        if 0 < food <= 4:
            print("Brruppp.  Thank you.")
            self.hunger -= food
            if self.hunger < 0:
                self.hunger = 0
            elif self.hunger >= 15:
                self.hunger = 15
        else:
            print("Sorry, choice isn't valid")
        self.__pass_time()
 
    def play(self, fun):
        fun = int(input("How many times do you want to play? (1-4):"))
        if 0 < fun <= 4:
            print("Wheee!")
            self.boredom -= fun
            if self.boredom < 0:
                self.boredom = 0
            elif self.boredom >= 15:
                self.boredom = 15
        else:
            print("Sorry, choice isn't valid")
        self.__pass_time()
 
    def __str__(self):
        rep = "Object class Critter\n"
        rep += "Name: " + self.name + "\n"
        rep += "Current status:\n"
        rep += "Hunger: " + str(self.hunger) +"\n"
        rep += "Boredom: " + str(self.boredom) +"\n"
        rep += "Mood: " + self.mood +"\n"
        return rep
 
def main():
 
    farm =[]
 
    crit_number = input("Welcome to the Zoofarm.\n\nIt's empty now.\nHow many critters will live on the farm?:\n")
    for crit in range(int(crit_number)):
        crit_name = input("\nOn the farm there is a new critter.\nHow will you call it?:\n")
        crit = Critter(crit_name, hunger = random.randint(1, 16), boredom = random.randint(1, 16))
        farm.append(crit)
 
 
 
    choice = None  
    while choice != "0":
        print \
        ("""
        Critter Caretaker
    
        0 - Quit
        1 - Listen to your critter
        2 - Feed your critter
        3 - Play with your critter
        """)
    
        choice = input("Choice: ")
        print()
 
               # exit
        if choice == "0":
            print("Good-bye.")
 
        # listen to your critters
        elif choice == "1":
            for crit in farm:
                crit.talk()
 
        # feed your critters
        elif choice == "2":
            for crit in farm:
                crit.eat(food)
 
        # play with your critters
        elif choice == "3":
            for crit in farm:
                crit.play(fun)
 
        # know the level of hunger and boredom
        elif choice == "4":
            for crit in farm:
                print(crit)
 
        # some unknown choice
        else:
            print("\nSorry, but", choice, "isn't a valid choice.")
 
main()
("\n\nPress the enter key to exit.")
Но он выдает ошибку:
Traceback (most recent call last):
File "test.py", line 124, in <module>
main()
File "test.py", line 108, in main
crit.eat(food)
NameError: name 'food' is not defined

Нашел решение готовое другого человека: он вынес переменные food и fun за в функцию метод в main().

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# Zoofarm Caretaker
# A virtual zoofarm to care for
 
import random
 
class Critter(object):
    """A virtual pet"""
 
    def __init__(self, name, hunger, boredom):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom
 
    def __str__(self):
        rep = self.name + "\n"
        rep += "Hunger level is: " + str(self.hunger) + "\n"
        rep += "Boredom level is: " + 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 = "happy"
        elif 5 <= unhappiness <= 10:
            m = "okay"
        elif 11 <= unhappiness <= 15:
            m = "frustrated"
        else:
            m = "mad"
        return m
 
    def talk(self):
        print("I'm", self.name, "and I feel", self.mood, "now.\n")
        self.__pass_time()
 
    def eat(self, food):
        if 0 < food <= 5:
            print("\nI'm", self.name + ".  Brruppp.  Thank you.")
            self.hunger -= food
            if self.hunger < 0:
                self.hunger = 0
            elif self.hunger >= 15:
                self.hunger = 15
        else:
            print("\nSorry, but", food, "isn't a valid choice.")
        self.__pass_time()
 
    def play(self, fun):
        if 0 < fun <= 5:
            print("\nI'm", self.name + ".  Wheee!")
            self.boredom -= fun
            if self.boredom < 0:
                self.boredom = 0
            elif self.boredom >= 15:
                self.boredom = 15
        else:
            print("\nSorry, but", fun, "isn't a valid choice.")
        self.__pass_time()
 
 
def main():
 
    # create a farm, first empty
    farm = []
 
    # fill the farm with critters
    crit_number = input("Welcome to the Zoofarm.\n\nIt's empty now.\nHow many critters will live on the farm?:\n")
    for crit in range(int(crit_number)):
        crit_name = input("\nOn the farm there is a new critter.\nHow will you call it?:\n")
        crit = Critter(crit_name, hunger = random.randint(1, 16), boredom = random.randint(1, 16))
        farm.append(crit)
 
    # check
    # what critters on the farm?
    # and in what condition are they?
    print("\nNow there are critters on the farm:\n")
    for crit in farm:
        print(crit)
    print("Care of them.")
 
    choice = None  
    while choice != "0":
        print \
        ("""
       0 - Quit
       1 - Listen to your critters
       2 - Feed your critters
       3 - Play with your critters
       4 - Know the level of hunger and boredom
       """)
 
        choice = input("Choice: ")
        print()
 
        # exit
        if choice == "0":
            print("Good-bye.")
 
        # listen to your critters
        elif choice == "1":
            for crit in farm:
                crit.talk()
 
        # feed your critters
        elif choice == "2":
            food = int(input("How much food to give each critter?\nChoose a value between 1 and 5:\n"))
            for crit in farm:
                crit.eat(food)
 
        # play with your critters
        elif choice == "3":
            fun = int(input("How much do you want to play with each critter?\nChoose a value between 1 and 5:\n"))
            for crit in farm:
                crit.play(fun)
 
        # know the level of hunger and boredom
        elif choice == "4":
            for crit in farm:
                print(crit)
 
        # some unknown choice
        else:
            print("\nSorry, but", choice, "isn't a valid choice.")
 
main()
input("\n\nPress the enter key to exit.")

Не могу никак понять, почему мой вариант не работает? Почему нельзя внести переменную прямо в метод? Спасибо заранее всем за ответы!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2020, 22:38
Ответы с готовыми решениями:

Игра анаграммы. Майкл Доусон "Программируем на Python". Глава 4
Добрый день! Задача: доработать игру &quot;Анаграммы&quot; из указанного учебника так, чтобы к каждому слову полагалась подсказка. Игрок должен...

Игра анаграммы. Майкл Доусон "Программируем на Python". Глава 9
Добрый день, друзья! Продолжаю решать задачи из этого учебника. Возник вопрос по 4ой задаче из этой главы: Создайте несложную...

Майкл Доусон. Глава 7. Викторина
Здравствуйте. Недавно программирую. Начал с книги Майкла Доусона. Возникла проблема с доработкой программы #Booch 22.07.2020 ...

2
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
12.05.2020, 01:46
Цитата Сообщение от Beatus Посмотреть сообщение
Почему нельзя внести переменную прямо в метод?
внести то можно и нужно, вот только ввод переменной у вас выполняется внутри метода, а до этого программа проверяет, что ей передали, находит food, узнаёт что такой переменной ещё нет, в итоге справедливая ошибка "name 'food' is not defined", всё предельно ясно
Цитата Сообщение от Beatus Посмотреть сообщение
он вынес переменные
он ничего не выносил, просто ввод нужно делать по-человечески
0
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 6
12.05.2020, 09:11  [ТС]
Я изучаю язык только недели 2-3, поэтому, если не составит сильно труда, можете пояснить, пожалуйста, что Вы подразумеваете под "по-человечески"?

Заранее благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2020, 09:11
Помогаю со студенческими работами здесь

Какую книгу лучше читать после "Майкл Доусон.Программируем на Python"?
Какая книга подходит для прочтения новичком после &quot;Майкл Доусон.Программируем на Python&quot;?

Куплю книгу "Программируем на Python" Майкл Доусон
Куплю. Москва. Для связи: sparkle991@gmail.com

Куплю книгу "Программируем на Python" Майкл Доусон
Санкт-Петербург; Программируем на Python (Python Programming for the Absolute Beginner) Майкл Доусон; Только на русском.

Майкл Доусон. Викторина
Всем привет. Изучаю Python по учебнику Доусона и столкнулся с проблемой: &quot;local variable 'explanation' referenced before assignment&quot;....

Работа с файлами. (Майкл Доусон)
Всем привет. Столкнулся с маленькой проблемой. Изучаю книгу Майкла Доусона &quot;Программирование на Python&quot; Остановился на 7 главе. Там...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru