01. 2次元(4×4)と3次元(3×3×3 / 4×4×4)の幾何学的な違い

通常の2次元2048は、4×4の16マスで上下左右(4方向)にタイルを滑らせます。このとき、四隅から外周をぐるっと囲む「外殻」は12マスで、四方を囲まれた内部のマスは中央の2×2=4マスです。

一方、本作『2048×3D』では X軸(左右)・Y軸(上下)・Z軸(奥手前)の直交3軸・計6方向へ移動します。盤面サイズはモードや設定によって「3×3×3(27マス)」と「4×4×4(64マス)」の2種類を用意しているわけですが、ここで注目してほしいのが「外周(外殻)と内部コアの比率」と「1マスあたりの隣接数(最大6近傍)」です。

平面 2D (4×4) 全 16 マス 移動方向: 4方向 (X, Y) 外周: 12マス (75.0%) 内部コア: 4マス (25.0%) 最大隣接数: 4マス 立体 3×3×3 (BUSY / HARD) 全 27 マス 移動方向: 6方向 (X, Y, Z) 外殻: 26マス (96.3%) 内部コア: 1マス (1,1,1) 最大隣接数: 6マス 立体 4×4×4 (EASY / PARTY) 全 64 マス 移動方向: 6方向 (X, Y, Z) 外殻: 56マス (87.5%) 内部コア: 8マス (2×2×2) 最大隣接数: 6マス
▲ 2次元盤面と3次元盤面(3×3×3 / 4×4×4)のマス数・外殻比率・内部コア数の比較。

図の通り、3×3×3の空間では27マス中26マスが外殻に面しており、完全に外から隠れる内部コアは中心の `(1, 1, 1)` のたった1マスだけです。この中心マスは上下・左右・奥手前の6方向すべてと隣接しているため、ここを通るラインの合体経路を意識するかどうかで盤面整理の効率が大きく変わります。また、4×4×4の空間では `x, y, z` がそれぞれ `1` または `2` となる中央の2×2×2=8マスが内部コアになります。外殻のタイルに覆われると直接見えなくなるため、本作ではキーボードの `X` キー(または画面のX線ボタン)で外殻の不透明度を `0.28` に下げて内部コアを透視できる仕組みを入れているわけです。

02. 全4モードの盤面サイズ・制限時間・新規タイル出現確率テーブル

個人開発でパズルを作っていると、「じっくり空間パズルとして考えたい日」と「頭を空っぽにして派手に連鎖させたい日」の両方があると思うのです。そこで『2048×3D』では、単なる盤面サイズの切り替えにとどまらず、1手ごとの新規タイル出現数(スポーン数)や出現するタイルの種類自体が異なる4つのゲームモードを設計しました。

現行の `js/game-core.js` に実装されている全4モードの確定仕様を一覧表にまとめます。

『2048×3D』全4モードの仕様・スポーン確率・特殊ルール比較表
モード名 盤面サイズ 制限時間 1手あたりの出現個数 出現数値の確率内訳 固有ギミック・終了条件
CLASSIC 4×4×4 (easy)
3×3×3 (busy)
無制限(標準)
または 5分
1個 2: 90%
4: 10%
2048到達後も4096・8192へ継続可能。FEVER中はスコア2倍。
SPEEDRUN 4×4×4 (easy)
3×3×3 (busy)
5分上限 1個 2: 90%
4: 10%
2048タイルを作った瞬間に即クリア終了し、到達ミリ秒を競う。
HARD 3×3×3 固定
(27マス)
5分 コンボ中: 80%で1個 / 20%で2個
非合体時: 確定2個
枠ごとに12%でGLITCH
通常枠は 2:75% / 4:20% / 8:5%
合体不可のグリッチが出現。隣接6マスでの合体衝撃波で破壊可能(+50点)。
PARTY 4×4×4 固定
(64マス)
5分(加時あり) 毎手 1〜4個
(一様ランダム)
通常時: 2:90% / 4:10%
FEVER時: 4:50% / 8:35% / 16:15%
時計付きタイル(通常7%・FEVER中14%)の合体で+3〜+15秒回復。FEVER中は時間凍結&スコア3倍。

表を見るとわかる通り、同じ3Dパズルでもモードによって別ゲーレベルの数値設計になっています。とりわけSPEEDRUNモードは「2048に到達した時点でタイマーが止まって終了する」のに対し、CLASSIC・HARD・PARTYの3モードは2048達成後もそのまま4096や8192を目指して続行できる仕様です。

03. spawnTile関数に見るモード別の乱数分岐コード

「本当にその確率で出ているの?」と気になる開発者やスコアアタッカーの方もいるでしょう。うちではブラックボックスな調整はせず、クライアント側の `js/game-core.js` にある `spawnTile()` と `spawnTilesForMove()` で明確に分岐させています。実際のコードは以下の通りです。

