Почему он не сбрасывает код после того, как пользователь просит перезапустить программу? - PullRequest
0 голосов
/ 31 января 2020

Так что это мой код. Модернизированный. У меня были некоторые проблемы с циклами While, но мне удалось это преодолеть. Теперь моя проблема заключается в следующем. Когда пользователь достигает конца l oop и его просят воспроизвести снова, программа не изменит свое случайное число. Любая помощь могла бы быть полезна. И как говорится в заголовке, python не распознает заглавные буквы Y и N, и это займет всего y и n.

from random import *
def play():
    return guess()

def retry():
    while True:
        replay = input("Try again ?(Y/N)")
        if replay not in {"y", "n"}:
            print("Please enter Yes or No")
        elif replay.lower() == "n":
            print("Thanks for playing! Bye now!.")
            break
        elif replay.lower() == "y":
            print("As you wish!")
            return guess()

def guess():
    while True:
        user = int(input("Guess the number: \n"))
        print(user,a)
        if user < a:
            print("Higher")
        elif user > a:
            print("Lower")
        if user == a:
            return retry()
a = randint(0,20)



play()

1 Ответ

1 голос
/ 31 января 2020

Не сбрасывается a, потому что на него никогда не поступало указаний. Когда вы перезапустите игру, вы должны сгенерировать новое число:

...
        elif replay.lower() == "y":
            print("As you wish!")

            # Tell the interpreter that we want to modify a variable from the global scope
            global a

            # Generate a new random number
            a = randint(0,20)

            return guess()

...

И, как говорится в заголовке, python не распознает заглавные буквы Y и N, и для этого потребуется только y и n

Вам следует изменить следующую строку:

        replay = input("Try again ?(Y/N)")

На:

        replay = input("Try again ?(Y/N)").lower()

В противном случае ваше следующее условие не будет выполнено, поскольку Y и N не в {"y", "n"}. Тем не менее, квадратные скобки на самом деле не имеют смысла, и было бы лучше просто сделать:

if replay not in "yn":

РЕДАКТИРОВАТЬ: Вместо подтверждения ответа дважды, просто найдите действительные ответы и затем запросите действительный, если он не был предоставлен:

replay = input("Try again ?(Y/N)").lower()
if replay == 'y':
    # replay...
elif replay = 'n'
    print("Thanks for playing! Bye now!.")
    break
else:
    print("Please enter Yes or No")

РЕДАКТИРОВАТЬ: Чтобы убедиться, что данный ввод является действительным числом, вы можете использовать блок try/except для перехвата ошибка:

try:
    user = int(input("Guess the number: \n"))
except ValueError:
    print('Not a valid number.')

Или вы можете убедиться, что данная строка является числом, используя str.isdigit:

user = input("Guess the number: \n")
if user.isdigit():
    user = int(user)
else:
    print('Not a valid number.')

Я бы лично go с try/except со второго в основном проверяет строку дважды (один раз через isdigit, затем другой, когда завершено приведение int).

...