15パズル

2003/6/15作成

15パズル

15パズル
画面サンプル

言わずと知れた有名な15パズルです。16枚のパネルの内空いた1枚のスペースを利用して、パネルを順番に並べなおすパズルです。

プログラム


/********************************************************/
/*  初期化                                              */
/********************************************************/

/*  整列    */
cls();
locate( 0, 0 );
printstr( "0123" );
locate( 0, 1 );
printstr( "4567" );
locate( 0, 2 );
printstr( "89AB" );
locate( 0, 3 );
printstr( "CDE." );
x = 3;
y = 3;

/*  シャッフル  */
for( i = 0; i < 100; ) {
    r = rnd( 4 );
    if( r == 0 ) {
        a = 0; b = -1;
    }
    if( r == 1 ) {
        a = 0; b = 1;
    }
    if( r == 2 ) {
        a = -1; b = 0;
    }
    if( r == 3 ) {
        a = 1; b = 0;
    }

    if( x + a < 0 || x + a > 3 || y + b < 0 || y + b > 3 )
        continue;
    c = scan( x + a, y + b );
    locate( x, y );
    siprintf( "%c", c );
    x += a;
    y += b;
    locate( x, y );
    printstr( "." );
    i++;
}

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

while( 1 ) {
    /*  パッド入力  */
    a = 0;  b = 0;
    p = pad();
    if( p & PAD_RI ) {
        a = -1; b = 0;
    }
    if( p & PAD_LF ) {
        a = 1;  b = 0;
    }
    if( p & PAD_UP ) {
        a = 0;  b = 1;
    }
    if( p & PAD_DN ) {
        a = 0;  b = -1;
    }
    if( x + a < 0 || x + a > 3 || y + b < 0 || y + b > 3 )
        continue;

    /*  パネル移動  */
    c = scan( x + a, y + b );
    locate( x, y );
    siprintf( "%c", c );
    x += a;
    y += b;
    locate( x, y );
    printstr( "." );

    /*  完成チェック    */
    f = 1;
    if( scan( 0, 0 ) != '0' )   f = 0;
    if( scan( 1, 0 ) != '1' )   f = 0;
    if( scan( 2, 0 ) != '2' )   f = 0;
    if( scan( 3, 0 ) != '3' )   f = 0;
    if( scan( 0, 1 ) != '4' )   f = 0;
    if( scan( 1, 1 ) != '5' )   f = 0;
    if( scan( 2, 1 ) != '6' )   f = 0;
    if( scan( 3, 1 ) != '7' )   f = 0;
    if( scan( 0, 2 ) != '8' )   f = 0;
    if( scan( 1, 2 ) != '9' )   f = 0;
    if( scan( 2, 2 ) != 'A' )   f = 0;
    if( scan( 3, 2 ) != 'B' )   f = 0;
    if( scan( 0, 3 ) != 'C' )   f = 0;
    if( scan( 1, 3 ) != 'D' )   f = 0;
    if( scan( 2, 3 ) != 'E' )   f = 0;
    if( scan( 3, 3 ) != '.' )   f = 0;
    if( f == 1 )
        break;

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

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


/********************************************************/
/*  完成                                                */
/********************************************************/

/*  画面表示    */
locate( 2, 9 );
printstr( "PUSH ANY KEY" );

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

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

ダウンロード

15puzzle.zip

改良案

4×4-1=15パズルですが、同じ要領で5×5-1=24パズルとか6×6-1=35パズルなんてのも考えられますね。何も正方形に拘る必要はありませんから、3×10-1=29パズルとかも考えられます。ただし、文字の種類には上限がありますから、大きくしすぎると文字の見分けがつかなくなってしまうので、その点は注意が必要ですね。