Python猜数字游戏输入l/h时猜测值不符合预期问题排查
猜数字游戏逻辑异常排查
问题描述
实现的计算机自动猜数字小游戏预期逻辑:
- 输入
l:代表当前猜测值过低,后续所有猜测值需始终高于本次猜测值 - 输入
h:代表当前猜测值过高,后续所有猜测值需始终低于本次猜测值 - 输入
c:代表猜测正确,程序结束
实际运行异常:输入l后程序偶现比上一次猜测值更低的结果,输入h时也存在同类反向猜测的异常。
原问题代码如下:
def computer_guess(x): low = 1 high = x feedback = "" while feedback != "c": if low != high: guess = random.randint(low, high) else: guess = low feedback = input(f"Is {guess} too High (H), too Low (L), or correct (C): ".lower()) if feedback == "h": high = guess - 1 elif feedback == "l": low = low + 1 print(f"Yeyyy, {guess} is the correct answer!!!") computer_guess(100)
根因分析
代码共存在2处直接导致异常的逻辑错误,另有1处运行必现的缺漏:
- 低反馈的边界更新逻辑错误
收到l反馈(当前猜测值过低)时,原代码执行low = low + 1,仅在原有下界基础上加1,完全没有参考本次的猜测值guess。正确逻辑应该是将搜索区间的下界调整为guess + 1,才能保证后续猜测值不会低于本次结果。原逻辑下搜索下界远低于本次猜测值,随机取值时自然会生成更小的数。 - 大小写转换位置错误
原代码中.lower()被写在input()的提示字符串参数上,仅会把提示文本转为全小写,根本没有对用户输入的内容做小写归一化。如果用户按照提示输入大写的H/L/C,代码中的分支判断完全无法命中,高低边界不会做任何更新,程序会一直在初始的[1, x]区间内随机取值,必然出现反向猜测的异常。 - 缺省模块导入
代码使用了random.randint()但未导入random模块,直接运行会触发名称错误。
修正后完整代码
import random def computer_guess(x): low = 1 high = x feedback = "" while feedback != "c": if low != high: guess = random.randint(low, high) else: guess = low # 修正:对用户输入内容做小写转换 feedback = input(f"Is {guess} too High (H), too Low (L), or correct (C): ").lower() if feedback == "h": high = guess - 1 elif feedback == "l": # 修正:低反馈时下界更新为当前猜测值+1 low = guess + 1 print(f"Yeyyy, {guess} is the correct answer!!!") computer_guess(100)
内容的提问来源于stack exchange,提问作者lyapore
相关产品推荐
相关产品推荐

