HTMLとJavaScriptだけで作る「2048ゲーム」の完全ガイドの記事のアイキャッチイメージ。盤面生成・スライド処理・合体ロジックまで初心者にもわかりやすく解説。コピペで動くサンプル付き。

開発ガイド

【コピペで完成】2048ゲームの作り方|HTML・CSS・JavaScriptだけで簡単実装!

「2048ゲームを自分で作ってみたい」
「JavaScriptの練習になるミニゲーム教材を探している」
そんな方に向けて、本記事では HTML・CSS・JavaScript のみで作れる軽量2048ゲーム の作り方を、初心者でも迷わないように丁寧に解説します。

この記事では、
コピペすればそのまま動く完全版のソースを使いながら、
どの部分がどんな役割をしているのかを、わかりやすく噛み砕いて説明していきます。

「JavaScriptでゲームを作るのは難しそう…」
と思うかもしれませんが、大丈夫。
2048は “ルールがシンプル・ロジックが整理しやすい” ので、初心者でも確実にステップアップできます。

2048ゲームの完成イメージと仕様を確認しよう

まずは、この作り方記事で完成する 2048ゲームのイメージ をつかんでおきましょう。
今回あなたが作るのは、ブラウザでサクサク動く 軽量版2048ゲーム です。

完成版を体験してみよう

ゲームの仕様まとめ

2048のルールはとてもシンプルです。

  • 4×4 のグリッドでタイルをスライドさせる
  • 同じ数字がぶつかると合体して2倍になる
     例:2→4→8→16→32…
  • 毎ターン移動のあとに、新しい「2」または「4」がランダムに出現
  • 2048のタイルができればクリア!(ゲームは続行可能)
  • 動かせなくなったらゲームオーバー

操作は

  • PC:矢印キー(←↑→↓)
  • スマホ:スワイプ

必要なファイルと準備

この2048ゲームは、
1つのHTMLファイルだけで完結するシンプルな構成になっています。

まずは「土台」となるファイルを用意して、
そこに完成版ソースコードをまるごと貼り付ける、という流れで進めていきます。

用意するもの

最低限、次の3つがあればOKです。

  • パソコン(Windows / Mac どちらでも可)
  • Webブラウザ
    • Google Chrome 推奨(EdgeやFirefoxでも可)
  • テキストエディタ
    • Visual Studio Code / VSCode
    • または メモ帳、メモ帳アプリ など

本格的な環境構築は不要で、
「ローカルにHTMLファイルを1枚置いて、ブラウザで開くだけ」で動きます。

htmlファイルを作成する

  1. デスクトップや任意のフォルダで
    右クリック → 新規作成 → テキストドキュメント を選びます。
  2. ファイル名を
    2048_game.html
    に変更します(.txt が残って 2048_game.html.txt にならないよう注意)。
  3. この 2048_game.html を、テキストエディタ(VSCode など)で開きます。

これで「ゲームを置く箱」の準備が完了です。

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

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

完成コード

ブラウザで動作確認する

  1. 2048_game.htmlを保存します。
  2. エクスプローラー/Finder で 2048_game.htmlをダブルクリックします。
  3. ブラウザが開き、2048ゲームの画面が表示されればOKです。

矢印キーやスワイプでタイルが動き、
スコアが加算されていれば、準備は完了です。

HTMLの構造解説(盤面やスコア表示など“見た目の骨組み”)

この章では、2048ゲームの「見た目の骨組み」をつくっている HTML構造 を整理して解説します。

ポイントは、

  • スコア表示エリア
  • メッセージと「New Game」ボタン
  • ゲームボード本体(グリッド・タイル・ゲームオーバー表示)

この3つのブロックに分けて考えると、とても分かりやすくなります。

① ヘッダー部分:タイトルとスコア表示

まず最初のブロックが、ゲームタイトルとスコアを表示する ヘッダー部分 です。

ここでのポイントは次の3つです。

  • .header
    → タイトルとスコアをまとめる外枠コンテナです。
  • .scores.score-container
    → 「SCORE」と「BEST(ハイスコア)」を横並びで表示するための囲いです。
  • id="score"id="highScore"
    → JavaScript側からスコアを更新するための要素です。
    ゲーム中に、ここを書き換えることで数字がリアルタイムに変わります。

②コントロール部分:メッセージ+New Gameボタン

次に、ゲームの状態を表示するメッセージと、リセット用のボタンです。

  • .controls
    → メッセージとボタンをまとめているコンテナです。
  • id="message" / .message
    → 「矢印キーまたはスワイプで操作します」など、
    プレイヤーに状況を伝えるためのテキスト。
    JavaScriptで、ゲーム開始・ゲームオーバーなどのタイミングに応じて文言を変えています。
  • id="newGameButton" / .btn-new-game
    → 「New Game」ボタンです。
    クリックすると盤面をリセットして、新しいゲームが始まります。

③ ゲーム本体:盤面・タイル・ゲームオーバー表示

