こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}


どなたかよろしくお願いします><

投稿日時 - 2006-10-21 03:28:41

QNo.2486716

困ってます

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

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:

投稿日時 - 2006-10-21 19:00:45

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

アクションゲーかシューティングゲーをお作りですか?
質問者のソースだけで考慮した場合、処理的な事を考えたら#No1さんの回答が最良かと思いますが、素直にif文でいいんじゃないでしょうか?

そもそも汎用性を考えるのなら、テーブル化やモジュール化するなりしてコンパクトにしたほうがいいですよ。

ただ汚くてもずらずらと並べたほうが処理が早い場合もありますが、
あまり無駄な処理はしないように最適化した方が良いです。

これだと質問の回答になっていませんね
構造体のメンバーに例外フラグ立てて、例外処理用のモジュールと通常処理用のモジュールに分けたらどうでしょうか?

投稿日時 - 2006-10-21 18:52:38

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のように、試験方法を根本から見直す方がいいかもしれません。

※ 美しいアルゴリズムは美しいコーディングになります。

投稿日時 - 2006-10-21 07:50:19

ANo.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++;
}

投稿日時 - 2006-10-21 04:49:02

ANo.1

case 50:
enemy[i].pattern=0;
goto comm;

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

投稿日時 - 2006-10-21 03:42:29

あなたにオススメの質問