-3

ゲームを実行するメイン while ループ内にスイッチがあります。別のケースに行くために、スイッチから抜け出そうとしています。以下の例は、それをよりよく説明しています。

int j = 0;
While(1){
switch(j){
case 0:  ....
        break;
case 1: 
      for( i =0; i > 100; i++){
       if(lives == 0)
        j = 2;
        break; //this is where I want to break out of my switch to go to case 2. But it         
               //breaks out of my for loop. I do not know how to get around this. Thank 
               //you!
       }
 case 2: //some stuff I want to do
}

}
4

8 に答える 8

1

さて、実際には正しい軌道に乗っていますが、前述のように、ループの状態を確認する必要があります。

int j = 0;
While(1){
switch(j){
case 0:  ....
    break;
case 1: 
  for( i =0; i < 100; i++){
    if(lives == 0){
        j = 2;
        break; // Break for
    }
  }
if(j != 2) break; // If no break in the switch's case, then continue to the next case
case 2: //some stuff I want to do
    break;
} //End Switch
} //End While
于 2013-03-28T19:37:16.407 に答える
1

次のようなステート マシンを構築します。

C# bool OnceMore = true;

string ProcessState = "Start"
while(OnceMore)
{
   OnceMore = False;
   switch(ProcessState)
   {
      case "Start" :
      {
     // do something
     ProcessState = "Check";
         OnceMore = True;
     break;
      }
      case "Check" :
      {
         // do check
         if( Check == "Ok")
         {
            ProcessState = "Close";
         }
         else // try again
         {
            ProcessState = "Start";
         }
         OnceMore = True;
         break;
      }
      case "Close" :
      {
         // do what you need to return to the caller
         break;
      }
   }
}
return
于 2013-04-06T13:32:26.023 に答える
1

for から抜け出し、ケース 2 に直接進みたい場合は、コードでまさにそれを行う必要があります。

于 2013-03-28T16:19:56.787 に答える
1

case 2のときだけ打ちたいと思いますlives == 0。もしそうなら、あなたbreak;{ }一緒にあなたを入れる必要がありますj = 2;- これはループを壊すだけlives == 0です . 次にbreak;、 の最後にa を配置するcase 0と、スイッチが終了し、 のためにスイッチを再入力して、while(1)を押しますcase 2:

そして、あなたのforループは適切にすべきではありfor(i = 0; i < 100; i++)ませんfor(i = 0; i > 100; i++)

int j = 0;
While(1){
  switch(j){
  case 0:  ....
    break;
  case 1: 
    for( i =0; i < 100; i++){
      if(lives == 0) {
        j = 2;
        break;
      }
    }
    break;
 case 2: //some stuff I want to do
  }
}
于 2013-03-28T16:38:17.407 に答える
0

次のケースをトリガーする条件を中括弧で囲みます

case 1: 
   for( i =0; i > 100; i++)
   {
       if(lives == 0)
       {
           j = 2;
           break; // This exits the for effectively jumping at the case break

       }
       // I suppose here you have other code to process 
       // that should not be executed if (lives == 0)
   }
   break;
于 2013-03-28T16:24:41.677 に答える
0

複数のブレーク可能なスコープから抜け出すことはできません。最も高いスコープからのみ抜け出すことができます。

これに対するずさんな「解決策」は、goto ジャンプを使用することです。

本当の解決策は、関数をより小さな論理バイト サイズの関数に分割することです。コードの品質とクリーン度のために、for ループはほぼ確実に独自の関数内にある必要があります。

bool doSomethingInALoopWithADescriptiveName(int &var)
{
    for(int i = 0; i < 100; i++)
    {
        if(lives_WhichShouldntBeGlobal == 0)
        {
            var = 2;
            return false;
        }
    }

    return true;
}

void myFuncWithADescriptiveName()
{
    int variableWithADescriptiveName = 0;
    while(true)
    {
        switch(j)
        {
            case 0:
            {
                //....
            } break;
            case 1:
            {
                bool continueLooping = doSomethingInALoopWithADescriptiveName(&variableWithADescriptiveName);
                if(!continueLooping)
                {
                    return;
                }
            } break;
            case 2:
            {
                //some stuff I want to do
            } break;
        }
    }
}

注:質問のタグ付けの問題のため、質問がどの言語について尋ねているのかわかりません。私の答えは多くの言語に適用できます (「シンプルでコンパクト、自己記述的でクリーンなコードを書く」と要約できます) が、私のコード例は疑似 C++ ですが、他の言語にも簡単に適用できます。

于 2013-03-28T16:21:54.637 に答える
0
switch(j){
case 0:  ....
    break test;
case 1: 
  for( i =0; i > 100; i++){
   if(lives == 0)
    j = 2;
    break; //this is where I want to break out of my switch to go to case 2. But it         
           //breaks out of my for loop. I do not know how to get around this. Thank 
           //you!
   }
break test;
case 2: //some stuff I want to do
 break test;
}


test://After switch.
于 2013-03-28T16:23:11.300 に答える
0

あなたの休憩は for ループから抜け出しています。そのため、ループが早期に終了したかどうかを確認するロジックを追加してから、もう一度 break を呼び出す必要があります。

次に、for(i = 0; i > 100; i++)は i が > 100になることはないため、決して実行されません。

for(int i = 0; i < 100; i++)
{
    if(lives == 0)
    {
        j = 2;
        quit = true;
        break; //Break out of the loop
    }
}
//Note, if this language is C, control will just fall through to case 2 anyway.
//If C#, you have to add a break at the end of this case regardless
if(quit == true)
{
    break; //Break out of switch
}
于 2013-03-28T16:33:32.253 に答える