【问题标题】:C# if else, switch, boolC# if else, switch, bool
【发布时间】:2023-04-09 05:50:02
【问题描述】:

我正在尝试编写一个简单的文本冒险。当我开始编写用户可以前往的方向时,我意识到用户可以输入“东北”、“西南”等,所以我认为我应该为他们制作案例。

我的问题是当我在命令行中输入“north east”时,case5“north east”没有运行。

class Branches

    {
        static void main(string[] args)
        {
            Branch2();
        }

        public static void Branch2()
        {
            Console.WriteLine("");
            Console.WriteLine("(North ,East ,South ,West)");
            string input = Console.ReadLine();
            bool case1 = input.Contains("north");
            bool case2 = input.Contains("east");
            bool case3 = input.Contains("south");
            bool case4 = input.Contains("west");
            bool case5 = input.Contains("north") && input.Contains("east");

            //Console.ReadLine(); 
            int CaseId;
            if (case1)
                CaseId = 1;
            else if (case2)
                CaseId = 2;
            else if (case3)
                CaseId = 3;
            else if (case4)
                CaseId = 4;
            else if (case5)
                CaseId = 5;

            else
                CaseId = 0;

            switch (CaseId)
            {
                case 1:
                    Console.WriteLine("");
                    Console.WriteLine("you head north");
                    break;

                case 2:
                    Console.WriteLine("");
                    Console.WriteLine("you head east");
                    break;

                case 3:
                    Console.WriteLine("");
                    Console.WriteLine("you head south");
                    break;

                case 4:
                    Console.WriteLine("");
                    Console.WriteLine("you head west");
                    break;

                case 5:
                    Console.WriteLine("");
                    Console.WriteLine("you head north east");
                    break;

                default:
                    Console.WriteLine("enter a valid direction");
                    break;


            }
        }
    }

}

【问题讨论】:

  • 您应该尝试使用调试模式和断点来诊断此类问题。

标签: c# if-statement boolean switch-statement


【解决方案1】:

因为输入包含北,所以首先执行 if 而不是搜索 else if,尝试反转 if 并将 case5 作为第一个 if :)

            if (case5)
                CaseId = 5;
            else if (case2)
                CaseId = 2;
            else if (case3)
                CaseId = 3;
            else if (case4)
                CaseId = 4;
            else if (case1)
                CaseId = 1;

【讨论】:

  • 我不会颠倒逻辑,而是简单地将最后一个语句移动到第一个 - 例如“如果 (case5) ...; 否则如果 (case1) ...; ...”。任何人都竖起大拇指。
【解决方案2】:

虽然已经回答了这个问题,但我要发表一个看法:

您的布尔值是不必要的,有助于隐藏问题。

例如:

        string input = Console.ReadLine();
        bool case1 = input.Contains("north");
        bool case2 = input.Contains("east");
        bool case3 = input.Contains("south");
        bool case4 = input.Contains("west");
        bool case5 = input.Contains("north") && input.Contains("east");

        int CaseId;
        if (case1)
            CaseId = 1;
        else if (case2)
            CaseId = 2;
        else if (case3)
            CaseId = 3;
        else if (case4)
            CaseId = 4;
        else if (case5)
            CaseId = 5;

和这个是一样的:

        string input = Console.ReadLine();
        int CaseId;

        if (input.Contains("north")) CaseId = 1;
        else if (input.Contains("east")) CaseId = 2;
        else if (input.Contains("south")) CaseId = 3;
        else if (input.Contains("west")) CaseId = 4;
        else if (input.Contains("north") 
                && input.Contains("east")) CaseId = 5;

这应该很明显,语句 'input.Contains("north") && input.Contains("east")' 将永远不会运行 - 因为它需要 'input.Contains("north')'是错误的(感谢“else”)。调试和单步执行在这里有很大帮助。

所以是的,作为一名程序员,你的代码确实要简洁——永远不要写超出你需要的东西。在您的代码中,您有一堆布尔值、一堆 if 和一个 switch 语句——所有这些都有效地完成了相同的工作。

我个人会这样写:

        string input = Console.ReadLine();

        if (input.Contains("north") && input.Contains("east")) 
            Console.WriteLine("\nyou head north east");
        else if (input.Contains("north")) 
            Console.WriteLine("\nyou head north");
        else if (input.Contains("east")) 
            Console.WriteLine("\nyou head east");
        else if (input.Contains("south")) 
            Console.WriteLine("\nyou head south");
        else if (input.Contains("west"))                    
            Console.WriteLine("\nyou head west");
        else 
            Console.WriteLine("enter a valid direction");

在可读性和可理解性方面是一样的,但涉及三分之一的行数,因此出错的可能性是三分之一。

【讨论】:

  • 谢谢,我是编码新手,但这很清楚。我真的很惊讶我的程序中有多少不必要的代码,我所做的有点像被黑掉了,但是像这样的东西可以帮助我进步。
  • 很高兴能提供帮助 :) 它不适用于这种特殊情况,但在走得太远之前,请确保您精通数组和循环 - 它们会极大地帮助您跟踪。
【解决方案3】:

“东北”

bool case1 = input.Contains("north"); //true
bool case5 = input.Contains("north") && input.Contains("east"); //true

if (case1)
      CaseId = 1;
else //Done moving on

【讨论】:

    【解决方案4】:

    因为第一个问题是“包含北”,所以它不能工作?答案是肯定的。 您只能进入第 1 步。您无法进入第 5 步。

    要进入第 5 步,您需要先询问。

    无论如何,代码中似乎还有更多问题。我不确定你想要达到什么目的,但看起来你无缘无故地把事情复杂化了。

    我会做类似以下的事情:

    List<string> eastWest = new List<string> {"east", "west"};
                var up = new List<string> {"north", "south"};
                var direction = Console.ReadLine();
                var upDirection = up.Find(direction.Contains);
                var sideDirection = eastWest.Find(direction.Contains);
                var result = upDirection != null ? upDirection + " " + sideDirection:sideDirection;
                Console.WriteLine("You are headed" + result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多