2

我不知道在这种情况下还能使用什么,而是使用 if 语句。

我想做的是string direction;从 Windows 窗体中获取一个值并检查它是否具有我正在寻找的值。然后检查turtleDirwhich 是否是指示方向的字符串值turtleDir

问题出现在 else if 语句中,当turtleDirlookingleft执行所有 else if 语句时。我想要它做的是在它完成 else 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";   
   }
}
4

4 回答 4

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:您还可以通过在末尾添加 a 来指定当字符串与这些值都不匹配时要执行的操作。请记住,这些案例中的每一个都需要由一个break语句终止(或return/throw但我认为您在这种情况下不需要这些)。

如果仍然执行每个案例,则您的问题出在其他地方。如果一个方法包含此代码并以 eg 开头被turtleDir == "left"调用,则该方法的每次连续调用都将turtleDir循环,直到每个案例都已执行并turtleDir以最终值结束"lookingUp"。因此,请查看您的控制流,并可能跟踪您是否已经执行了此检查。也许跟踪经过的时间并turtleDir仅在它处于特定状态一段时间后进行更改(我不知道您的要求)。

编辑:您应该Program.form.direction = ""在每个case语句中设置。这就是为什么您的代码会一遍又一遍地执行。另外,如果没有输入方向,也要清除它。

于 2012-06-01T06:45:14.607 回答
0

你可以使用一个空的return;- 声明,但你也离开了你的方法......

于 2012-06-01T06:42:42.303 回答
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;
}
于 2012-06-01T06:46:26.467 回答
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 逻辑并执行下一个分支。您可能需要发布更多代码,以便针对您的特定情况获得更多有用的答案。

恕我直言,追踪这一点的最佳方法是在 IF 逻辑的开头放置一个断点,并一次执行一个单步执行代码。您应该看到它只进入一个 ELSE-IF 分支并退出,并且您可以看到它是否/为什么重新进入。

最后,SWITCH 语句也不允许您隐式执行多个分支。

    switch(test)
    {
        case "one":
            Console.WriteLine("Branch 1");
        case "two":
            Console.WriteLine("Branch 2");
    }

那甚至不会编译。我相信在 C/C++ 中,除非您明确添加了 break,否则您可能会遇到 case 语句;或类似的控制语句。在 C# 中,情况并非如此。

于 2012-06-01T07:34:10.200 回答