このゲームは、Windows、Linux、そしてブラウザで動作する13 KiBの単一ファイルです。
95日前原文(iczelia.net)
概要
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種実装、単一ファイル配布の工夫
- 技術的チャレンジやバイナリ解析に興味のある開発者向けの事例