带有可选退出命令的数字猜谜游戏

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 子句下的代码量,它只是必要的代码量。