C#猜数字游戏超范围输入时输出多余提示的逻辑Bug求助
C#猜数字游戏逻辑bug修复
问题现象
当前实现的猜数字游戏不符合单校验场景单提示的要求:
- 输入值大于100时,会同时输出「猜测值过高」和「需输入1-100之间数字」两条提示
- 现有逻辑未覆盖输入值小于1的范围校验场景
- 猜中数字时会额外触发「距离极近」的提示,存在逻辑矛盾
根因分析
- 判断分支无优先级、无互斥:所有判断均使用独立
if语句,只要满足条件就会依次执行,没有做分支阻断 - 范围校验顺序靠后:范围判断写在大小判断之后,由于
rd.Next(1,100)的返回值不包含上界100,实际生成随机数范围是1-99,大于100的输入天然满足「大于随机数」的条件,会先触发过高提示 - 分支结构错误:判断「猜小了」用
else if承接猜中判断,但判断「猜大了」又重新开了独立if,本身结构就不互斥 - 流程顺序错误:随机数生成放在用户输入之后,不符合游戏先确定目标数再让玩家猜测的基本逻辑
- 接近提示无前置限制:未排除猜中的场景,猜中时差值为0也会触发接近提示
修复后完整代码
// 游戏介绍 Console.WriteLine("猜数字游戏\n你需要猜测一个1-100之间的数字,请开始你的猜测\n请输入数字:"); // 先生成目标随机数,再读取用户输入 Random rd = new Random(); int rand_num = rd.Next(1, 101); // Next方法上界不包含在返回范围内,要取1-100需传入101作为上界 var str = Console.ReadLine(); int guess = Convert.ToInt32(str); // 最高优先级校验:输入范围是否合法,不合法直接输出范围提示,跳过后续所有判断 if (guess < 1 || guess > 100) { Console.WriteLine("需输入1-100之间数字"); } else { // 输入合法时才做猜数字相关判断,分支互斥 if (guess == rand_num) { Console.WriteLine("恭喜你,猜对了!"); } else if (guess < rand_num) { Console.WriteLine("猜测值过小,请猜更大的数字"); // 未猜中才判断距离 if (Math.Abs(guess - rand_num) <= 3) { Console.WriteLine("你已经猜的非常接近了!"); } } else // guess > rand_num { Console.WriteLine("猜测值过高,请猜更小的数字"); // 未猜中才判断距离 if (Math.Abs(guess - rand_num) <= 3) { Console.WriteLine("你已经猜的非常接近了!"); } } } // 程序结束提示 Console.WriteLine("程序结束");
修复要点说明
- 范围校验提至最前,不满足范围要求时直接输出提示,不执行后续游戏判断,从根源避免多提示问题
- 修正随机数生成逻辑,保证目标数范围确实是1-100
- 所有游戏内判断放在合法输入的分支内,用互斥的
if/else if/else结构实现猜中/猜小/猜大的判断,保证同一时间只会进入一个分支 - 接近提示仅在未猜中的分支内触发,避免猜中时出现矛盾提示
- 补全了输入小于1的范围校验逻辑
内容的提问来源于stack exchange,提问作者Kent Karlsson
相关产品推荐
相关产品推荐

