#python #loops #currency
Вопрос:
В качестве кульминационного задания в моем классе нам было поручено написать игру, в которую предполагается играть в парках развлечений. После завершения игры нам нужно дать игроку возможность купить определенное количество 6 различных призов, если у него есть очки, чтобы позволить себе их.
В моей программе я сделал так, чтобы, если кто-то закажет определенную сумму одного приза, которая превышает средний балл, это говорит вам, что у вас недостаточно очков, чтобы позволить себе это, и вам нужно перепечатать свой ответ.
Однако я допустил ошибку в том, что баланс игрока (сумма всех его очков) опускается ниже нуля, даже если число, отправленное в программу, меньше указанного баланса. Я думаю, что это как-то связано со стоимостью каждого приза, так как один из них, деревянные змеи, стоит 35 очков, и то же самое можно сказать и о других, хотя и с разными цифрами.
balance = 100
#How many glowsticks the player wants
prize1 = int(input("Tell me again how many glowsticks you want "))
if prize1 <= balance:
prize1 = prize1 * 10
balance = balance - prize1
print("Your balance is now",balance,"points.")
elif prize1 > balance:
print("Too many glowsticks, please change your amount")
break
#Confirm again if that's how many jumbo glasses the player wanted
prize2 = int(input("Tell me again how many jumbo glasses you want "))
if prize2 <= balance:
prize2 = prize2 * 15
balance = balance - prize2
print("Your balance is now",balance,"points.")
elif prize2 > balance:
print("Too many jumbo glasses, please change your amount.")
break
#How many inflatable hammers the player wants
prize1 = int(input("Tell me again how many inflatable hammers you want "))
if prize1 <= balance:
prize1 = prize1 * 25
balance = balance - prize1
print("Your balance is now",balance,"points.")
elif prize1 > balance:
print("Too many inflatable hammers, please change your amount")
break
#How many of dinosaur grabbers the player wants
prize2 = int(input("Tell me again how many dinosaur grabbers you want "))
if prize2 <= balance:
prize2 = prize2 * 30
balance = balance - prize2
print("Your balance is now",balance,"points.")
elif prize2 > balance:
print("Too many dinosaur grabbers, please change your amount.")
break
#How many wooden snakes the player wants
prize1 = int(input("Tell me again how many wooden snakes you want "))
if prize1 <= balance:
prize1 = prize1 * 35
balance = balance - prize1
print("Your balance is now",balance,"points.")
elif prize1 > balance:
print("Too many wooden snakes, please change your amount")
break
#How many foam swords the player wants
prize2 = int(input("Tell me again how many foam swords you want "))
if prize2 <= balance:
prize2 = prize2 * 40
balance = balance - prize2
print("Your balance is now",balance,"points.")
elif prize2 > balance:
print("Too many foam swords, please change your amount.")
break
Это та часть моего кода, в которой возникает проблема. Я хочу, чтобы он был таким, чтобы игрок, выиграв, вводил количество каждого приза, которое он хочет. Если они не могут позволить себе нужную сумму, так как это приведет к тому, что ваш баланс опустится ниже нуля или превысит ваш баланс, программа попросит вас изменить сумму в соответствии с ней.
P.S. Причина, по которой в этом примере баланс равен 100, указана в демонстрационных целях. Оно может не всегда равняться этому числу и может быть выше или ниже в зависимости от того, насколько хорошо игрок справлялся на протяжении всей игры.
Комментарии:
1. Я могу купить 99 светящихся палочек, потому что 99
2. Да, вот с чем у меня проблема. То, что я сделал в своей программе, не является идеальным решением, и мне просто нужна помощь, чтобы разобраться в этой части.
3. Вам нужно учитывать цену, когда вы проводите тестирование, чтобы понять, можете ли вы себе что-то позволить. Поскольку это ваше домашнее задание, я неохотно даю вам какую-либо дополнительную информацию или явное решение.
Ответ №1:
В программировании есть ключевое правило, называемое СУХИМ: не повторяйся. Обратите внимание, как эта архитектура решает проблему с гораздо меньшим количеством кода. Это позволяет легко добавлять новые элементы, и если вы придумаете лучший способ управления, одно исправление подойдет для всего:
balance = 100
options = [
('glowsticks', 10),
('jumbo glasses', 15),
('inflatable hammers', 25),
('dinosaur grabbers', 30),
('wooden snakes',35),
('foam swords', 40)
]
for name, cost in options:
while True:
count = int(input(f"Tell me again how many {name} you want? "))
if count * cost <= balance:
balance -= count * cost
print( "Your balance is now", balance, "points.")
break
else:
print(f"Too many {name}, please change your amount")
Комментарии:
1. Мне нравится этот ответ, и я не пытаюсь повысить свой собственный ответ, но есть ли сценарий, в котором использование такого цикла было бы лучше, чем функция? Искренне спрашиваю в попытке узнать больше сам.
2. Нет. Если это для одноразового школьного задания, я бы просто написал его в строке. Если бы это было что-то, что будет длиться всю жизнь, я бы использовал функцию.
3. Согласен, я думаю, что для чего-то столь простого, как это, встроенное, вероятно, прекрасно и легко понять / реализовать.
Ответ №2:
Редактировать
Основываясь на отзыве @Tim о том, что это не очень хорошее использование рекурсии, я обновил свой код, используя ту же основную идею.
Проблема в том, что при вводе вы сравниваете количество товаров с балансом баллов, а не сравниваете стоимость того, сколько они хотят, с тем, что доступно.
Чтобы свести к минимуму количество строк кода, вы также можете создать функцию с рекурсией, чтобы продолжать запрашивать ввод, пока число недопустимо. Я бы предложил следующее:
balance = 100
prices = {'glowsticks':10, #etc}
def check_balance(item, qty):
global balance
while (cost := prices[item] * qty) > balance:
qty = int(input("Too many, try again: "))
else:
balance -= cost
print(f"New balance is {balance}.")
return
Комментарии:
1. Рекурсия имеет свои преимущества, но это не очень хорошо. Это экономит только одну строку кода и учит плохим привычкам. Это, естественно, замкнутая проблема: цикл до тех пор, пока ответ не будет приемлемым.
2. Спасибо за отзыв @TimRoberts. Я изменил свой ответ, включив вместо этого циклическое выполнение.
Ответ №3:
Допустим, n-это количество деревянных змей, которые вы хотите купить
Вы проверяете, меньше ли баланс n (поэтому, если я хочу 2 змеи, пока баланс больше, чем 2, это позволит мне купить деревянных змей), но вам нужно проверить, меньше ли стоимость покупки n змей, чем баланс.
Это, конечно, относится ко всем элементам вашей программы.
Вы также можете заменить свои elif
заявления else
заявлениями, как будто стоимость не ниже или не равна балансу, вы точно знаете, не проверяя, что она будет больше.
Я буду использовать деревянных змей в качестве примера
заменять
#How many wooden snakes the player wants
prize1 = int(input("Tell me again how many wooden snakes you want "))
if prize1 <= balance:
#buy the item
elif prize1 > balance:
print("Too many wooden snakes, please change your amount")
break
с
#How many wooden snakes the player wants
prize1 = int(input("Tell me again how many wooden snakes you want "))
if prize1 * 35 <= balance:
#buy the items
else:
print("Too many wooden snakes, please change your amount")