TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

【バイブコーディング】レトロ戦略ゲームを作る

ゲームボーイウォーズというターン制戦略ゲームがある。

1991年に発売されたゲームボーイ向けのゲームだが、当時結構遊んでいた。
続編で、ゲームボーイウォーズターボや、ゲームボーイウォーズ2といったシリーズが発売されている。

あらかじめ用意されているマップでCPUと対戦する形だが、マップをすべてクリアすると飽きるのでもっとマップが欲しいと思っていた。
いつか自作して、好きなマップで遊べるようにしようと思っていたが、実際作るのは大変すぎるのであきらめていた。

ここ数か月、GPT-5.3-CodexやGPT-5.4を使っていて、驚異的なコーディング能力を体験したことで、以前に作りたかったソフトもノーコードで作れる気がしているので、試してみることにした。

方針

  • コードは書かない
  • ゲームルールはDeepResearchしたものを入力する
  • ゲームルール以外は生成AIでオリジナルなものを作る(画像やUIを真似ると著作権上問題があるため)
  • Windowsアプリとする

ゲームルール

GeminiのDeepResearchで、調べたゲームルールをマークダウン形式でリポジトリに配置して、Codexが読めるようにした。
内容の正しさは確認していない。

実装方針

まずは、どのような方針で実装するかをCodexに出力させた。

  • ゲーム基盤(ルールを実装)
  • ゲームエンジン(UI状態、シーン管理など)
  • CPU思考
  • コンソールアプリ

から始める作ることを推奨された。

GUIから作らず、コンソールから作るのは実際の開発でも行うので理にかなっている。

生成

準備として、Visual Studioで、C++/WinUI3のブランクソリューションを作成して、空のプロジェクトを用意した。

そこから、以下のプロンプトで生成した。

design/deep-research-report.md にあるゲームボーイウォーズの仕様を元に、クローンゲームを作りたい。
商標を避けるためゲーム名は「Hex Front」とする。

まずは、Core部分と簡単なAIを実装して、コンソールでテストプレイできるまでを実装してください。

### プロジェクト構成

1. HexFront.Core

種類: C++ Static Library
役割: ゲームルール本体

2. HexFront.AI

種類: C++ Static Library
役割: CPU思考と探索
依存: HexFront.Core

3. HexFront.Console

種類: C++ コンソールアプリ
役割: コンソールでの最低限のゲームプレイ
依存: HexFront.Engine, HexFront.AI, HexFront.Core

今後、GUIで本格的なゲームを実装することを考慮して、CoreとAIはコンソールに依存しないようにすること。
C++20のモダンな実装とすること。

コンソールアプリ

一度目の生成で、コンソールで遊べる状態まで出力された。

合法手生成、CPUまで実装されている。

Hex Front console prototype

Commands
  show           show board and summary
  units          list current side units
  actions <id>   list actions for one unit
  builds         list production actions
  all            list all legal actions
  do <index>     execute from last listed actions
  undo           undo last action
  redo           redo last undone action
  history        list executed actions
  replay [index] show replay list or one replay frame
  surrender      concede immediately
  end            end the current turn
  ai             let AI play the current side
  help           show this help
  quit           exit

Day 1  Turn: Red  Funds(R/B): 14000 / 14000

Board
       0   1   2   3   4   5   6   7   8
  0  ... .mt ... ... ... ... ... ... ...
  1    ... R05 .fo ... .cy ... .fo B12 ...
  2  ... R01 .fo ... .rv ... B08 Bcy B10
  3    .rd Rhq R03 .rd .br .rd B09 Bhq .rd
  4  R04 Rcy R02 ... .rv ... Bfa B07 ...
  5    ... R06 .fo ... .cy ... .fo B11 ...
  6  ... ... ... ... ... ... ... .mt ...

Units for Red
#1 Infantry hp=100 str=10 ammo=9 fuel=99 pos=(1,2) ready
#2 Engineer hp=100 str=10 ammo=3 fuel=70 pos=(2,4) ready
#3 Tank B hp=100 str=10 ammo=4 fuel=32 pos=(2,3) ready
#4 Supply hp=100 str=10 ammo=0 fuel=60 pos=(0,4) ready
#5 Transport Heli hp=100 str=10 ammo=8 fuel=60 pos=(1,1) ready
#6 SP Art B hp=100 str=10 ammo=4 fuel=30 pos=(1,5) ready

GUI版の準備

GUI版は、画像素材が必要になるため、いきなり生成を依頼しても画像素材まで作ることは期待できない。
そこで、事前準備として提供が必要なものをリストアップさせて、どのような形式で配置すればよいか出力させた。

