月面着陸

2003/8/2作成

月面着陸

着陸態勢に入った宇宙船を無事に着陸させるゲーム。カーソルの左右上で移動/逆噴射して着陸地点'='にたどり着かせます。ただし、左右には慣性が、上下には重力が働くので注意が必要です。着陸地点以外に落ちると、また着陸地点でも落下速度が速すぎるとゲームオーバーです。逆噴射には燃料が必要で、燃料を使い切ってしまうと逆噴射できません。

プログラム


/********************************************************/
/*  アプリケーションループ                              */
/********************************************************/

while( 1 ) {

    /********************************************************/
    /*  変数初期化                                          */
    /********************************************************/

    /*  位置    */
    x = 10;
    y = 10;
    /*  速度    */
    s = 0;
    t = 0;
    /*  燃料    */
    f = 100;
    /*  ゲームフラグ    */
    a = 0;


    /********************************************************/
    /*  スタート画面                                        */
    /********************************************************/

    /*  画面表示    */
    cls();
    locate( 3, 3 );
    printstr( "GAME START" );
    locate( 2, 8 );
    printstr( "PUSH ANY KEY" );

    /*  キークリア待ち  */
    while( ( pad() & 0xff ) );

    /*  キー待ち    */
    while( !( pad() & 0xff ) );

    /*  キークリア待ち  */
    while( ( pad() & 0xff ) );


    /********************************************************/
    /*  メインループ                                        */
    /********************************************************/

    while( a == 0 ) {
        /*  パッドチェック  */
        p = pad();
        if( p & PAD_LF )
            s--;
        if( p & PAD_RI )
            s++;
        b = 0;
        if( ( p & PAD_UP ) && f > 0 ) {
            b = 1;
            t -= 2;
            f--;
        }

        /*  位置、速度計算  */
        t++;
        x += s;
        y += t;

        /*  地形、残燃料表示    */
        cls();
        locate( 0, 0 );
        siprintf( "FUEL%3d", f );
        locate( 0, 8 );
        printstr( "***             " );
        locate( 0, 9 );
        printstr( "   *  ****   ***" );
        locate( 0, 10 );
        printstr( "    **    *=*   " );

        /*  終了判定    */
        if( scan( x / 10, y / 10 ) == '=' ) {
            if( t < 10 )
                a = 1;
            else
                a = 2;
        }
        if( scan( x / 10, y / 10 ) == '*' )
            a = 2;

        /*  宇宙船表示  */
        locate( x / 10, y / 10 );
        printstr( "A" );
        if( b == 1 ) {
            locate( x / 10, y / 10 + 1 );
            printstr( "^" );
        }

        /*  ウェイト    */
        wait( 500 );
    }

    if( a == 1 ) {
        /********************************************************/
        /*  ゲームクリア                                        */
        /********************************************************/

        /*  画面表示    */
        cls();
        locate( 5, 3 );
        printstr( "CLEAR!!" );
        locate( 2, 8 );
        printstr( "PUSH ANY KEY" );
    }
    else {
        /********************************************************/
        /*  ゲームオーバー                                      */
        /********************************************************/
    
        /*  画面表示    */
        cls();
        locate( 5, 3 );
        printstr( "CRASH!!" );
        locate( 2, 8 );
        printstr( "PUSH ANY KEY" );
    }

    /*  キークリア待ち  */
    while( ( pad() & 0xff ) );

    /*  キー待ち    */
    while( !( pad() & 0xff ) );
}

ダウンロード

landing.zip

改良案

文字で宇宙船を表示しているため移動が1文字単位になっています。ドット単位で移動させるにはスプライトを使えば実現できます。スプライト対応に修正してみましょう。

逆噴射した時、地面に激突した時、無事に着陸した時に合わせて効果音をつけるとよりゲームらしくなるでしょう。

地形を変えたり燃料の初期値を少なくしたりすればいくつもゲームバランスも変わります。そうした面をいくつも用意して複数面構成のゲームにする事も出来るでしょう。