C#实现石头剪刀布游戏时陷入无限循环的问题求助
兄弟,我一眼就看到你代码里的几个小问题,正是它们导致了无限循环,咱们一个个捋清楚:
1. 最关键的问题:ToUpper()没有赋值,输入验证永远不通过
C#里的字符串是不可变类型,调用player.ToUpper()的时候,它不会直接修改原来的player变量,而是返回一个新的大写字符串。你现在只写了player.ToUpper();,等于白调用,原player还是你输入的小写/混合大小写,所以内层循环的判断条件player != "ROCK" && player != "PAPER" && player != "SCISSORS"永远为真,自然会一直让你输入,陷入死循环。
解决方法很简单,把这行改成:
player = player.ToUpper();
每次输入后都把大写后的结果赋值回player,这样判断的时候就能匹配上了。
2. 外层循环没有终止条件
你初始化了playagain = true,但整个while(playagain)循环里完全没修改过这个变量的值!哪怕你正常玩完一局,循环也会一直重复下去。你得在每局结束后问问用户要不要继续,然后更新playagain的值,比如加这段代码在switch结束后:
Console.WriteLine("要不要再来一局?(输入Y继续,其他退出)"); string continueInput = Console.ReadLine().ToUpper(); playagain = continueInput == "Y";
3. 电脑的选择只生成了一次
你把int computer = random.Next(1,4);写在了外层循环外面,意思是整个程序运行期间,电脑只会选一次石头/剪刀/布,每局都用同一个选择,这显然不符合游戏逻辑。得把这行移到while(playagain)循环的内部,每局开始都重新生成一个随机数。
4. 输入逻辑的位置不合理
你现在第一次输入是在循环外面,之后进入外层循环才做验证,其实应该把输入+验证的逻辑都放到外层循环内部,这样每局开始都让用户重新输入,体验更合理。
最后给你修改后的完整代码参考:
using System; Random random = new Random(); bool playagain = true; string player = ""; while (playagain) { // 每局重新生成电脑的选择 int computer = random.Next(1, 4); // 输入验证:直到用户输入正确的选项 Console.WriteLine("Enter, ROCK,PAPER,SCISSORS : "); player = Console.ReadLine(); player = player.ToUpper(); while (player != "ROCK" && player != "PAPER" && player != "SCISSORS") { Console.WriteLine("输入有误,请重新输入ROCK、PAPER或SCISSORS : "); player = Console.ReadLine(); player = player.ToUpper(); } switch (computer) { case 1:// computer = rock if (player.Equals("ROCK")) { Console.WriteLine("Computer : Rock"); Console.WriteLine("It's a tie !"); } else if (player.Equals("PAPER")) { Console.WriteLine("Computer : ROCK"); Console.WriteLine("You lose !"); } else { Console.WriteLine("Computer : SCISSORS"); Console.WriteLine("You win !"); } break; case 2:// computer = paper if (player.Equals("ROCK")) { Console.WriteLine("Computer : PAPER"); Console.WriteLine("You lose !"); } else if (player.Equals("PAPER")) { Console.WriteLine("Computer : PAPER"); Console.WriteLine("It's a tie !"); } else// player = scissors { Console.WriteLine("Computer : PAPER"); Console.WriteLine("You win !"); } break; case 3: // computer = scissors if (player.Equals("ROCK")) { Console.WriteLine("Computer : SCISSORS"); Console.WriteLine("You win !"); } else if (player.Equals("PAPER")) { Console.WriteLine("Computer : SCISSORS"); Console.WriteLine("You lose !"); } else // player = scissors { Console.WriteLine("Computer : SCISSORS"); Console.WriteLine("It's a tie !"); } break; } // 询问是否继续游戏 Console.WriteLine("想再玩一局吗?(Y/N)"); string response = Console.ReadLine()?.ToUpper() ?? "N"; playagain = response == "Y"; }
另外你说把输入提示移到主循环外没用,那是因为核心问题是ToUpper()没赋值,不管提示放哪里,只要输入的字符串没转成大写,验证就永远通不过,自然还是无限循环啦。
备注:内容来源于stack exchange,提问作者Indective

