#python
#python
Вопрос:
Я создаю текстовую приключенческую игру, и когда здоровье пользователя достигает 0, я спрашиваю их, хотят ли они перезапустить игру. Это работает нормально — однако я много дублирую свой код внутри этого цикла while и хочу знать, как создать функцию, которую я могу вызвать для перезапуска игры.
Это код, который я использую для перезапуска:
if health <= 0:
print('You died. Do you want to restart? (y/n)')
ans = input().lower()
if ans == 'y':
continue
else:
break
Комментарии:
1. Вы не можете использовать функцию для выполнения
break
илиcontinue
«от имени» цикла, из которого вызывается функция. Лучшее, что вы могли бы сделать, введя функцию, — это заставить функцию возвращать некоторые данные (например, стандартизированную версию того, что ввел пользователь) и выполнить соответствующую инструкцию, используя эти данные. Вы также можете представить логику игры в объекте, изменить атрибут объекта в функции (state.should_continue
?), А затем проверить это в цикле while (while state.should_continue:
) . Трудно сказать, учитывая такой небольшой контекст.2. Похоже, у вас нет цикла while
Ответ №1:
Есть много способов, которыми вы могли бы это сделать, но это один.
Следующая функция вернет True
, если пользователь вводит 'yes'
, и False
в противном случае:
def continue_prompt():
typewriter('You now have 0 health and lose the game.')
print('nDo you want to restart? (yes/no)')
return input().lower() == 'yes':
Приведенный ниже код приведет к короткому замыканию, если health
это не 0
так, поэтому функция будет вызываться только в том случае, если персонаж умер. Тогда это будет continue
или break
в зависимости от возвращаемого значения continue_prompt
.
if health <= 0 and continue_prompt():
continue
else:
break
Вы также можете настроить приглашение, continue_prompt
приняв один или несколько аргументов, если вы хотите, чтобы оно указывало разные вещи, например, для разных причин смерти.
Ответ №2:
Вы можете использовать пользовательское исключение и вызывать его, когда healths равно 0. Затем можно переместить все проблемы, влияющие на работоспособность, в повторно используемую функцию, которая обрабатывает смерть. Просто вызовите функцию для изменения работоспособности вместо добавления или вычитания
Определите исключение:
class DeceaseException(Exception):
pass
И функция для обработки работоспособности
def affect_health(gain):
global health
health = gain
if health <= 0:
raise DeceaseException
Везде, где затрагивается работоспособность, вы ставите, например:
# health decreases
affect_health(-10)
И в основной функции:
while True:
try:
# main game code
except DeceaseException:
print('You died. Do you want to restart? (y/n)')
ans = input().lower()
if ans == 'y':
continue
else:
break
Комментарии:
1. Я не уверен, как я отношусь к созданию исключения для потока управления, даже когда ничего не пошло «не так», но это, честно говоря, довольно умно. Вы могли бы даже сделать что-то вроде
raise RestartException('You died because...')
, а затем передать ошибку вtypewriter
, чтобы получить пользовательские подсказки о смерти / перезапуске.2. @CrazyChucky Я считаю, что смерть — это то, что «пошло не так», как могло получиться 🙂
Ответ №3:
Я предполагаю, что это просто сидит внутри while
цикла?
Если это так, одним из вариантов может быть
if not health:
typewriter('You now have 0 health and lose the game.')
restart = input('nDo you want to restart? (yes/no)')
if restart.lower() == 'yes':
continue
Комментарии:
1. Это не сработает, потому
continue
что не перезапускается2. @SrishruthikAlle Если этот блок кода находится внутри цикла while, как упоминалось, то да, это так.
3. Однако это все равно придется вырезать и вставлять везде, где вы хотите, чтобы это произошло.
continue
не будет работать внутри вызова функции. (Также у вас синтаксическая ошибка.)