全部のマスを通ったか調べる
ゲームのクリア条件をおさらいします。全ての薄緑マスを黄マスに変更する、です。ではどうやって全ての薄緑マスを黄マスに変えたかどうかを判断すればいいのでしょうか。今回はfor文を使って、薄緑マス(識別番号0)がステージにないか調べる、もしなければクリアということにします。薄緑マスがなくなるタイミングは、移動したときです。よって、移動したときに薄緑のマスがあるかを確認します。
移動したときにマスを調べる関数を呼び出してもいいのですが、今回は移動したときに移動したというフラグを立て、マスを調べる関数を呼び出すかどうかを決めます。この方法はさまざまな場面で活用します。
ここでは全てのマスが薄緑以外になったら一度だけprinfDx関数で文字列を表示するようにします。あと、役に立たないステージデータも書き換えます。全てのマスを調べる関数をCheckAllBordとします。
移動したときにマスを調べる関数を呼び出してもいいのですが、今回は移動したときに移動したというフラグを立て、マスを調べる関数を呼び出すかどうかを決めます。この方法はさまざまな場面で活用します。
ここでは全てのマスが薄緑以外になったら一度だけprinfDx関数で文字列を表示するようにします。あと、役に立たないステージデータも書き換えます。全てのマスを調べる関数をCheckAllBordとします。
- main.hにCheckAllBord関数のプロトタイプ宣言を追加する
- game.cppにCheckAllBord関数の定義を追加する、MovePlayer関数にフラグ処理を追加する、LoadStageの
main.h
void MovePlayer(); // プレイヤーを移動する void InitPlayer(); // プレイヤーを初期化する void LoadStage(); // ステージ情報を読み込む void CheckAllBord(); // 全てのマスを調べる
game.cpp
... void MovePlayer(){ int MoveFlag=0; // 移動したら1になる if( Key[KEY_INPUT_RIGHT] == 1 ){ // 右が押されたら Player.x++; // x座標を増やす if( Player.x == 8 || Bord[Player.y][Player.x].Kind!=0) Player.x--; // 戻す Bord[Player.y][Player.x].Kind = 3; // 識別番号を書き換え MoveFlag = 1; // 移動フラグを立てる } if( Key[KEY_INPUT_LEFT] == 1 ){ // 左が押されたら Player.x--; // x座標を減らす if( Player.x==-1 || Bord[Player.y][Player.x].Kind!=0) Player.x++; // 戻す Bord[Player.y][Player.x].Kind = 3; // 識別番号を書き換え MoveFlag = 1; // 移動フラグを立てる } if( Key[KEY_INPUT_DOWN] == 1 ){ // 下が押されたら Player.y++; // y座標を減らす if( Player.y==8 || Bord[Player.y][Player.x].Kind!=0) Player.y--; // 戻す Bord[Player.y][Player.x].Kind = 3; // 識別番号を書き換え MoveFlag = 1; // 移動フラグを立てる } if( Key[KEY_INPUT_UP] == 1 ){ // 上が押されたら Player.y--; // y座標を増やす if( Player.y==-1 || Bord[Player.y][Player.x].Kind!=0) Player.y++; // 戻す Bord[Player.y][Player.x].Kind = 3; // 識別番号を書き換え MoveFlag = 1; // 移動フラグを立てる } if( MoveFlag == 1 ){ // 移動フラグが立っていたら CheckAllBord(); } } ... void LoadStage(){ int Stage1[8][8] = { {1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,1}, {1,0,0,0,1,1,2,1}, {1,0,0,1,1,1,0,1}, {1,0,0,1,1,1,0,1}, {1,0,1,1,0,0,0,1}, {1,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1}, }; ... } // 全てのマスを調べる void CheckAllBord(){ for(int y=0 ; y<8 ; y++){ for(int x=0 ; x<8 ; x++){ if( Bord[y][x].Kind == 0 ){ // 1つでも薄緑マスがあるなら printfDx("まだ薄緑が残ってます\n"); return; // この関数を終了する } } } // ここまで関数の処理が続いてたらクリアしたということになる printfDx("全て薄緑以外になりました\n"); }