#python #variables
#питон #переменные #python
Вопрос:
Итак, я пытаюсь создать симулятор больницы (на основе текста), и есть возможность набрать больше персонала. Я выяснил, как ограничить количество раз, которое они могут набирать (ограничение в 350 сотрудников), и сумма, которую они получают, должна быть случайной (random.choice (staffrec), но как только случайное число генерируется из staffrec, оно остается прежним, и я хочу, чтобы код был запущен снова с другим результатом. Вот мой код. (Извините за длинноту, я поместил все это, чтобы ничего не пропустить)
import time
import random
staff = 100
wards = 20
beds = 140
patients = 80
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
option = ""
print("Welcome to Hospital Simulator!")
print("You have to manage the hospital with patients coming in,")
print("Staff recruitement and staff quitting,")
print("and how many beds and wards are available!")
Aopt = ["A", "a"]
Bopt = ["B", "b"]
Copt = ["C", "c"]
Dopt = ["D", "d"]
Eopt = ["E", "e"]
Fopt = ["F", "f"]
while staff <= 350:
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
staff = staff staffrec
while option != Fopt:
option = input("""What would you like to do:
A: View number of patients
B: View number of beds
C: View number of wards
D: View number of staff
E: Recruit more staff
F: Quitn""")
if option in Aopt:
print("You currently have " str(patients) " patientsn")
if option in Bopt:
print("You currently have " str(beds) " bedsn")
if option in Copt:
print("You have " str(wards) " wardsn")
if option in Dopt:
print("You currently have " str(staff) " staffn")
if option in Eopt:
print("You try and recruit more staff. You recruit " str(staffrec) " staffn")
if staff > 350:
print("You cannot recruit any more staff!")
if option in Fopt:
print("Goodbye!")
break
Были и другие сообщения, связанные с этой темой с использованием классов, но поскольку я довольно новичок в python, я не совсем понял их. : 3 Мы были бы очень признательны за любую помощь!
Питер
Ответ №1:
насколько я понимаю, вы хотите отслеживать предыдущий выбор, и если новый выбор совпадает с предыдущим выбором, он должен попробовать выбрать снова, пока не получит новое значение, вот мое мнение по этому поводу:
prev_staffrec = None
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def choose_staffrec():
global prev_staffrec # to make sure you're accessing it in the global scope
staffrec2 = random.choice(staffrec)
if staffrec2 == prev_staffrec:
choose_staffrec() # run the function again if it's the same
return staffRec2
это устраняет необходимость создавать staffrec снова и снова
теперь везде, где у вас есть строки
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
вы можете заменить на:
choose_staffrec()
Ответ №2:
Добро пожаловать на форум,
Мне бросается в глаза несколько особенностей вашего кода:
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
Эти две строки ничего не вносят, поскольку вы в любом случае заменяете значение staffrec
позже. Кроме того, как правило, избегайте повторного использования имен переменных, особенно если вы переназначаете им совершенно разные типы ( staffrec
был список, теперь это целое число).
Этот цикл:
while staff <= 350:
staffrec = [1, 2, 3, 4, 5, 6, 7, 8, 9]
staffrec = random.choice(staffrec)
staff = staff staffrec
Кажется избыточным, и на самом деле это не ограничивает staff
максимум 350. При использовании этого подхода, когда цикл заканчивается, staff
всегда будет между 351 и 359.
Каким вы хотите, чтобы был фактический диапазон? Зачем вам для этого нужен цикл? Просто используйте random.randint
для генерации числа в фиксированном диапазоне.
Это условие:
while option != Fopt:
Никогда не будет false. option
всегда будет строкой, а строка никогда не будет равна кортежу. Поскольку вы все равно используете break
позже для выхода из цикла, вы могли бы также превратить это в while True:
.
Если я правильно понял вопрос, вы хотите знать, как сгенерировать новое значение для staff
(путем повторного запуска цикла while из предыдущего). Вы могли бы обернуть это в функцию, но это кажется ненужным — просто используйте random.randint
для генерации нового значения, как я упоминал ранее.
Ответ №3:
Вы присваиваете значение staffrec
перед основной логикой игры и никогда не обновляете новым случайным значением, поэтому его значение будет одинаковым каждый раз, когда вы вводите блок цикла, который добавляет новых рекрутов. Если вы хотите, чтобы она менялась каждый раз, просто вызывайте random
только тогда, когда вам нужно случайное число.
Я бы также предложил использовать randint
метод over choice, поскольку он будет генерировать случайное число между любыми двумя значениями. Например, random.randint(0, 100)
вернет случайное число от 0 до 100.
Смотрите ниже:
if option in Eopt:
staffrec = random.randint(1, 9)
staff = staffrec
print("You try and recruit more staff. You recruit " str(staffrec) " staffn")
if staff > 350:
print("You cannot recruit any more staff!")
Комментарии:
1. на самом деле, op присваивает значение
staffrec
более одного раза и 350 раз в цикле while2. Это все равно происходит до того, как будет сделано что-либо еще, и остается неизменным на каждой итерации цикла выбора опции, поэтому оно никогда не изменяет значение
staffrec