C#石头剪刀布游戏无效输入提示功能失效问题求助
问题描述
我在学习C#时开发了一款石头剪刀布游戏,想在输入错误数据时触发对应的无效输入提示(英文"Invalid entry!",土耳其文"Yanlış veri girdiniz!"),但编写的相关代码始终无法生效,请求排查并修改。
问题原因与修复方案
核心问题
无效输入判断的位置错误:你将提示逻辑放在了电脑随机数的switch分支中,但随机数通过rnd.Next(1,4)生成,取值只能是1、2、3,default分支永远不会执行,自然不会触发无效提示。
修复步骤
- 获取用户输入并转大写后,先判断输入是否合法;
- 若输入不合法,直接提示错误并跳过后续的电脑出拳、胜负判断逻辑;
- 若输入合法,再执行电脑出拳、胜负计算流程;
- 额外优化:将
Random实例移到循环外,避免短时间多次生成相同随机数。
修改后的完整代码
namespace ROCK__PAPER__SCISSOR { internal class Program { static void Main(string[] args) { string inputPlayer, inputCPU; int randomint; bool playAgain = true; string language; // 仅初始化一次Random,避免短时间生成重复随机数 Random rnd = new Random(); Console.Write("CHOOSE LANGUAGE (TR/ENG): \nDİL SEÇ(TR/ENG): "); language = Console.ReadLine()?.ToUpper() ?? ""; while (language == "ENG") { while (playAgain) { int scoreCPU = 0; int scorePlayer = 0; while (scorePlayer < 3 && scoreCPU < 3) { Console.Write("Choose between ROCK, PAPER OR SCISSORS: "); inputPlayer = Console.ReadLine()?.ToUpper() ?? ""; // 先校验用户输入合法性 if (inputPlayer != "ROCK" && inputPlayer != "PAPER" && inputPlayer != "SCISSORS") { Console.WriteLine("Invalid entry!"); Console.WriteLine("\n\nSCORES:\tPLAYER:\t{0}\tCPU:\t{1}", scorePlayer, scoreCPU); continue; // 跳过后续逻辑,回到输入步骤 } randomint = rnd.Next(1, 4); switch (randomint) { case 1: inputCPU = "ROCK"; Console.WriteLine("Computer chose ROCK"); if (inputPlayer == "ROCK") { Console.WriteLine("DRAW!!\n\n"); } else if (inputPlayer == "PAPER") { Console.WriteLine("PLAYER WINS!!\n\n"); scorePlayer++; } else if (inputPlayer == "SCISSORS") { Console.WriteLine("CPU WINS!!\n\n"); scoreCPU++; } break; case 2: inputCPU = "PAPER"; Console.WriteLine("Computer chose PAPER"); if (inputPlayer == "PAPER") { Console.WriteLine("DRAW!!\n\n"); } else if (inputPlayer == "ROCK") { Console.WriteLine("CPU WINS!!\n\n"); scoreCPU++; } else if (inputPlayer == "SCISSORS") { Console.WriteLine("PLAYER WINS!!\n\n"); scorePlayer++; } break; case 3: inputCPU = "SCISSORS"; Console.WriteLine("Computer chose SCISSORS"); if (inputPlayer == "SCISSORS") { Console.WriteLine("DRAW!!\n\n"); } else if (inputPlayer == "ROCK") { Console.WriteLine("PLAYER WINS!!\n\n"); scorePlayer++; } else if (inputPlayer == "PAPER") { Console.WriteLine("CPU WINS!!\n\n"); scoreCPU++; } break; } Console.WriteLine("\n\nSCORES:\tPLAYER:\t{0}\tCPU:\t{1}", scorePlayer, scoreCPU); } if (scorePlayer == 3) { Console.WriteLine("PLAYER WINS!!"); } else if (scoreCPU == 3) { Console.WriteLine("CPU WINS!!"); } Console.Write("Do you wanna play again?(YES/NO): "); string loop1 = Console.ReadLine()?.ToUpper() ?? ""; if (loop1 == "YES") { playAgain = true; Console.Clear(); } else if (loop1 == "NO") { playAgain = false; } } } while (language == "TR") { while (playAgain) { int scoreCPU = 0; int scorePlayer = 0; while (scorePlayer < 3 && scoreCPU < 3) { Console.Write("TAŞ KAĞIT VE MAKASTAN BİRİNİ SEÇ: "); inputPlayer = Console.ReadLine()?.ToUpper() ?? ""; // 先校验用户输入合法性 if (inputPlayer != "TAŞ" && inputPlayer != "KAĞIT" && inputPlayer != "MAKAS") { Console.WriteLine("Yanlış veri girdiniz!"); Console.WriteLine("\n\nSKOR:\tSEN:\t{0}\tBİLGİSAYAR:\t{1}", scorePlayer, scoreCPU); continue; // 跳过后续逻辑,回到输入步骤 } randomint = rnd.Next(1, 4); switch (randomint) { case 1: inputCPU = "TAŞ"; Console.WriteLine("BİLGİSAYAR TAŞ SEÇTİ"); if (inputPlayer == "TAŞ") { Console.WriteLine("BERABERE!!\n\n"); } else if (inputPlayer == "KAĞIT") { Console.WriteLine("KAZANDIN!!\n\n"); scorePlayer++; } else if (inputPlayer == "MAKAS") { Console.WriteLine("KAYBETTİN!!\n\n"); scoreCPU++; } break; case 2: inputCPU = "KAĞIT"; Console.WriteLine("BİLGİSAYAR KAĞIT SEÇTİ"); if (inputPlayer == "KAĞIT") { Console.WriteLine("BERABERE!!\n\n"); } else if (inputPlayer == "TAŞ") { Console.WriteLine("KAYBETTİN!!\n\n"); scoreCPU++; } else if (inputPlayer == "MAKAS") { Console.WriteLine("KAZANDIN!!\n\n"); scorePlayer++; } break; case 3: inputCPU = "MAKAS"; Console.WriteLine("BİLGİSAYAR MAKAS SEÇTİ"); if (inputPlayer == "MAKAS") { Console.WriteLine("BERABERE!!\n\n"); } else if (inputPlayer == "TAŞ") { Console.WriteLine("KAZANDIN!!\n\n"); scorePlayer++; } else if (inputPlayer == "KAĞIT") { Console.WriteLine("KAYBETTİN!!\n\n"); scoreCPU++; } break; } Console.WriteLine("\n\nSKOR:\tSEN:\t{0}\tBİLGİSAYAR:\t{1}", scorePlayer, scoreCPU); } if (scorePlayer == 3) { Console.WriteLine("OYUNU KAZANDIN!!"); } else if (scoreCPU == 3) { Console.WriteLine("OYUNU KAYBETTİN!!"); } Console.Write("Tekrar oynamak ister misin?(EVET/HAYIR): "); string loop = Console.ReadLine()?.ToUpper() ?? ""; if (loop == "EVET") { playAgain = true; Console.Clear(); } else if (loop == "HAYIR") { playAgain = false; } } } } } }
额外优化说明
- 将
Random实例移到循环外,避免短时间内重复创建实例导致生成相同随机数; - 用
?? ""处理Console.ReadLine()返回null的情况,避免空引用异常; - 输入不合法时用
continue跳过后续逻辑,直接回到输入步骤,不影响当前分数统计。
内容的提问来源于stack exchange,提问作者Umut Yıldız
相关产品推荐
相关产品推荐

