Не сбрасывается 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
).