JavaScriptで15パズルをつくります。

HTML部分

まずHTML部分を示します。

JavaScript部分

JavaScript部分を示します。

主なグローバル変数と定数は以下のとおりです。

ピースの移動処理がおこなわれているときに別の移動処理が始まらないようにフラグとしてisMovingを定義しています。

Pieceクラスの定義

ピースを表示させるためのPieceクラスを定義します。

ひとつの写真を縦横4列ずつ合計16分割し、それぞれを各ピースに描画します。また各ピースがどの部分なのかがわかるように番号も表示させます。

コンストラクタにはピースに描画するイメージ、外枠、何行目何列目に存在するピースなのかの情報を渡します。何行目何列目に存在するかで表示させるべき番号もわかります。

IsClick関数は引数として渡された座標がピースの内部かどうかを調べるためのものです。Check関数は完成しているかどうかの判定に使うものです。各ピースがあるべき位置に配置されている場合はtrueを返します。すべてのオブジェクトがtrueを返せば完成していることになります。

DrawOnlyImage関数は枠なしで描画します。これはパズルが完成したときに画像のみを描画させたいので定義しました。

ページが読み込まれたときの処理

ページが読み込まれたときの処理を示します。

元の画像になるファイルを読み込んで、これをもとにピースを生成します。そして各ピースがすべて生成されたら描画処理をおこないます。

元になる画像を取得する処理を示します。これはJavaScriptでジグソーパズルを作るでおこなっている処理とほとんど同じです。

元になる画像から各ピースに描画する画像を取得する処理を示します。

各ピースを描画する処理

各ピースを描画する処理を示します。16の番号がふられたピース以外を描画します。16番ピースがある位置は白で描画されます。

枠なしで16番ピースも含めてすべてのピースを描画する処理を示します。

移動の処理

ピースがクリックまたはタップされたときの処理を示します。

クリックまたはタップされた座標を取得してonClick関数を呼び出してピースの移動処理をおこないます。ピースが移動中であったりパズルが完成しているときはクリックやタップには反応しません。

クリックまたはタップされた座標にピースがある場合、移動可能であれば移動処理をおこなう処理を示します。移動可能なのはそのピースの上下左右に16番ピースがある場合です。

移動はスライドするように演出をいれたいので非同期処理をしています。

パズルの完成をチェックする処理

パズルが完成したかをチェックする処理を示します。各PieceのCheck関数を呼び出し、すべてがtrueを返した場合は完成していると判断できます。

ゲームを開始する処理

ゲームを開始する処理を示します。

15パズルの場合、ただランダムに並べ替えると完成不能の形になる場合があります。そこでランダムに並べ替えたあと、ほんとうに完成できるのかどうかを調べてできない場合はもう一度ランダムに並べ替える処理をしています。

具体的にどのような形ができてできないかは 8パズル,15パズルの不可能な配置と判定法 | 高校数学の美しい物語 を参照してください。

空白の部分が右下の場合は置換のパリティが偶の場合が完成可能な配置です。

shuffle関数は戻り値として置換のパリティを返すので、これが奇数の場合はシャッフルの処理をもう一度繰り返しています。処理が完了したら16番ピース以外を描画してタイマーのカウントアップを開始しています。

ピースをシャッフルする処理を示します。ランダムにシャッフルしたあとパリティーのチェックをしています。

置換のパリティを計算する処理を示します。