C++プログラミング入門(2) // 前回のまとめと条件分岐の考察

【前回のまとめ】

ゲームとは入力を受け取って,それを反映させ,結果を表示する処理の繰り返しである.
イメージは, while(1){ 入力; 反映; 表示; if(クリア){ break; } }

(チェック)
・文字列定数の途中での改行
⇒行末に"\"を付ける

・グローバル変数の命名規則
⇒接頭辞としてgをつける+キャメル記法で読みやすく

・constの使い方
⇒変更する予定のないものには極力付ける

・列挙型のメリット
⇒未定義の値を許容しない,デバッグ時列挙型の名前で見られる.
なお,列挙型の名前は大文字で.

・メモリの解放
⇒delete と ポインタに0代入

・1次元配列を2次元的に扱う
⇒ state[y*width + x] : 幅widthの2次元配列における(x,y)成分にアクセス.

・移動は差分で
⇒ 現在地 + 移動幅 で記述するとプログラムが簡潔に書ける.

・計算で求まる情報は極力保存しない.矛盾が出ると厄介だから

・キャラの移動時にはステージ内かどうかを先に確認

・三項演算子
⇒ a = b ? c : d (bがtrueならa=c; bがfalseならa=d;)


【条件分岐における思考過程】
キャラクターが動作するときのupdate関数では,定義されない動作が無いように,MECEになるように網羅的に条件分岐を考える.

今回は,列挙型のObjで定義された
SPACE,WALL,GOAL,MAN,MAN_ON_GOAL,BLOCK,BLOCK_ON_GOAL,UNKNOWN,
という8パターンの状態と,現在地,移動先,移動先の奥における組み合わせを網羅的に考える.
単純に考えると8×8×8通りあるように見えるが,あり得ない組み合わせ(動作が許容されない,そもそもありえない)を省いて考えるとさほど考える状況は少ない.
動作が許容されないケースの例としては移動先が壁である場合などがある.
そもそもあり得ない場合としては,現在地にMAN,MAN_ON_GOAL以外が入るケース.

現在地は2通り,移動先は4通りに絞られる.
コードとして定義が必要な場合は,6通りのケース(【参照:概念図】)のみ.
簡単のため,今回は愚直にswitch構文でこれらを実装した.
同じようなコードが多々あり冗長性があるためまたコードは簡素化出来る.
今回は漏れを無くすための思考訓練として安定的に動くプログラムを実装したつもりである.


【概念図】


コメント

このブログの人気の投稿

Callback関数を知らん人がまず理解すべきことのまとめ。

C言語でBluetoothスタックを叩きたい人のBluetooth開発入門その1

C++プログラミング入門(1) // 倉庫番プログラムの実装