2

この場合、他に何を使用すればよいかわかりませんでしたが、if ステートメントです。

私がやろうとしているのはstring direction;、Windows フォームから値を取得し、探している値があるかどうかを確認することです。次にturtleDir、方向を示す文字列値である があるかどうかを確認しturtleDirます。

問題は、すべての else if ステートメントを実行する場合に、else if ステートメントで発生turtleDirlookingleftます。私がやりたいのは、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、指示が完了した後、ブロックは常に終了します。最後に a を追加することで、文字列がこれらの値のいずれとも一致しない場合の動作を指定することもできますcase default:breakこれらの各ケースは、ステートメントで終了する必要があることを忘れないでください (またはreturn/throwでも、この場合は必要ないと思います)。

それでもすべてのケースが実行される場合、問題は別の場所にあります。メソッドにこのコードが含まれていて、eg で始まると呼び出される場合、メソッドturtleDir == "left"の連続する各呼び出しは、turtleDirすべてのケースが実行されturtleDirて最終的な値になるまで循環します"lookingUp"。したがって、制御フローを見て、このチェックを既に実行したかどうかを追跡してください。たぶん、経過時間を追跡turtleDirし、しばらくの間特定の状態にあった場合にのみ変更します(要件がわかりません)。

編集:Program.form.direction = ""すべてのcaseステートメントで設定する必要があります。そのため、コードが何度も実行されます。また、方向が入力されていない場合は、これもクリアします。

于 2012-06-01T06:45:14.607 に答える
0

ここで何か他のことが起こっています...

IF/ELSE-IFステートメントの1つのブランチのみが実行されます。読みやすさの理由から、SWITCHステートメントにリファクタリングすることをお勧めします。しかし、それがあなたの行動を変えるからではありません

このコードを見てください:

    if(0 == 0) { Console.WriteLine("Branch 1"); }
    else if(true==true) { Console.WriteLine("Branch 2"); }
    else if(false==false) { Console.WriteLine("Branch 3"); }

すべての条件が当てはまります。そして最初のものが実行されます。最初のものだけ。

このコードでは、次の2つだけが真です。if(0 == 2){Console.WriteLine( "Branch 1"); } else if(true == true){Console.WriteLine( "Branch 2"); } else if(false == false){Console.WriteLine( "Branch 3"); }

そして、2番目のものだけが実行されます。

条件が真の場合、一連のelse-ifがすべて実行されるわけではありません。

私の推測では、あなたはこれを本当に速くループしていて、次の反復はIFロジックに入り、次のブランチを実行していると思います。特定の状況に対してより役立つ回答を得るために、より多くのコードを投稿する必要があるかもしれません。

これを追跡する最良の方法であるIMHOは、IFロジックの開始にブレークポイントを設定し、コードを一度に1つずつ実行することです。1つの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 に答える
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

空のreturn;- ステートメントを使用できますが、メソッドもそのままにしておきます...

于 2012-06-01T06:42:42.303 に答える