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

问题描述

我正在尝试制作一个带有用户退出程序选项的猜测游戏,但是我无法使程序的“退出”部分按预期工作。

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”,则退出该程序。但是,如果我在键入quit之前猜出一个数字,程序将按照应有的方式通过if语句,但是当您尝试在认值之后退出时,“输入的数字太低。请重试”而不是退出程序按预期。

除try-except方法外,我不知道是否还有更好的方法来处理“退出”命令。

解决方法

圣贾格击败了我,问题确实在于,如果先前的输入大于或小于目标数字,则您仅要求再次输入。如果您在至少输入了一次数字之后输入了“ 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子句下的代码量,该数量仅视需要而定。

,

编辑:在行中

userGuess = int(input("Pick a number from 1 to 1000: "))

首先输入数字时,userGuess是您选择的数字。然后,您尝试输入'quit',但是类型转换整数会抛出错误,因为它不能执行int('quit')。这导致程序到达except:部分。但是,由于错误,您没有正确更改userGuess值,它仍然是您输入的最后一个数字。这就是if userGuess.lower() == 'quit': 条件从不评估为True的原因。

一个简单的解决方法是先获取输入,然后再转换为类型转换。

编辑:正如AMC指出的那样,以下部分是错误的。它没有考虑到某些Unicode字符也为 isnumeric 返回True,我错了。您可以参考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