地形とユニットの画像素材の形式と一覧が提示されたので、デザイナーに発注するための詳細な指示書を出力させた。
デザイナーに発注するわけではなく、生成AIで出力するためである。
具体的な色の指定やサイズ、ファイル名などの納品形式もすべて記載されている。

画像生成AIで一つずつ画像を生成するのは大変なので、いったんちゃんとした素材を作る前に、とりあえず形式が合った素材さえあれば良いので、いったんその指示書を元にコードインタープリタで素材一式を作成した。
すべてのファイルが指定したファイル名で作成されて、メタ情報が記載されたxmlと合わせたzipファイルが生成できた。

zipを展開して、指示されたアセットフォルダに格納した。

GUI版生成

準備ができたので、GUI版を生成した。

design/deep-research-report.md にあるゲームボーイウォーズの仕様を元に、クローンゲームを作りたい。
商標を避けるためゲーム名は「Hex Front」とする。

ゲームの基礎部分と、テスト用のコンソール版はすでに実装している。

GUI版をHexFrontフォルダにあるC++/WinRT(WinUI3)のプロジェクトに実装してください。

### GUI技術
- SwapChainPanelで描画領域を作る
- 文字の描画にはDirectWriteを使用
- ウィンドウのクライアントサイズを96DPI基準で、1024×768とする
- DPIによらず見た目上同じサイズになるようにする
- DPIに依存しない実装例:
  - DPIスケーリングは SwapChainPanel + DXGI + D2D の座標系を分離して実装する。
  1. レイアウト座標はDIP、SwapChainバッファは物理ピクセルで扱う。
  2. スケール値は SwapChainPanel.CompositionScaleX/Y を正とし、これを唯一の基準にする。
  3. SwapChainのWidth/Heightは round(ActualWidth * CompositionScaleX), round(ActualHeight * CompositionScaleY) で計算する。
  4. ID2D1DeviceContext::SetDpi と D2DターゲットBitmapのDPIは 96 * CompositionScaleX/Y を使う。
  5. IDXGISwapChain2::SetMatrixTransform は inverse scale(1/CompositionScaleX, 1/CompositionScaleY)を設定する。
  6. SizeChanged / CompositionScaleChanged / XamlRoot.Changed の各イベントでサイズ依存リソースを再計算する。
  7. 描画ロジック(線のX/Y計算)はDIPのみを使い、ピクセル値を混在させない。

### 画面一覧
- 初期実装では対局画面を表示して最低限プレイできること
- 今後、タイトル、マップ選択、シナリオ・マップエディットなどが追加される

### 操作仕様
- マウス主体

### ゲーム素材
- Terrain: `HexFront/Assets/Game/Terrain/`
- Units: `HexFront/Assets/Game/Units/`
- UI: `HexFront/Assets/Game/UI/`
- Metadata: `HexFront/Assets/Game/Metadata/`
  - Asset catalog: [assets.json](/d:/src/HexFront/HexFront/Assets/Game/Metadata/assets.json)
  - `assets.json` is the source of truth for filenames, kinds, sizes, origins, and `tintable` flags.
- 1マス16x16で納品されているため、ゲームでは64x64に整数倍拡大して表示する(フィルタは nearest neighbor)

### 基本部分実装済み
- HexFront.Core: ゲームルール
- HexFront.Engine: ゲームエンジン(コンソール/GUI 非依存)
- HexFront.AI: CPU思考と探索
- HexFront.Console: コンソール版(テスト用)

### 仕様
- design/deep-research-report.md: ゲームボーイウォーズ仕様
- design/additional-report.md: ゲームボーイウォーズ仕様(追加)
- design/24x24damage-matrix.md: ダメージ表
- design/gui-art-brief.md: ゲーム素材作成指示書

生成結果

Visual StudioのDeveloper PowerShellからCodexを起動しているので、ビルドも自動で行ってコンパイルエラーも解消してくれる。

生成されたコードを実行したところ、ルール通りに基本的な操作ができるゲームになっていた。


まとめ

生成AI(GPT-5.4)を使い、昔遊んだ『ゲームボーイウォーズ』風のゲームをコードを書かずに作れるか実験した。
DeepResearchで調べたルールを入力するだけで、コードを一切かかず、GUI版で実際に動作するゲームが完成した。
これに、マップエディタを追加すれば、以前作りたかったものが完成しそうである。

ただし、ゲームとして完成度を高めるには、画像素材のクオリティを上げて、UI操作を改善する必要がある。
音楽と効果音に関しては、生成AIで作るには課題がありそうである。

商用レベルまでクオリティを上げるのは難しいと思うが、そこそこの遊べる状態まで作って、ストアで公開するつもりである。