開発者が200行未満の Bash で2048ゲームを作成、ゲーム状態全体を単一の64ビット数値で保存

BigGo コミュニティ部
開発者が200行未満の Bash で2048ゲームを作成、ゲーム状態全体を単一の64ビット数値で保存

人気パズルゲーム2048の巧妙な実装が、その驚くべき効率性で開発者たちの注目を集めている。このターミナルベースのバージョンは、200行未満の bash スクリプトにゲーム全体を収めながら、すべてのゲーム状態情報をわずか単一の64ビット数値で保存している。

コード統計:

  • 実装: 200行未満の bash スクリプト
  • 状態保存: 単一の64ビット数値 (STATE=1939536775777635469)
  • ボードサイズ: 4x4グリッド
  • セル状態: 12の可能な値 (空、2、4、8、16、32、64、128、256、512、1024、2048)
  • セルあたりのビット数: 4ビット
  • ランダムシード範囲: 0-99 (64ビット状態内に格納)

スマートな設計による印象的なコード圧縮

この実装の簡潔さは、コードの重複を排除する巧妙なボード回転トリックから生まれている。4つの方向(上、下、左、右)すべてにタイルを移動させる別々のロジックを書く代わりに、開発者は左方向の移動を処理する単一の squish 関数を作成した。他の方向については、squish 操作を適用する前後でボードを回転させるだけで済む。このアプローチにより、必要なコード量が劇的に削減された。

この技術は、すべての移動を同じ基本操作のバリエーションとして扱い、ゲームボードの回転したビューに適用するだけで機能する。

技術実装の詳細:

  • ボード回転トリック: 左方向の移動に単一の「squish」関数を使用
  • 移動制御: 上/左/下/右の移動に w/a/s/d キーを使用
  • 状態エンコーディング: セル当たり4ビット × 16セル = 合計64ビット
  • 決定論的モード: 再現可能なゲームプレイのために STATE 環境変数を設定
  • インストール: 単一の curl コマンドでダウンロードして実行

64ビット状態保存が技術的議論を呼ぶ

ゲームが完全なボード状態を単一の数値で保存できる能力は、開発者間で大きな議論を呼んでいる。各セルは12の可能な値のいずれかを保持できる:空、2、4、8、16、32、64、128、256、512、1024、または2048。これらの状態はそれぞれ4ビットに完全に収まるため、4x4グリッドは合計で正確に64ビットを必要とする。

しかし、コミュニティメンバーの一部は潜在的な最適化を指摘している。理論的な最小値は約60ビット程度であり、可能なボード状態の総数は64ビットが表現できるものより小さいからだ。また、現在の実装では実際にその64ビットの一部を0から99までのランダムシード値の保存に使用しており、ゲーム状態を共有する際に決定論的なゲームプレイを可能にしていることも指摘されている。

制限とトレードオフ

このコンパクトな設計には一定の制限が伴う。オリジナルの2048ゲームとは異なり、このバージョンは2048タイルに到達した後は続行できない。64ビットの制約により、拡張版で可能な4096以上のより高い値にタイルを成長させることもできない。

「ボード回転トリックは短いコード長を実現するために非常に素晴らしい!」

一部のユーザーは、特定の位置のタイルが移動中に予期せず値を変更する可能性がある、コーナーに焦点を当てた戦略を使用する際の偶発的なバグを報告している。

標準的な 2048 との比較:

機能 Bitwise 2048 標準的な 2048
コード長 200行未満の bash 様々(通常はもっと長い)
最大タイル 2048 2048 を超えて継続可能
状態共有 あり(64ビット数値) 組み込み共有機能なし
プラットフォーム ターミナル/コマンドライン Web / Mobile アプリ
決定論的リプレイ あり 通常はなし

共有と決定論的ゲームプレイ

ユニークな機能の一つは、プレイヤーが64ビット数値を渡すだけで正確なゲーム状態を共有できることだ。 STATE 環境変数が設定されると、ゲームは完全に決定論的になり、同じ移動シーケンスが常に同一の結果を生成することを意味する。これにより、困難なポジションを共有したり、興味深いゲームを正確に再現したりすることが可能になる。

この実装は、創造的なエンコーディングとアルゴリズム的思考により、複雑なインタラクティブプログラムを完全な機能を維持しながら驚くほどコンパクトなコードに圧縮できることを実証している。

参考: The Bitwise Challenge: 2048