HTMLとJavaScriptで作るスライドパズル(15パズル)の作り方を紹介する記事のアイキャッチイメージ。スマホ対応・ハイスコア保存・解ける配置保証まで徹底解説。

開発ガイド

【コピペで完成】スライドパズル(15パズル)の作り方|HTMLとJavaScriptで動く本格ブラウザゲーム

「プログラミングを始めたけど、複雑なゲーム作りはちょっと難しそう…」
「手軽に作れて、友達に見せても“すごい!”と言われるような作品を作りたい!」

もしあなたがそう感じているなら、この記事がその悩みを解決します。

ここでは、Web開発の基本となる
HTML・CSS・JavaScript の3つだけを使って、
誰もが知る定番の脳トレゲーム、スライドパズル(15パズル)をゼロから作っていきます。

難しい環境構築は不要です。
1つのHTMLファイルにコードを貼り付けるだけで、
完成したスライドパズルがすぐに動くようになります。

このスライドパズルを完成させることで、
あなたはWebアプリの仕組み・配列処理・イベント操作を自然に理解できるようになります。

1つのゲームを通して、
「作って楽しい」「遊んで学べる」両方の経験を積みながら、
あなたのプログラミングスキルを確実にレベルアップさせましょう。

完成イメージと仕様を確認しよう

まずは、今回作るスライドパズル(15パズル)がどんなゲームなのかを見てみましょう。
完成形をイメージしておくと、これから学ぶコードの内容がぐっと理解しやすくなります。

完成版を体験してみよう

ゲームの仕様まとめ

画面には、4×4のマス目が表示されます。
そこに1〜15までの数字タイルが並び、右下の1マスだけが空白になっています。

タイルはクリックまたは矢印キーで移動でき、
空白の位置にスライドしていきます。
最終的に「1〜15が順番に並んで、右下が空白」になればクリアです!

スマホでも快適に動くデザイン

このパズルは、レスポンシブデザインを採用しています。
つまり、PCでもスマホでもタイルの大きさが自動で調整される仕組みです。

  • PC:広い画面で見やすく、キーボード操作にも対応
  • スマホ:タップだけでサクサク遊べる直感操作

ハイスコア機能(最少手数を記録)

プレイヤーがタイルを動かすたびに、
「手数」が1ずつカウントされます。

クリア時の最小手数は自動的に保存され、
次回以降も「ベストスコア」として表示されます。

解ける配置のみ生成

スライドパズルでは、絶対に解けない配置が存在します。
しかしこのプログラムでは、独自の関数を使い、
必ず解ける初期配置のみを生成するようにしています。

まずは動かしてみよう(完成コードをコピペ)

この記事では、最も手軽にWeb開発を体験できるよう、1つのHTMLファイルにすべてのコードを書く「単一ファイル方式」で進めます。
環境構築は不要。コピー&ペーストだけでOKです。

新規ファイルを用意する

  1. デスクトップなど分かりやすい場所に、任意のフォルダを作成(例:slide-puzzle)。
  2. メモ帳(Windows)やテキストエディット(Mac)などのテキストエディタを開く。
  3. ファイル名を puzzle.html として保存。

完成コードをまるごと貼り付ける

下の「完成コード」をすべてコピーして、puzzle.html に貼り付け、上書き保存します。

完成コード

ブラウザで開いて動作確認する

  1. puzzle.htmlダブルクリックして開く(既定のブラウザで起動)。
  2. すぐにプレイできます。
  3. スマホ表示の確認は、PCのブラウザでデベロッパーツールのデバイス表示を使うと便利です。

