C#if else,switch,bool

时间:2013-07-08 08:13:51

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

我试图编写一个简单的文本冒险代码。当我开始编写用户可以进入的方向时,我意识到用户可以放入“东北”,“西南”等等,所以我想我应该为他们制作案例。

我的问题是case5“north east”在我输入“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;


            }
        }
    }

}

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:4)

虽然已经回答了这个问题,但我会做出一个观察:

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

例如:

        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”)&amp;&amp; input.Contains(“east”)'将永远不会运行 - 因为它需要'input.Contains(“north')'为假(感谢'else')。调试和单步执行在这里有很多帮助。< / p>

所以是的,作为一个真正熟悉你的代码的程序员 - 永远不要写你需要的东西。在你的代码中,你有一堆布尔值,一堆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");

在可读性和可理解性方面也是如此,但涉及三分之一的线路,因此错误几率的三分之一。

答案 2 :(得分:2)

“东北”

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

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

答案 3 :(得分:1)

这是行不通的,因为你问“包含北方”是第一个问题吗?答案是肯定的。 你走到第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);