我试图编写一个简单的文本冒险代码。当我开始编写用户可以进入的方向时,我意识到用户可以放入“东北”,“西南”等等,所以我想我应该为他们制作案例。
我的问题是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;
}
}
}
}
答案 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);