クリア判定、など
最後、クリア判定をする。
クリア判定は、実は簡単で、ステージの初期状態にには、必ず以下のような設定がある。
- ステージは必ずMAX_STAGE_WIDTH、MAX_STAGE_HEIGHT以内の幅と高さの壁に囲まれている。
- 壁で囲まれた領域内に、ゴールと荷物が同数配置されている。
- 壁で囲まれた領域内に、プレイヤーが配置されており、壁によって領域の外側に出ることはできない
- この条件を満たしたステージ以外はない
したがって、クリア条件は単純に、すべての荷物がゴールに運ばれたかどうかである。
ゲームプログラム内で、荷物はLUGG、ゴールはGOAL、ゴールの上の荷物はLUGG_ON_GOALで表される。
つまり、すべてのLUGGが、LUGG_ON_GOALに変更されていれば、ゲームクリア状態である。
この状態を調べるのは簡単で、LUGGはLUGG_ON_GOAL以外には変化しないので、
- ステージ上にLUGGが残っている ⇒ 未クリア
- ステージ上にLUGGが1つもない ⇒ クリア
である。
Listing. 1: クリアチェック関数の作成
bool CheckClear(Map& _map)
{
for (int j = 0; j < _map.stage_height; j++)
{
for (int i = 0; i < _map.stage_width; i++)
{
if (荷物があったら)
return(false);
}
};
return true;
}
動作確認
動作確認のために、DrawUpdateをクリアしていなかったら入力を促すメッセージ、クリアしていたらおめでとうメッセージ、を表示するように改良する
Listing. 2: クリアチェックできているか確認
//どっかにグローバル変数で以下を設定
bool GAME_CLEAR = false;
void DrawPlay()
{
system("cls");
DrawStage(sampleStage);
if (GAME_CLEAR)
cout << "GAME_CLEAR!!!" << endl;
else
cout << "Input wasd to Move Costco M@n" << endl;
}
今後のこと
これで、ステージの読み込み、キャラクタの移動、ゲームクリアの判定、までできるようになった。
あとは、
- いつもの、タイトル、プレイシーン、クリア画面などのゲームシーケンスの遷移
- 現在、ステージが一つしかないので、複数ステージの追加
- 現在は、過度に荷物を押し込んでしまった場合などは手詰まりになってしまう。手詰まり解消の方法(1手戻しや、面リセット)
- 当然グラフィックスの追加
などの要素が考えられる
これらは、グラフィックス版にゆだねてしまおう。