7

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

我的问题是当我在命令行中输入“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;


            }
        }
    }

}
4

4 回答 4

13

因为输入包含北所以首先执行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;
于 2013-07-08T08:15:53.910 回答
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") && 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");

它在可读性和可理解性方面是一样的,但涉及三分之一的行,因此有三分之一的错误机会。

于 2013-07-08T08:28:04.470 回答
2

“东北”

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

if (case1)
      CaseId = 1;
else //Done moving on
于 2013-07-08T08:17:09.400 回答
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);
于 2013-07-08T08:17:46.857 回答