表示がおかしい/動かないときのチェック

  • 文字コードがUTF-8になっているか
  • 途中で一文字でも抜けがないか(特に { } () ;
  • キャッシュを消して再読み込み(Windows: Ctrl + F5 / Mac: Cmd + Shift + R

コードブロックの役割をざっくり把握しよう

HTML(構造)

  • ページの設計図です。
    見出し(<h1>)、情報表示エリア(<div class="info">)、
    パズル盤面(<div id="puzzleBoard">、ボタン類など骨組みを定義します。
  • DOM用のIDを付与(例:id="puzzleBoard")して、後述のJavaScriptから要素を取得・操作できるようにしています。

【用語解説:DOM】
DOM(Document Object Model)は、HTMLを木構造(ツリー)として表現し、JavaScriptから要素を探す・書き換えるための仕組みです。
document.getElementById() はその代表的な入口です。

CSS(見た目)

  • 装飾とレイアウトを担当します。
    背景色やタイルの色、フォント、グリッド配置アニメーション(スライドのなめらかさ)レスポンシブ(スマホ対応)などを定義します。

JavaScript(ロジック)

  • このゲームの頭脳です。タイルのシャッフル、移動判定、手数カウント、ハイスコア保存など、ゲームのルールすべてが記述されています。

HTMLの役割と構造を理解しよう(ゲームの骨組みを作る)

HTMLは、Webページの骨組み(設計図)を作る言語です。
今回のスライドパズルでは、ゲームのタイトルやスコア表示、パズル盤面、ボタンなど、
すべての要素をHTMLで定義しています。

HTMLの主要な構造

以下が、ゲームの中心となるHTMLの構成です

各ブロックの役割を見てみよう

container:全体を包む外枠

  • ページ全体の要素をまとめる“箱”のような存在です。
  • CSSで幅を指定し、画面中央に配置するために使用します。
  • この中に、タイトル・スコア表示・パズル・ボタンを入れていきます。

info:スコアやメッセージを表示するエリア

  • ゲーム中の動的な情報をまとめる領域です。
  • ここには、「現在の手数」や「ベストスコア」、「メッセージ表示」などが入ります。
  • JavaScriptから更新される部分なので、要素ごとにIDが付いています。

ポイント
IDがあると、JavaScriptでdocument.getElementById()を使って直接操作できるようになります。

puzzleBoard:パズルのタイルを配置するグリッド

  • ここが4×4の盤面になります。
  • CSSのGridレイアウトを使って、16マスのタイルをきれいに配置します。
  • JavaScriptで動的にタイルを生成し、この要素の中に並べていきます。

タイルを最初から書いてはいません。
JavaScriptで自動生成する仕組みなので、HTMLでは“受け皿”だけ用意します。

ほーく
ほーく

resetButton:ゲームをリセット(再シャッフル)

  • 押すと盤面が新しくシャッフルされ、新しいゲームが始まります。
  • JavaScriptでクリックイベントを登録し、シャッフル処理を呼び出します。

CSSで見た目と配置を整えよう(デザインとレスポンシブ対応)

HTMLで骨組みを作ったら、次は見た目を整える番です。
CSS(スタイルシート)の役割は大きく分けて2つあります。

  1. ページの見た目を整える(色・フォント・背景など)
  2. 要素のレイアウトを定義する(配置や大きさを決める)

スライドパズルでは、この2つの力をフル活用して、
きれいな4×4の盤面スマホでも崩れないデザインを実現しています。

CSS Gridでパズル盤面を作る

今回のパズルボード(#puzzleBoard)は、CSS Gridという強力なレイアウト機能で作ります。
Gridを使うと、タイルを“きれいな格子状”に自動整列させることができます。

コード解説

  • display: grid;
     → この要素を「グリッドコンテナ」に変えます。
      内部の子要素(ここではタイル)が格子状に自動配置されるようになります。
  • grid-template-columns: repeat(4, 1fr);
     → 横方向を4等分します。1frは「残りのスペースを1単位に分割」という意味。
  • grid-template-rows: repeat(4, 1fr);
     → 縦方向も4等分。これで4×4=16マスの格子が完成します。
  • aspect-ratio: 1 / 1;
     → 幅と高さの比率を常に1:1に保ちます。
      画面サイズが変わってもパズルの形が崩れず、常に正方形を維持できる便利な指定です。

Gridとaspect-ratioを組み合わせると、CSSだけで“柔軟な正方形レイアウト”が作れます。

ほーく
ほーく

スマホ対応(レスポンシブデザイン)

次は、画面サイズに合わせて自動で見た目を調整する
レスポンシブデザインの考え方を見ていきましょう。

このスライドパズルでは、@mediaクエリ(条件分岐)を一切使わずに、
clamp()関数などのCSSの計算機能で柔軟に対応しています。

clamp()関数でフォントサイズを自動調整

font-size: clamp(1.5em, 6vw, 2em); のように使います。
これは「最小値 (1.5em)、画面幅に基づく推奨値 (6vw)、最大値 (2em)」の間でフォントサイズを自動調整する機能です。
これにより、小さな画面ではフォントが小さくなりすぎず、大きな画面では大きくなりすぎないように制御できます。

containerの幅を調整(max-width と width)

containerwidth: 95%;max-width: 450px; を設定することで、画面幅が狭い場合は画面の95%を使い、広すぎる場合は最大450pxまでに制限します。
この設定で、スマホでもPCでも“ちょうどいいサイズ感”が保たれます。

CSSは“見た目をきれいにする”だけでなく、
ゲームの形そのものを決める重要なパートです。

ほーく
ほーく

JavaScriptでゲームを動かそう(ロジックと仕組み)

HTMLが骨組み、CSSが見た目だとすると、
JavaScript(JS)はゲームの頭脳(ロジック)を担います。

このスライドパズルでは、

  • 配列による盤面管理
  • タイルの移動判定と入れ替え(スワップ)
  • 勝利判定
    など、すべてのルールと動作がJavaScriptで制御されています。

初期化と状態管理:配列で盤面を表現する

まず、ゲームの「状態」をJavaScriptに覚えさせる必要があります。
このために配列(Array)を使って盤面を管理します。

状態変数の定義(抜粋)

boardStateの役割:

  • この配列には、1から16(空白マス)までの数字が、現在のマス目順に格納されます。
  • 例: [1, 5, 2, 6, ...] は「1番目のマスに1、2番目のマスに5…」という状態を意味します。
  • タイルを動かす=この配列の要素を入れ替える(スワップする)こと。
    つまり、見た目の動きは、配列の変化を反映しているだけなんです。

盤面の生成:HTML要素を動的に作る

初期化時、createBoard() 関数で boardState の中身をもとに
#puzzleBoard の中に16個のタイル(div要素)を自動生成します。

タイルの移動処理:隣接判定とスワップ

タイルをクリックしたとき(または矢印キーを押したとき)、JSは以下の2つの重要な判定を行います。

空白マスを見つける

タイルが移動できるのは、隣に空白マスがあるときだけです。

移動可能か(隣接しているか)を判定する

クリックされたタイルの位置(tileIndex)と空白マスの位置(emptyIndex)を比較し、隣り合っているかを判断します。

配列内の要素の入れ替え(スワップ)

移動が許可されたら、最も重要な配列の操作(スワップ)を行います。

この操作により、データ(boardState)が更新され、そのデータに基づいて見た目(タイルのCSS位置)が更新される、という流れでパズルの移動が実現します。

勝利判定の仕組み

プレイヤーがタイルを動かすたびに、
JSは「完成状態(1〜16が順番通りか)」をチェックします。

ロジックのポイント

  • every():配列のすべての要素が条件を満たすか調べる関数
  • value === index + 1
    「1番目に1、2番目に2…16番目に16」がそろっているかを確認

クリア時の処理とハイスコア保存

クリアしたら、現在の手数(moves)が
過去の最少手数より少ない場合、ハイスコアを更新します。

「解けない配置」を防ぐ仕組み(インバージョン数チェック)

解けないスライドパズルとは?

スライドパズルには、どんなに頑張っても完成できない配置が存在します。
ランダムに並べただけでは、「絶対に解けない状態」が約半数の確率で発生するのです。

こうした“詰み状態”を防ぐのが、数学的な仕組み
「インバージョン数(反転数)チェック」です。

インバージョン数(反転数)とは?

インバージョン数とは、
「ある数字の後ろに、自分より小さい数字がいくつあるか」を数える値です。
すべてのタイルについてこれを数え、合計したものがインバージョン数です。

例でみてみよう
配列 [3, 1, 2] の場合:

数字後ろにある小さい数カウント
31, 2 → 2個+2
1(なし)+0
2(なし)+0
合計2(偶数)

この「2」がインバージョン数です。
これをパズル全体で計算することで、「解ける/解けない」を判断できます。

4×4パズルが「解ける」条件

4×4のように横幅が偶数のパズルでは、解ける条件が少し複雑です。
ポイントは「空白マスの位置」と「インバージョン数」の奇数・偶数(パリティ)です。

条件一覧

空白マスの位置(下から数えて)インバージョン数解ける?
奇数行(1, 3行目など)偶数解ける
偶数行(2, 4行目など)奇数解ける
それ以外の組み合わせ解けない

つまり、「空白行の奇偶」と「インバージョン数の奇偶」が異なるときにだけ解ける。

JavaScriptでの実装例

このゲームの中では、次の2つの関数が「解ける配置」を保証しています。

isSolvable関数:解の存在を判定

generateSolvableState関数:解けるまでシャッフル

このように、
「作る → 判定 → 解けないなら作り直す」を自動的に繰り返すことで、
プレイヤーは
必ず解ける配置
からスタートできます。

アレンジしてカスタマイズしよう

スライドパズルの基本構造を理解したら、
少し手を加えて自分だけのオリジナル版に進化させてみましょう。
次のような発展機能にも挑戦できます

機能内容難易度
タイマー機能経過時間を計測してスコアに反映★★★
難易度選択3×3 / 4×4 / 5×5 を選べるメニューを追加★★★
画像パズル1枚の画像を16分割してタイル化★★★★

いきなり全部は難しいですが、1つずつ試すことで確実にスキルが上がります。

ほーく
ほーく

おすすめの学習リソース|もっとスキルを伸ばしたいあなたへ

スライドパズル」を完成させたことで、あなたはすでに HTML・CSS・JavaScriptの基礎 に触れました。
ここからさらにステップアップするために役立つ学習リソースを紹介します。

おすすめ書籍

『ゲームで学ぶJavaScript入門 増補改訂版 ~ブラウザゲームづくりでHTML&CSSも身につく!』

  • ゲームを作りながら学べるので、退屈せずにJavaScriptの基礎が身につく
  • HTML・CSS・JavaScriptの基本を一冊で網羅、Web制作の土台が自然に理解できる
  • 13本のサンプルゲームを実際に動かせるから「作れる喜び」が味わえる
  • 初心者・中高生にもやさしい解説で、初めてのゲームプログラミングに最適

『スラスラわかるHTML&CSSのきほん』(SBクリエイティブ)

  • Web制作初心者に最適な入門書。HTMLとCSSの仕組みをやさしく解説。
  • これからWebページを作ってみたい方にぴったり。
  • レイアウトの基本やスタイルの調整方法など、実践的に学べます。
SBクリエイティブ/狩野祐東

オンライン講座編

Udemy|世界最大級のオンライン学習プラットフォーム

世界中で利用されるオンライン学習サイト。
HTML、CSS、JavaScriptの入門から応用まで、高評価の講座が数百種類揃っています。
初心者でも動画を見ながら手を動かせるので、挫折しにくいのが魅力です。

まとめ|スライドパズルで学ぶ、動くWebアプリの基本

ここまで、HTML・CSS・JavaScriptを使って
スライドパズル(15パズル)をゼロから完成させてきました。

この1つのプロジェクトの中に、Web開発の大切な要素がすべて詰まっています。

ポイント

学習テーマ内容キーワード
HTMLゲームの骨組み(構造)を作る要素・ID・DOM
CSS見た目と配置を整えるGrid・aspect-ratio・clamp
JavaScriptゲームを動かすロジックを制御配列・スワップ・イベント処理
解けない配置対策数学的に「解ける状態」だけ生成インバージョン数

スライドパズルは、遊びながら学べる最高の教材です。
自分で“動くもの”を作る体験が、次の一歩につながります。

完成したスライドパズルをベースに、
新しいアイデアをどんどん形にしていきましょう!

関連記事

【実際に遊べるスライドパズルはこちら。ベストスコア更新を目指して挑戦してみよう!】▼

スライドパズルを作れたあなたは、
他のゲームも作れる実力があります。
次のような作品にも挑戦してみましょう。

【作り方記事】神経衰弱ゲームの作り方|記憶力を鍛えるカードゲームを作ろう▼

【作り方記事】タイピング練習ゲームの作り方|60秒でスコアを競うゲームを作ろう▼

-開発ガイド
-, , , , ,