带有可选退出命令的数字猜谜游戏
Number guessing game with optional quit command
我正在尝试制作一款猜谜游戏,用户可以选择退出该程序,但我无法让该程序的 'quit' 部分按预期运行。
from random import randint
userGuess = input("Pick a number from 1 to 1000: ")
guess = randint(1, 1000)
while userGuess != guess:
try:
userGuess = int(userGuess)
if userGuess > guess:
print("The number you entered is higer than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
elif userGuess < guess:
print("The number you entered is lower than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
else:
print("You guessed it!")
break
except (TypeError, ValueError):
userGuess = str(userGuess)
if userGuess.lower() == 'quit':
print("Quitting....")
break
每当我运行这个程序时,如果我在游戏开始时输入'quit',它就会退出程序。但是,如果我在退出之前猜到了一个数字,程序会像它应该的那样通过 if 语句,但是当你在它默认后尝试退出时,“输入的数字太低。再试一次”而不是退出程序符合预期。
我不知道除了 try-except 方法之外是否还有更好的方法来处理 'quit' 命令。
编辑:行
userGuess = int(input("Pick a number from 1 to 1000: "))
当您首先输入一个数字时,您的 userGuess 就是您选择的数字。然后您尝试输入 'quit' ,但是类型转换整数会抛出错误,因为它不能输入 int('quit')
。这导致程序到达 except:
部分。但是,由于错误,您没有正确更改 userGuess 值,它仍然是您最后输入的数字。这就是 if userGuess.lower() == 'quit':
条件永远不会计算为 True 的原因。
一个简单的解决方法是先获取输入,然后尝试进行类型转换。
编辑: 正如 AMC 指出的,以下部分是错误的。它没有考虑到一些 unicode 字符也 return True for isnumeric,我错了。您可以参考 How can I check if a string represents an int, without using try/except? 了解在没有 try/except.
的情况下执行此操作的方法
您可以使用 isnumeric 函数来检查输入是整数还是字符串。
user_input = input()
if user_input.isnumeric():
#Do something
else:
#Do something else
saint-jaeger 先发制人,问题确实是如果之前的输入大于或小于目标数字,你只会再次要求输入。如果您在之前至少输入过一次数字后输入 'quit',则 userGuess
仍包含之前输入的数字。
您的代码可以重新组织和简化,这应该更容易避免这些类型的问题:
from random import randint
target = randint(1, 1000)
while True:
user_input = input('Enter your guess (between 1 and 1000), or "quit" to quit: ')
if user_input.casefold() == 'quit':
print('Quitting.')
break
try:
user_guess = int(user_input)
except ValueError:
print(f'Invalid input: {user_input}. Please try again.')
continue
if user_guess > target:
print('Your guess is bigger than the number, try again.')
elif user_guess < target:
print('Your guess is smaller than the number, try again.')
else:
print(f'You guessed correctly, the number was {target}')
break
注意 try
子句下的代码量,它只是必要的代码量。
我正在尝试制作一款猜谜游戏,用户可以选择退出该程序,但我无法让该程序的 'quit' 部分按预期运行。
from random import randint
userGuess = input("Pick a number from 1 to 1000: ")
guess = randint(1, 1000)
while userGuess != guess:
try:
userGuess = int(userGuess)
if userGuess > guess:
print("The number you entered is higer than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
elif userGuess < guess:
print("The number you entered is lower than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
else:
print("You guessed it!")
break
except (TypeError, ValueError):
userGuess = str(userGuess)
if userGuess.lower() == 'quit':
print("Quitting....")
break
每当我运行这个程序时,如果我在游戏开始时输入'quit',它就会退出程序。但是,如果我在退出之前猜到了一个数字,程序会像它应该的那样通过 if 语句,但是当你在它默认后尝试退出时,“输入的数字太低。再试一次”而不是退出程序符合预期。
我不知道除了 try-except 方法之外是否还有更好的方法来处理 'quit' 命令。
编辑:行
userGuess = int(input("Pick a number from 1 to 1000: "))
当您首先输入一个数字时,您的 userGuess 就是您选择的数字。然后您尝试输入 'quit' ,但是类型转换整数会抛出错误,因为它不能输入 int('quit')
。这导致程序到达 except:
部分。但是,由于错误,您没有正确更改 userGuess 值,它仍然是您最后输入的数字。这就是 if userGuess.lower() == 'quit':
条件永远不会计算为 True 的原因。
一个简单的解决方法是先获取输入,然后尝试进行类型转换。
编辑: 正如 AMC 指出的,以下部分是错误的。它没有考虑到一些 unicode 字符也 return True for isnumeric,我错了。您可以参考 How can I check if a string represents an int, without using try/except? 了解在没有 try/except.
的情况下执行此操作的方法您可以使用 isnumeric 函数来检查输入是整数还是字符串。
user_input = input()
if user_input.isnumeric():
#Do something
else:
#Do something else
saint-jaeger 先发制人,问题确实是如果之前的输入大于或小于目标数字,你只会再次要求输入。如果您在之前至少输入过一次数字后输入 'quit',则 userGuess
仍包含之前输入的数字。
您的代码可以重新组织和简化,这应该更容易避免这些类型的问题:
from random import randint
target = randint(1, 1000)
while True:
user_input = input('Enter your guess (between 1 and 1000), or "quit" to quit: ')
if user_input.casefold() == 'quit':
print('Quitting.')
break
try:
user_guess = int(user_input)
except ValueError:
print(f'Invalid input: {user_input}. Please try again.')
continue
if user_guess > target:
print('Your guess is bigger than the number, try again.')
elif user_guess < target:
print('Your guess is smaller than the number, try again.')
else:
print(f'You guessed correctly, the number was {target}')
break
注意 try
子句下的代码量,它只是必要的代码量。