Вложение if / else оператора в цикле while - PullRequest
0 голосов
/ 11 января 2019

Это текстовая приключенческая игра. Пользователь сталкивается с первым сценарием a(). Если они выбирают 2, игра продолжается. Если они выбирают 1, они умирают и им предоставляется возможность снова сыграть. Не уверен, что я здесь делаю не так.

"""
MAIN LOOP
"""
play_again = "yes"
while play_again == "yes" or play_again == "y":
    a()  # user makes a choice
    choice = choose_ans()
    check_ans_a(choice)  # intention: if user chooses "1", they die and are asked to play again
        if choice == "1":  # problem: Unexpected indent. If indent is deleted, b() becomes unreachable
            play_again = input('Play again?\n'
                               '(y)es ')
            break
        else:
            continue
    b()
    choice = choose_ans()
    check_ans_b(choice)

РЕДАКТИРОВАТЬ: Решение, полученное из комментариев ниже, было простым:

"""
MAIN LOOP
"""
play_again = "yes"
while play_again == "yes" or play_again == "y":
    a()  # user makes a choice
    choice = choose_ans()
    check_ans_a(choice)
        if choice == "1"  # player dies
            play_again = input('Play again?\n'
                               '(y)es ')
            continue  # restarts loop
    b()
    choice = choose_ans()
    check_ans_b(choice)

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Проблема в продолжении. Продолжение заставляет код снова «перейти» к началу цикла while. Предложение: удалите else / continue часть. Если есть только эти два варианта, это не нужно. Если a == 1, перерыв покинет цикл while. если его 2 a == 2 не верно, то часть после него (b) будет проверена.

https://www.tutorialspoint.com/python3/python_continue_statement.htm

0 голосов
/ 11 января 2019

Попробуйте запустить эту версию своего кода в целях отладки, комментируйте / раскомментируйте, чтобы увидеть, как меняется результат. Я использовал random для имитации пользовательского ввода, избавляясь от вызовов методов.

import random

play_again = "yes"
while play_again == "yes" or play_again == "y":
    choice = random.choice(["1","2"])
    print('choice = choose_ans()', choice)
    if choice == "1":
        play_again = random.choice(["yes","no"])
        print('play_again?', play_again)
        # break # <-- the break control is already made by while condition
    # else:
    #     continue
    # b()
    choice = random.choice(["1","2"])
    print('check_ans_b(choice)', choice)
0 голосов
/ 11 января 2019

Проблема ваша else: continue. Если код входит в блок if, он break выйдет из цикла while. Но если условие не выполнено, будет введен блок else. Внутри while цикла continue автоматически перейдет к вершине цикла и начнется снова, поэтому b() никогда не достигается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...