Создание функции для перезапуска во время цикла

#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...') , а затем передать ошибку в print или 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 не будет работать внутри вызова функции. (Также у вас синтаксическая ошибка.)