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