マインドゲーム

2003/6/14作成

マインドゲーム

マインドゲーム、要するに数当てです。十字ボタンで四つの隠れた数字を予想して、Aボタンを押して、正解ならクリア。正解で無かった場合は、位置も数字も合った数をヒット、数字が合っていて位置が合わないものをブローとして表示されます。このヒントを元にして正解を当てるゲームです。

プログラム


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

while( 1 ) {

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

    /*  隠れた数字  */
    s = rnd( 10 );
    t = rnd( 10 );
    u = rnd( 10 );
    v = rnd( 10 );

    /*  当てる数字  */
    w = x = y = z = 0;
    /*  カーソル位置    */
    c = 0;
    /*  ヒット、ブロー  */
    h = b = 0;

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

    while( 1 ) {
        /*  パッド入力  */
        p = pad();
        /*  数字プラス  */
        if( p & PAD_UP ) {
            if( c == 0 )    w = ( w + 1 ) % 10;
            if( c == 1 )    x = ( x + 1 ) % 10;
            if( c == 2 )    y = ( y + 1 ) % 10;
            if( c == 3 )    z = ( z + 1 ) % 10;
        }
        /*  数字マイナス    */
        if( p & PAD_DN ) {
            if( c == 0 )    w = ( w - 1 + 10 ) % 10;
            if( c == 1 )    x = ( x - 1 + 10 ) % 10;
            if( c == 2 )    y = ( y - 1 + 10 ) % 10;
            if( c == 3 )    z = ( z - 1 + 10 ) % 10;
        }
        /*  カーソル移動    */
        if( p & PAD_RI )
            c = ( c + 1 ) % 4;
        if( p & PAD_LF )
            c = ( c - 1 + 4 ) % 4;
        /*  判定    */
        if( p & PAD_A ) {
            h = 0;
            if( w == s )    h++;
            if( x == t )    h++;
            if( y == u )    h++;
            if( z == v )    h++;
            if( h == 4 )
                break;
            b = 0;
            if( w == t )    b++;
            if( w == u )    b++;
            if( w == v )    b++;
            if( x == s )    b++;
            if( x == u )    b++;
            if( x == v )    b++;
            if( y == s )    b++;
            if( y == t )    b++;
            if( y == v )    b++;
            if( z == s )    b++;
            if( z == t )    b++;
            if( z == u )    b++;
        }

        /*  画面表示    */
        cls();
        locate( 4, 1 );
        printstr( "X X X X" );
        locate( 4, 5 );
        siprintf( "%c %c %c %c", w + '0', x + '0', y + '0', z + '0' );
        locate( 4 + c * 2, 6 );
        printstr( "~" );
        locate( 2, 7 );
        siprintf( "%d HIT %d BLOW", h, b );

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


    /********************************************************/
    /*  クリア                                              */
    /********************************************************/

    /*  画面表示    */
    cls();
    locate( 4, 1 );
    siprintf( "%c %c %c %c", s + '0', t + '0', u + '0', v + '0' );
    locate( 4, 5 );
    siprintf( "%c %c %c %c", w + '0', x + '0', y + '0', z + '0' );
    locate( 2, 7 );
    printstr( "4 HIT CLEAR!!" );
    locate( 2, 9 );
    printstr( "PUSH ANY KEY" );

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

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

ダウンロード

mindgame.zip

改良案

Aボタンを押す回数に制限が無いため、極端な話0000〜9999までの全てを試せば必ず正解する事が出来ます。Aボタンを押す回数を制限したり、Aボタンを押した数が少ない方が高くなるスコアを導入したりすれば、よりゲームらしくなるでしょう。

例によって乱数が初期化されていないので常に同じ数字が隠されています。ちなみに最初の正解は0887です。これも乱数が本当にランダムになるようにしないと、本当のゲームとは言えませんね。

四つの数字だけではなく、五つの数字六つの数字と増やしていく事も出来ます。ただし、今のプログラムだと数が増えるとそれだけややこしくなってしまいますので、配列変数を使うようにした方がよいでしょう。