Python用户输入验证排错:猜数字游戏范围判断异常求助
解决你的数字猜测游戏输入验证问题
嘿,我看到你的问题了!咱们来一步步拆解代码里的问题,很快就能搞定这个输入验证的bug~
问题分析
你的代码主要有三个核心问题,导致验证逻辑一直报错:
- 类型不匹配错误:你在
try块里把用户输入转成了整数,但没保存这个转换后的值!后面判断uInput not in range(1, 100)时,用的还是原始的字符串输入(比如用户输入"50"是字符串,而range里的是整数,字符串永远不会出现在整数的range集合里,所以这个判断永远为真,导致一直提示不在范围内)。 - Range范围错误:Python的
range是左闭右开的,range(1, 100)实际只包含1到99的整数,如果你要覆盖1到100的范围,得写成range(1, 101)。 - 函数返回值不完整:当输入不是数字或者数字不在范围内时,你的函数没有明确返回
False,默认会返回None,这会让主循环里的判断逻辑出现问题。
修正后的代码
from random import randint as rInt game = {"winNumber": rInt(1,100), "guessedNumber": 0, "tries": 8, "triesLeft": 8} def checkInput(uInput): """Checks user Inputs if they are valid numbers. Then a second check if the number is in between 1 and 100. Returns TRUE if successfull""" try: # 保存转换后的整数值,避免类型不匹配 num = int(uInput) except ValueError: print("This is not a number!") # 非数字输入明确返回False return False else: # 用转换后的整数判断范围,同时修正range到101以包含100 if num not in range(1, 101): print("With this number you will definitely lose the game, because it is not between 1 and 100") # 不在范围内明确返回False return False else: game["guessedNumber"] = num return True while game["triesLeft"] > 0: riskyInput = input("Please enter a number between 1 and 100: ") if checkInput(riskyInput): print(f'The Validator worked. The Player guessed number is: {game["guessedNumber"]}') # 验证通过后减少剩余次数,避免无限循环 game["triesLeft"] -= 1 # 补充核心游戏逻辑:判断猜的数字是否正确 if game["guessedNumber"] == game["winNumber"]: print(f"Congratulations! You guessed the number {game['winNumber']} correctly!") break elif game["guessedNumber"] > game["winNumber"]: print("Too high! Try a smaller number.") else: print("Too low! Try a larger number.") else: print("Something has gone wrong with the validation. We try again") continue # 循环结束后如果没猜对,显示正确答案 if game["triesLeft"] == 0: print(f"Game over! The correct number was {game['winNumber']}.")
关键修改说明
我还额外补充了核心游戏逻辑,让你的代码可以完整运行:
- 在
try块中新增num = int(uInput),将转换后的整数保存下来,后续所有判断都使用这个整数变量,彻底解决类型不匹配的问题。 - 将
range(1, 100)修改为range(1, 101),确保100也被包含在有效范围内。 - 在
except分支和范围不合法的分支中添加return False,让函数始终返回布尔值,主循环的判断逻辑更可靠。 - 验证通过后添加
game["triesLeft"] -= 1,避免无限循环。 - 补充了猜数字的核心逻辑:判断猜的数字是高了、低了还是猜对了,游戏结束时显示正确答案。
内容的提问来源于stack exchange,提问作者user3797760
相关产品推荐
相关产品推荐

