• ベストアンサー

switch文を教えてください。

以下のスイッチ文はcounterが特定の時にある値を代入する文ですが、 マッチした時全部同じ処理をしてしまいますよね。 case 50: の時だけ enemy[i].pattern=2; ではなく、 enemy[i].pattern=0; にしたいんです。 どうすればいいでしょうか。 やはりif文を使うしかないのでしょうか? これだけが実現できるとりあえずの処理ではなくて、これからドンドンcase文が増えていくものとして汎用性の高い書き方にしたいです。 switch(counter){   case 50:   case 350:   case 650:   case 950:   case 1250:   case 1550:   case 1850:   case 2150:     enemy[i].pattern=2; //どういう軌道を描くか     enemy[i].flag=1; //出現フラグを立てる     enemy[i].counter=0;//カウンター初期化         enemy[i].size=0.5f;//敵の大きさ     enemy[i].range=10.0f//範囲     enemy[i].x=210.0; //xの初期座標     enemy[i].y=-10.0; //yの初期座標     break;   default:     break; } どなたかよろしくお願いします><

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

switch文のなかでif文を使うのはどうでしょうか。 switch(counter){   case 50:   case 350:   case 650:   case 950:   case 1250:   case 1550:   case 1850:   case 2150:     enemy[i].pattern=2; //どういう軌道を描くか     if (counter==50) enemy[i].pattern=0; //50の場合の例外処理     enemy[i].flag=1; //出現フラグを立てる     enemy[i].counter=0;//カウンター初期化         enemy[i].size=0.5f;//敵の大きさ     enemy[i].range=10.0f//範囲     enemy[i].x=210.0; //xの初期座標     enemy[i].y=-10.0; //yの初期座標     break;   default:

その他の回答 (4)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.4

アクションゲーかシューティングゲーをお作りですか? 質問者のソースだけで考慮した場合、処理的な事を考えたら#No1さんの回答が最良かと思いますが、素直にif文でいいんじゃないでしょうか? そもそも汎用性を考えるのなら、テーブル化やモジュール化するなりしてコンパクトにしたほうがいいですよ。 ただ汚くてもずらずらと並べたほうが処理が早い場合もありますが、 あまり無駄な処理はしないように最適化した方が良いです。 これだと質問の回答になっていませんね 構造体のメンバーに例外フラグ立てて、例外処理用のモジュールと通常処理用のモジュールに分けたらどうでしょうか?

回答No.3

switch(counter){   case 350:   case 650:   case 950:   case 1250:   case 1550:   case 1850:   case 2150:     enemy[i].pattern=2; //どういう軌道を描くか ← ※ここ   case 50:     enemy[i].pattern=0; //どういう軌道を描くか ← ※ここ     enemy[i].flag=1; //出現フラグを立てる     enemy[i].counter=0;//カウンター初期化         enemy[i].size=0.5f;//敵の大きさ     enemy[i].range=10.0f//範囲     enemy[i].x=210.0; //xの初期座標     enemy[i].y=-10.0; //yの初期座標     break; // default: //   break; } これでどうでしょう? 50の時だけ2回代入してるから、無駄といえば無駄だけど。(コンパイラの最適化に期待!!) 汎用性は疑問ですね。 その他、共通部分である // ここから     enemy[i].flag=1; //出現フラグを立てる     enemy[i].counter=0;//カウンター初期化         enemy[i].size=0.5f;//敵の大きさ     enemy[i].range=10.0f//範囲     enemy[i].x=210.0; //xの初期座標     enemy[i].y=-10.0; //yの初期座標 // ここまで を関数化してしまう。 #2のように、試験方法を根本から見直す方がいいかもしれません。 ※ 美しいアルゴリズムは美しいコーディングになります。

noname#39970
noname#39970
回答No.2

この場合、switchではないhittestの方がいいかも? 原始的な手法だけ書いてみる int hittest_n[200] = { 50,350,650,950,1250,1550,1850,2150,-1 }; int hittest_p[200]; int cx = 0; while (hittest_n[cx] > 0) hittest_p[cx++] = 2; //ただの初期化 hittest_p[0] = 0; //例外だけ書き換える //…………… cx = 0; while (hittest_n[cx] > 0) {  if(counter == hittest_n[cx])  {   enemy[i].pattern=hittest_p[cx];   enemy[i].flag=1;   enemy[i].counter=0;   enemy[i].size=0.5f;   enemy[i].range=10.0f;   enemy[i].x=210.0;   enemy[i].y=-10.0;   break;  }  cx++; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

case 50: enemy[i].pattern=0; goto comm; … case 2150:  enemy[i].pattern=2; //どういう軌道を描くか comm:

関連するQ&A