C# while循环处理用户无效输入时运行逻辑不符合预期问题求助
问题原因
- 没有为是否继续游戏的输入添加循环校验逻辑:当前代码仅在用户第一次输入非法值时提示重输一次,未对第二次输入的内容做合法性校验就直接执行
continue回到外层游戏循环,若第二次输入的内容是Y就会直接开启新一局游戏,完全跳过了校验步骤。 - 非法输入判断条件存在逻辑错误:
answer != "Y" || answer != "N"是恒成立的表达式(任意值不可能同时等于Y和N),虽然当前因为前面已经判断了Y和N的合法情况,走到该分支的必然是非法输入,但该写法本身不严谨,正确的非法输入判断应为answer != "Y" && answer != "N"。 - 额外的代码问题:
random.Next(1, 2)的取值范围是左闭右开区间,实际永远只能返回1,导致猜数字答案固定失去游戏意义;且Random对象放在外层循环内重复创建,若循环间隔极短会生成重复的随机数,建议移到循环外初始化。
修正后的代码
using System; namespace first { class Program { static void Main(string[] args) { Console.WriteLine("Hi! What is your name"); string userName = Console.ReadLine(); Console.WriteLine("oh! you are:" + userName); Console.WriteLine("let play a game"); // Random移到循环外初始化 Random random = new Random(); string answer="Y"; while (answer == "Y") { // 随机数范围改为1-10,可按需调整,上界为开区间所以写11 int correntNumber = random.Next(1, 11); int guess = 0; Console.WriteLine("Guess a number between 1 and 10"); while (guess != correntNumber) { string userGuess = Console.ReadLine(); // 推荐用TryParse避免抛出异常 if(!int.TryParse(userGuess, out guess)) { Console.WriteLine("invalid input, please enter a number"); // 输入非法时直接提示重输,不执行后面的猜数判断 continue; } if (guess != correntNumber) { Console.WriteLine("try again!"); } } Console.WriteLine("Yes! correct"); // 循环校验是否继续的输入 while (true) { Console.WriteLine("Play again? (Y/N)"); answer = Console.ReadLine().ToUpper(); if (answer == "Y" || answer == "N") { break; } Console.WriteLine("please enter Y or N"); } if(answer == "N") { Console.WriteLine("bye"); return; } } } } }
核心修改说明
- 新增了是否继续输入的循环校验逻辑,只要用户输入不是Y/N就反复提示,直到拿到合法输入再继续后续流程,不会出现跳过校验直接开新局的问题。
- 优化了猜数字环节的输入校验逻辑,输入非数字时直接提示重输,不会输出多余的“try again”提示。
- 调整了随机数生成的逻辑,修复了答案固定的问题。
内容的提问来源于stack exchange,提问作者Abdulrahman Ali
相关产品推荐
相关产品推荐

