
よろしくお願いします。
現在趣味でゲームを作っています。
普通の#ifdefの使い方は存じているのですが、以下のような場合どうすればいいのでしょうか。
ゲームにはイージーと、ノーマルで2種類のレベルが設定出来ます。
イージーの場合は、最初の定義から、ボスのショットである
boss_shot1()関数は上のイージー用の関数を通ります。
ノーマル設定の場合、
#define EASYを注釈にすることで、ノーマルの設定のboss_shot1();を通ります。
#define EASY
#ifdef EASY
void boss_shot1(){
//イージー用のショット
}
#else
void boss_shot1(){
//ノーマル用のショット
}
#endif
しかしこれでは、プログラム内でレベル設定をする事が出来ません。
注釈にしてコンパイルしたものと、#define EASYをそのままにしてコンパイルしたもの、2つの実行ファイルで
レベル分けをしないといけません。
うまくプログラム内でこの条件分岐が出来ないでしょうか?
内容の違う関数は関数名を変えて記述するしかないのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
普通動作中のプログラムの設定を変える場合に
プリプロセッサは使いません。
というより、使えません。
ゲームなどの難易度の変数、または引数を
つくり関数の中で普通のif文を使って処理を
分けるだけです。
typedef enum {
HAERD = 0,
NOMALE,
EASY,
}GAME_LEVEL;
/* ゲームの難易度を引数かグローバルにでも */
void boss_shot1( GAME_LEVEL lv ){
if ( lv == HAERD ){
//ハード用のショット
} else if ( lv == NOMALE ){
//ノーマル用のショット
} else {
//イージー用のショット
}
}
#今回は意味不明なレベルが渡されると全て
#EASYにしていますが特に意味はありません。
#(インデントは全て全角です)
やはりそうですよね。
ご回答ありがとう御座いました。
内容の違うショットは違う関数名にでもして分けようと思います。
ありがとうございました。
No.3
- 回答日時:
#ifや#ifdefは、デモバージョン/配布バージョン/デバックバージョンなどをコンパイル時にオプション指定で実行ファイルを作り分ける時などに使います。
敵やボスの強さを難易度分けするのは、やはり難易度を変数に入れて、その変数をif文やswitch文で条件分岐して、難易度別の処理を書くしかないですね。
敵の数や攻撃タイミングだけだったらレベル別のテーブル持つだけで簡単に処理出来ますが、攻撃モーションとかまで違うと専用のプログラムが必要になりますね。
No.2
- 回答日時:
普通はそういった要望には変数で場合わけでしょう
#ifdefでコードレベルで変える必要は無いと思います
int nGameLabel;
などと宣言しておいて
2つの場合わけなら
if ( nGameLavel == 1 ) {
// Normalレベルの処理
} else {
// Easyレベルの処理
}
といった具合になると思います
3個以上なら switchなどで処理したほうがすっきりするかもしれません
#ifdefは デバッグ時などはログデータを出力したい
OSの違いが吸収できないのでEXEを分けざるを得ない
UNICODEとMBCSで呼び出すAPI関数名の違いを吸収したい
などの場合に使います
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Windows 10 windowsの回復ドライブや復元ポイントを使用した場合の戻る位置を教えてください。 5 2023/08/19 14:52
- Excel(エクセル) エクセルを活用した受注表作成の中で関数・数式を教えてください。 3 2022/07/23 08:14
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Excel(エクセル) ワードのマクロについて教えてください。 1 2023/03/11 13:50
- Excel(エクセル) エクセルの数式で教えてください。 5 2023/02/10 15:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
音程とテンポを独立して変化さ...
-
小数点を含む数値かどうか判断...
-
Excel VBAにて、2GB超の点群デ...
-
あっち向いてホイのプログラム...
-
絶対パスの取得について
-
VB 電卓 メモリー機能
-
VBでの簡易電卓の作成(減算方...
-
符号付きにすべきか、符号なし...
-
C言語で、文字とか入力されなく...
-
SQLの速度をあげるには・・・
-
LINUX QT上でパソコンのシャッ...
-
win10で、正確な待ち時間の作り方
-
DoEvents関数って何?
-
Excel VBA での処理時間計測結...
-
テキスト処理の速度の速い言語
-
Macターミナルで実行中のプログ...
-
メッセージボックスのボタン名変更
-
フレームワーク「4.8.1」で、[S...
-
VBA kernel32 の意味
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
Excel VBAにて、2GB超の点群デ...
-
小数点を含む数値かどうか判断...
-
プログラム上のCPU稼働率低減に...
-
SQLの速度をあげるには・・・
-
DoEvents関数って何?
-
基本情報技術者試験詳しい方へ...
-
実行時のCPU使用率を増やしたい
-
VC++2010 GDIオブジェクトの解...
-
C言語 時刻差分の算出方法
-
ナップザック問題?をエクセル...
-
Excel(VBA)でSetTimer関数を使...
-
エクセルVBA 時間抜けの取得
-
VBでの簡易電卓の作成(減算方...
-
ノットイコールを教えて下さい
-
If Not c Is Nothing Then ~延...
-
Excel VBA データ削除の高速化
-
絶対パスの取得について
-
テキスト処理の速度の速い言語
おすすめ情報