You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#石头剪刀布游戏无效输入提示功能失效问题求助

问题描述

我在学习C#时开发了一款石头剪刀布游戏,想在输入错误数据时触发对应的无效输入提示(英文"Invalid entry!",土耳其文"Yanlış veri girdiniz!"),但编写的相关代码始终无法生效,请求排查并修改。

问题原因与修复方案

核心问题

无效输入判断的位置错误:你将提示逻辑放在了电脑随机数的switch分支中,但随机数通过rnd.Next(1,4)生成,取值只能是1、2、3,default分支永远不会执行,自然不会触发无效提示。

修复步骤

  1. 获取用户输入并转大写后,先判断输入是否合法;
  2. 若输入不合法,直接提示错误并跳过后续的电脑出拳、胜负判断逻辑;
  3. 若输入合法,再执行电脑出拳、胜负计算流程;
  4. 额外优化:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:45:52