Цикл While не перезапускается, даже когда я устанавливаю переменную для его перезапуска

#python

#python

Вопрос:

Я довольно новичок в python и решил попробовать текстовое приключение в качестве начального проекта, чтобы изучить основы.

У меня есть цикл while, который перезапускается с помощью var valid_input, если пользователь вводит неправильное слово. Это работает, но я замечаю, что даже когда он уже должен перезапускаться, он все равно считывает последний оператор else, выдавая дополнительную печать, которую я собираюсь показывать только тогда, когда пользователь вводит неправильное действие.

 while valid_input == False:
    dec2 = input("Do you shout aloud or try to use something to light the place (shout/light)")
    if dec2 == "light":
        if "lighter" in inventory:
            print(">You use the lighter to light up the room")
            print(">You find yourself in a large cavernous structure")
            room_visible = 1
            valid_input = True
            break
        else:
            print(">You don't seem to have anything to light up the place.")
            valid_input = False
        if dec2 == "shout":
            print(">You shout at the top of your lungs and see what that does.")
            valid_input = True
            break
        else:
            print("Invalid action")
            valid_input = False
  

Обновление # 1

Я исправил код и попытался сделать правильный отступ, поскольку это была рекомендация. Для меня это имело смысл, хотя оно все равно выводило сообщение «Недопустимое действие» независимо.

Я решил случайным образом поместить valid_input = True в оператор else, и, похоже, это сработало. В настоящее время это код, который работает, хотя я не понимаю, почему он сработал. Надеюсь, кто-нибудь объяснит!

 while valid_input == False:
    dec2 = input("Do you shout aloud or try to use something to light the place (shout/light)")
    if dec2 == "light":
        if "lighter" in inventory:
            print(">You use the lighter to light up the room")
            print(">You find yourself in a large cavernous structure")
            room_visible = 1
            valid_input = True
            break
        else:
            valid_input = True
            print(">You don't seem to have anything to light up the place.")
            valid_input = False
    elif dec2 == "shout":
        print(">You shout at the top of your lungs and see what that does.")
        valid_input = True
        break
    else:
        print("Invalid action")
        valid_input = False
  

Комментарии:

1. Пожалуйста, исправьте отступ. Как написано, мы не можем определить, какие части имеют отступ под циклом while.

2. Кроме того, неясно, что вы имеете в виду, когда говорите «перезапустить» цикл. Здесь есть только один цикл, и когда он будет выполнен, он будет выполнен; для него нет способа «перезапустить». Есть ли какой-либо внешний цикл или другая содержащая структура, которую вы нам не показали?

3. Похоже, что ваш отступ перепутан, может быть? if dec2 == "shout" похоже, что он должен быть на том же уровне отступа if dec2 == "lighter" , что и и должен быть an elif , было бы справедливо сказать?

4. Последнее if dec2 == "shout" утверждение находится внутри if dec2 == "light" ветки, поэтому оно никогда не может быть истинным, и поэтому else ветка всегда выполняется.

5. @JohnGordon Да, на самом деле это был отступ кода, и вы, ребята, указали, что это было неправильно, поэтому я исправил это! На самом деле это не решило проблему, но все равно будет учитываться при форматировании моего кода. 🙂

Ответ №1:

Финал if dec2=="shout" ... else ... находится внутри блока кода if dec2=="light" . Если пользователь вводит «light», будет выполнена эта комбинация if-else. Поскольку dec2 is light , это не shout так, и, следовательно, интерпретатор вводит else блок и печатает "Invalid action" .

Вероятно, вам нужен следующий код

 while valid_input == False:
    dec2 = input("Do you shout aloud or try to use something to light the place (shout/light)")
    if dec2 == "light":
        if "lighter" in inventory:
            print(">You use the lighter to light up the room")
            print(">You find yourself in a large cavernous structure")
            room_visible = 1
            valid_input = True
            break
        else:
            print(">You don't seem to have anything to light up the place.")
            valid_input = False
    elif dec2 == "shout":
        print(">You shout at the top of your lungs and see what that does.")
        valid_input = True
        break
    else:
        print("Invalid action")
        valid_input = False
  

Комментарии:

1. Привет, спасибо за это. Логика правильная и имеет смысл для меня, хотя, когда я попробовал ее, она по-прежнему выводит сообщение «Недопустимое действие». То, что я случайно попытался, было помещено valid_input = True перед оператором else, и, похоже, это сработало, хотя я до сих пор не понимаю, почему.