概要
Justine Tunney の cosmopolitan libc プロジェクトに触発され、 GUI非対応 や バイナリ肥大化 の課題を踏まえて、 16KiB未満のマルチプラットフォームゲーム 制作に挑戦。 Snakeゲーム を Windows、Linux、ブラウザ で単一ソースから動作するよう実装。 各プラットフォームごとの工夫 や バイナリ圧縮技術 を駆使し、 最終ファイルサイズ13,312バイト を実現。 ゲーム内容や操作方法、 レベル進行、 実装技術詳細 を解説。 ファイル構造や起動メカニズム も詳述。
マルチプラットフォーム対応Snakeゲーム制作記
- cosmopolitan libc はCソースを 複数OS対応の単一バイナリ にできるツールキット
- GUI未対応 や バイナリ肥大 の課題を背景に、 独自アプローチ で小型ゲーム制作に挑戦
- 目標 : 16KiB未満 の Snakeゲーム を Windows、Linux、ブラウザ で動作させること
- 単一ソースファイル から全環境向けにビルド・実行可能な設計
ゲーム内容・操作
- クラシックなSnakeゲーム ルールを全プラットフォーム共通で実装
- 操作方法 : 矢印キー または WASDキー で移動、 ESC で終了(対応プラットフォームのみ)、 R でリセット、 P で一時停止、 スペース で開始
- スコア管理 :食べ物1つで 10点、 15%確率で出現する黄色フルーツ は 20点
- フルーツの出現・消滅 :一定間隔で出現し、食べられなければ一定時間で消滅
- 消滅タイマー はスネークの長さに比例
- 10個のフルーツを食べると次レベル進行、壁配置がランダム化
- 迷路生成 :常にスネークの頭からフルーツまでの経路が存在
- 初期配置 もランダム、進行方向に最低5マスの空きスペースを保証
各プラットフォーム向け実装
- Windows版 :WinAPIを使い i686 Visual C 向けC言語で実装
- 圧縮スクリプト で デコンプレッサスタブ を付与
- PEヘッダ の余白を利用し、 シェルスクリプト を埋め込む
- Windowsのapphelp機構 に依存し、初回起動時にエラー表示される場合あり(再実行で解消)
- Linux版 : x86_64 Linux 向けにClangとX11でC言語実装
- lzma圧縮 と 小型シェルスクリプトドロッパ でバイナリ展開・実行
- HTML5版 : JavaScript と HTML5 Canvas で実装
- ファイル先頭のガーベジデータ を無視し、 CSSで不可視化 して本体レンダリング
ファイル構造と起動メカニズム
- 3つの実装バイナリを連結 し、各プラットフォームが 自身に対応する部分のみ実行
- Windows :PEヘッダ認識でWindowsコード実行
- Linux :シェルスクリプトでバイナリ抽出・展開・実行
- ブラウザ :HTMLタグまでスキップし、通常のWebページとして解釈
- 最終ファイルサイズ : 13,312バイト
- コード抜粋 や バイナリレイアウト も詳細に分析
技術的工夫
- PEファイル と シェルスクリプト の共存による ポリグロット設計
- LZMA圧縮 と シェルドロッパ でLinuxバイナリの小型化・展開
- HTMLとCSSの悪用 で不要データの非表示化
- 全てのバイナリを1ファイルにまとめる ことで、 クロスプラットフォーム性と小型化 を両立
まとめ
- cosmopolitan libc の課題を踏まえた 独自アプローチ
- マルチプラットフォーム で動作する 極小ゲーム の実現
- 圧縮・埋め込み技術 や バイナリフォーマットの知識 を活かした設計
- C言語とJavaScript による 3種実装、 単一ファイル配布 の工夫
- 技術的チャレンジ や バイナリ解析 に興味のある開発者向けの事例