// js/game-core.js より抜粋:1手ごとのスポーン個数決定
spawnTilesForMove() {
  const spawned = [];
  if (this.gameType === 'hard') {
    const count = (this.comboCount === 0 || Math.random() < 0.20) ? 2 : 1;
    for (let i = 0; i < count; i++) {
      const t = this.spawnTile();
      if (t) spawned.push(t);
    }
  } else if (this.gameType === 'party') {
    const count = Math.floor(Math.random() * 4) + 1; // 1, 2, 3, or 4個
    for (let i = 0; i < count; i++) {
      const t = this.spawnTile();
      if (t) spawned.push(t);
    }
  } else {
    const t = this.spawnTile();
    if (t) spawned.push(t);
  }
  return spawned;
}

ここで開発中に一番悩んだのが、HARDモードのバランス調整でした。最初はシンプルに「毎手1〜3個ランダムに出して、8もバンバン混ぜよう」と組んでみたのですが、27マスしかない3×3×3空間で毎手3個も湧くと、十数手で盤面が埋まってどうしようもない運ゲーになってしまったわけです。

そこで現在の実装では、「合体(コンボ)を繋いでいる間は80%の確率で1個しか湧かないが、合体のない空振り移動(`this.comboCount === 0`)をした瞬間にペナルティとして確定で2個湧く」というルールに改めました。これによって、プレイヤーが毎手きっちり合体ペアを見つけて動かし続ければ盤面の圧迫を抑えられる、技術介入度の高いバランスに落ち着いたと思うわけです。

04. コンボとFEVERの計算式:5手ではなく「累計5組」にした理由

もうひとつ、プレイしていて誤解されやすいのが「FEVER(フィーバー)」の発動条件です。画面上部のコンボゲージが満タンになると突入するアレですが、これは「5手連続で合体させる」ことが条件ではありません。正確には、「合体が発生する手を切らさずに続け、その間に合体したペアの累計組数(`comboCount`)が5組以上に達すること」が条件です。

// js/game-core.js より抜粋:コンボ加算とFEVER突入判定
const mergeCount = mergeEventsAll.length;

if (mergeCount > 0) {
  this.comboCount += mergeCount;
  if (!this.feverActive && this.comboCount >= 5) {
    this.feverActive = true;
    this.feverMovesLeft = 5;
    feverTriggered = true;
    if (this.gameType === 'party') {
      this.feverFreezeStart = performance.now();
    }
  }
} else {
  this.comboCount = 0;
}

なぜ「5手連続」ではなく「累計5組の合体」にしたのか。それは3次元空間ならではの「1手で複数ラインが同時に合体する快感」をそのまま評価したかったからです。たとえば1手目で3組同時マージを決め、次の2手目で2組同時マージを決めれば、`3 + 2 = 5` 組となり、たった2手で即座にFEVERへ突入します。この挙動は自動テストスクリプト(`verify_adsense_quality.mjs`)でも毎回検証しており、まとめて合体させる準備を整えたプレイヤーほど早くFEVERの恩恵(スコア2倍、PARTYなら3倍+タイマー凍結)を受けられる設計になっています。

ただし、FEVER中に1回でも「移動はしたけれど1組も合体しなかった手(`mergeCount === 0`)」を打ってしまうと、残り手数(`feverMovesLeft`)が残っていてもその瞬間にFEVERは強制終了します。余談ですが、僕もスコアアタック中にうっかり整地の手を挟んでFEVERを自爆終了させることがよくあるので、ゲージ点灯中はまず合体できる軸があるか(D-Padの緑色ヒント枠が出ていないか)を確認するのがおすすめです。

05. プレイスタイル別のモード選びと検証導線

最後に、どのモードから遊ぶべきか迷っている方へ、とりあえずの指針をまとめておきます。

  • まずは空間の向きと角固定を掴みたい方:CLASSIC(4×4×4・タイマーなし) から始めるのが一番穏やかです。時間に追われず、カメラを回しながら6方向の動きを確かめられます。
  • 1手ごとの合体と空きマスの増減を論理的に確かめたい方:新規タイルが出現しない検証用の 局面練習(Practice) ページを開いてみてください。本編とまったく同じ `Game2048Core` エンジンを使って、6方向すべての分岐結果を一覧表で比較できます。
  • 短時間で脳汁が出るハイスピード展開を味わいたい方:迷わず PARTY モードか HARD モードへどうぞ。対戦お願いします!
Play & Verify in Browser

4つのモードの挙動をブラウザで確かめる

インストールや登録は不要です。タイマーなしのCLASSICモードや、1手ずつ比較できる局面練習ツールを今すぐ開けます。

🎮 CLASSIC(無制限)で遊ぶ ➔ 📐 局面練習ツールを開く