You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:19