ゲームの中心部分は、 .game-container の中に3つの要素が入っています。

gameGrid(背景グリッド)

  • id="gameGrid" / .grid
    4×4の背景マス(グレーっぽい空セル)を表示するエリア です。
    実際の .tile(数字タイル)はここには入りません。

この中身は、JavaScript 側で「16個のセル」を自動生成して追加しています。
そのため、HTMLでは空の <div> のままにしておき、
「マスを置く場所」だけを用意している 形になっています。

tileContainer(数字タイルを配置する層)

  • id="tileContainer" / .tile-container
    → 実際の「2」「4」「8」…といった 数字タイルを絶対配置するためのコンテナ です。

ここが 2048 実装の重要ポイントで、

  • 背景マス(#gameGrid)と
  • 実際に動くタイル(#tileContainer

を「別レイヤー」に分けることで、

  • タイルの位置計算(top・left)をやりやすく
  • 見た目もきれいに重なる

というメリットがあります。

gameOverOverlay(ゲームオーバー時のオーバーレイ)

  • id="gameOverOverlay" / .game-overlay
    → ゲームオーバー時に表示される 半透明の黒い覆い(オーバーレイ) です。
    通常時は非表示になっていて、ゲームオーバー時にだけ表示されます。
  • id="overlayMessage" / .overlay-message
    → 「Game Over!」などのメッセージを表示する部分です。
    JavaScript側で文言を書き換えて使います。
  • id="tryAgainButton" / .btn-new-game
    → 「Try Again」ボタンです。
    New Game ボタンと同様、盤面をリセットして再スタートします。

CSSのポイント解説(配色・レイアウト・レスポンシブ対応)

この章では、2048ゲームの“見た目”を作っている CSS の重要ポイント をわかりやすく解説します。

全体の配色(背景色・タイル色・フォント色)

CSSでは、まず :root に配色がまとめられています。

  • 配色変更が1箇所で完結
  • タイル・盤面の統一感が出る
  • レスポンシブ指定が簡単
  • 開発時にも迷わない

盤面(グリッド)は .grid で構築

(※実際のHTML要素:<div id="gameGrid" class="grid"></div>

主なポイント

  • CSS Grid を使い 4×4マスを自動生成
  • 背景は落ち着いたブルーグレー(--board-bg
  • マス同士の間隔は --tile-gap: 12px

中の各マス(空セル)は .grid-cell で作られます。
これは タイルとは別レイヤー で、「盤面の枠」を作るためだけに存在します。

タイルは .tile-container の上に“絶対配置”

盤面の上に タイルだけを重ねるレイヤー.tile-container です。
タイル1枚ずつは .tileです。

JavaScriptで座標・サイズを制御

タイルは CSS Grid ではなく JS で transform: translate(x, y) を当てて動かします。
そのため .tile の位置指定はすべて 絶対配置(position:absolute) で管理されています。

タイルの色分け(値ごとにスタイル制御)

2048ゲーム特有の
数字が成長するごとに色が変わる演出
は、CSSの属性セレクタで管理しています。

レスポンシブ対応は @media でフォント調整

スマホ画面向けにタイルのフォントサイズを小さくする調整も含まれています。

スマホでも数字が潰れないように最適化
フォントを段階的に縮小することで、
どの端末でも 見やすさをキープ できるようになっています。

JavaScriptロジック解説(タイル生成・合体・スライドなど)

この章では、2048ゲームの「中身の動き」を担当している
JavaScript部分のロジックを、なるべくやさしく分解して説明します。

ポイントになるのは、次の5つです。

  • 定数とゲーム状態(boardscore など)
  • タイルの生成と描画(tile-container 内の .tile
  • スライド&合体処理(slideAndMergeLine()
  • 盤面全体の移動処理(move(dir)
  • 入力処理(矢印キー・スワイプ)とゲーム開始・終了

順番に見ていきましょう。

定数とゲーム状態の管理

まず、ゲームの基本設定と現在の状態を表す変数が定義されています。

  • SIZE … グリッドの一辺の長さ(4×4なので 4)
  • TILE_GAP … タイル間のすき間(CSSの --tile-gap と対応)
  • board … 盤面を表す2次元配列(board[row][col] に数字が入る)
  • score … 現在のスコア
  • highScore … ハイスコア
  • gameEnded … ゲームが終了しているかどうか(入力無効にするフラグ)

そして、HTML側の各要素を getElementById() で取得しています。

タイルの位置計算と描画(見た目の座標ロジック)

タイル .tile は、#tileContainer の中で 絶対配置(position: absolute されています。
「どのマスの上に置くか」を計算するのが getTilePosition()setTileStyle() です。

  • gridEl.offsetWidth … 実際のボード幅(レスポンシブ対応)
  • tileSize … 1マスぶんの実サイズを計算
  • x, y … 左上からの配置位置(タイルの座標)

この情報を使って、setTileStyle().tile の見た目を設定します。

ここで

  • .style.transform = translate(...) を使って、
    CSSアニメーションなしで瞬時に位置を移動させています。

タイルDOMの生成と盤面の再描画

1枚のタイルを作るのが createTileElement() です。

setTileStyle() を使って位置とサイズ・表示する数字を設定しています。

そして、盤面全体を描画し直すのが redrawBoard() です。

  • board[r][c] に 0 以外の数字があれば .tile を生成
  • 一度 innerHTML = '' で空にしてから、全タイルを描き直す方式
    → アニメーションを使わない分、シンプルでバグが起きにくい実装です。

新しいタイルを追加する addNewTile()

タイルを動かした後に、ランダムな空きマスに
2 または 4 の新しいタイルを1枚(または複数)追加する関数です。

  • emptyCells に空きマス(board[r][c] === 0)の座標をリストアップ
  • その中からランダムに1つ取り出し、
    90%の確率で 2、10%の確率で 4 をセット

1行ぶんのスライド&合体ロジック slideAndMergeLine()

2048の心臓部ともいえるのが、この関数です。
「1行(または1列)の数字」を受け取り、スライド+合体 を行います。

流れはこうです:

  1. line から 0 を取り除いて詰める(スライド)
  2. 左から順に見て、隣が同じ数字なら合体
    • 合体した値は score に加算
    • 1ペアごとに1回だけ合体(公式2048準拠)
  3. 足りない分は 0 で埋めて、元の長さ(4マス)に戻す
  4. 元の line と違いがあったかどうかを moved で返す
    → 「この行は実際に変化したか?」を判定するため

盤面全体の移動処理 move(dir)

move(dir) は、上下左右いずれかの方向への移動を実現する関数です。

  • dir は 0=上、1=右、2=下、3=左
  • 各方向に応じて、board から 1行ぶんを取り出して並べ替え
  • slideAndMergeLine() に渡してスライド&合体
  • 結果を board に書き戻す
  • どこか1行でも変化があったら、新しいタイルを1枚追加して redrawBoard()
  • その後、hasLegalMoves() で合法手が残っているかをチェック

合法手チェックとゲームオーバー判定 hasLegalMoves()

ゲームオーバーかどうかを調べるのが hasLegalMoves() です。

  • 空きマスがあれば → まだ動かせる
  • 隣(上下左右)に同じ値があれば → 合体できるのでまだ動かせる
  • どちらもなければ → もう合法手なし → ゲームオーバー

ゲームオーバー時には endGame(false) が呼ばれ、
#gameOverOverlay.active クラスがついてオーバーレイが表示されます。

スコア更新と 2048 達成メッセージ updateGameStatus()

スコアやハイスコア、メッセージを更新するのが updateGameStatus() です。

  • score の表示を更新
  • ハイスコアは updateHighScore() でローカルストレージにも保存
  • 盤面に 2048 があるかチェックし、達成していればメッセージを変更
    → 2048後も gameEndedfalse のままなので、プレイ続行可能

入力処理(矢印キー&スワイプ)

共通のムーブ処理

共通のムーブ処理が handleMove() です。

キーボード(矢印キー)

スワイプ(タッチ操作)

touchstart / touchend の座標差から
左右・上下どちらにスワイプしたかを判断し、handleMove(dir) を呼びます。

ゲーム開始・リセット startGame() と 初期化

ゲームのリセットは startGame() が担当します。

  • board をすべて 0 で初期化
  • #gameGrid に 16個の .grid-cell を配置
  • オーバーレイを非表示に
  • 最初のタイルを2枚追加(addNewTile(2)
  • redrawBoard() でタイルを描画

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

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

おすすめ書籍

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

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

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

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

オンライン講座編

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

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

まとめ|シンプルな構造で“完成度の高い2048ゲーム”が作れる

2048ゲームは、一見シンプルに見えますが、
HTML・CSS・JavaScriptの基礎がしっかり詰まった良い教材です。

今回の実装では、

  • HTMLで見た目の骨組みをわかりやすく定義
  • CSSで配色・レイアウト・レスポンシブ対応を丁寧に実装
  • JavaScriptでスライド、合体、タイル生成、ゲームオーバーまでのロジックを完全実装

という、Web制作の基本3要素がすべて揃っています。

HTML+CSS+JavaScriptだけで、
ここまでしっかり動くパズルゲームが作れるのは本当に魅力的です。

ぜひ、この2048をベースに、次の開発にも挑戦してみてください!

関連記事

【実際に遊べる2048ゲームはこちら。ベストスコア更新を目指して挑戦してみよう!】▼

2048ゲームづくりを楽しめた方は、以下の記事もおすすめです。
どれもブラウザだけで動く本格的なゲームを題材にしており、JavaScriptの理解がさらに深まります。

【作り方記事】スライドパズル(15パズル)の作り方|定番パズルゲームを作ろう▼

【作り方記事】五目並べAI対戦の作り方|本格的なAI構築の応用編

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