我不知道在这种情况下还有什么用,但是if语句。
我要做的是从Windows表单中获取值string direction;
并检查它是否具有我要查找的值。然后检查turtleDir
是否是指示方向turtleDir
的字符串值。
问题来自于else if语句,当turtleDir
为lookingleft
时,它会执行所有其他if语句。我想要它做的是在它完成其他if语句后需要停止并等待下一个命令。没有经过所有的陈述。
有人可以告诉我如何解决它以及我做错了什么?
以下是代码:
else if ( Program.form.direction == "right" )
{
if ( turtleDir == "left" )
{
angle = -1.6f;
turtleDir = "lookingLeft";
Program.form.direction = "";
}
else if ( turtleDir == "lookingLeft" )
{
angle = 3.15f;
turtleDir = "lookingDown";
}
else if ( turtleDir == "lookingDown" )
{
angle = 1.6f;
turtleDir = "lookingRight";
}
else if ( turtleDir == "lookingRight" )
{
angle = 0.0f;
turtleDir = "lookingUp";
}
}
答案 0 :(得分:6)
您也可以对字符串使用switch
语句:
switch (turtleDir) {
case "left":
angle = -1.6f;
turtleDir = "lookingLeft";
Program.form.direction = "";
break;
case "lookingLeft":
angle = 3.15f;
turtleDir = "lookingDown";
break;
// other cases
}
这样,在您的指示完成后,switch
块始终会退出。您还可以通过在末尾添加case default:
来指定当字符串与这些值都不匹配时要执行的操作。请记住,每个案例都需要通过break
语句(或return
/ throw
来终止,但在这种情况下我认为您不需要这些语句)。
如果仍然执行所有案例,则问题出在其他地方。如果一个方法包含这个代码并且从例如turtleDir == "left"
,方法的每次连续调用都会让turtleDir
循环,直到每个案例都被执行,turtleDir
最终得到最终值"lookingUp"
。因此,请查看您的控制流程,并可能跟踪您是否已执行此检查。也许跟踪经过的时间并改变turtleDir
只有当它已经处于特定状态一段时间(我不知道你的要求)时。
编辑:您应该在每个Program.form.direction = ""
语句中设置case
。这就是你的代码一次又一次地被执行的原因。此外,如果没有输入方向,也要清除它。
答案 1 :(得分:0)
你可以使用一个空的return;
- 语句,但是你也可以保留你的方法......
答案 2 :(得分:0)
使用开关
switch (turtleDir)
{
case "left":
angle = -1.6f;
turtleDir = "lookingLeft";
Program.form.direction = "";
break;
case "lookingLeft":
angle = 3.15f;
turtleDir = "lookingDown";
break;
case "lookingDown":
angle = 1.6f;
turtleDir = "lookingRight";
break;
case "lookingRight":
angle = 0.0f;
turtleDir = "lookingUp";
break;
default:
// Optional, but place any actions if non of the above is matched
break;
}
答案 3 :(得分:0)
这里有别的东西 ......
只会执行IF / ELSE-IF语句的一个分支。出于可读性原因,您可能希望重构SWITCH语句;但不是因为它会改变你的行为。
看看这段代码:
if(0 == 0) { Console.WriteLine("Branch 1"); }
else if(true==true) { Console.WriteLine("Branch 2"); }
else if(false==false) { Console.WriteLine("Branch 3"); }
所有条件都是正确的。第一个执行。只有第一个。
在此代码中 - 只有后两个是真的: if(0 == 2){Console.WriteLine(“Branch 1”); } else if(true == true){Console.WriteLine(“Branch 2”); } else if(false == false){Console.WriteLine(“Branch 3”); }
只有第二个执行。
如果条件为真,则一系列else-if不会全部执行。
我的猜测是你正在快速地循环这个或者下一个迭代进入IF逻辑并执行下一个分支。您可能需要发布更多代码,以便为您的特定情况获得更有用的答案。
跟踪此问题的最佳方法是IMHO,它只是在IF逻辑的开头放置一个断点,并逐步执行一次代码。您应该看到它只进入一个ELSE-IF分支并退出,您可以看到它是否/为什么重新进入。
最后,SWITCH语句不允许您隐式执行多个分支。
switch(test)
{
case "one":
Console.WriteLine("Branch 1");
case "two":
Console.WriteLine("Branch 2");
}
那甚至都不会编译。我相信C / C ++你可以通过case语句来解决,除非你明确添加了break;或类似的控制声明。在C#中并非如此。