TadaoYamaokaの開発日記

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

【バイブコーディング】レトロ戦略ゲームを作る その6(マップ自動生成)

前回は、バイブコーディングでAIをルールベースで実装して、SPSAでパラメータチューニングすることで遊びごたえのあるAIを実装した。

今回は、マップの自動生成を試す。

マップの自動生成

まず、ChatGPTで、ゲームのマップ自動生成の手法について調査した。

  • 戦略グラフを作る(Graph-based generation)
  • マルコフ近傍生成
  • 制約充足 + バックトラッキング
  • 進化的アルゴリズム
  • Quality Diversity (QD)

といった手法が提案された。

ターン制戦略ゲームでは、マップの公平性や戦略性が必要なため、全体構造を先に決めることが重要なため、単一手法ではなく、

「戦略構造を先に固定する手法」+「制約ベース生成」+「軽量評価(必要ならQD)」

のハイブリッドが良いとのこと。

それぞれの手法について、知見がないため、一つずつ試していくことにする。

最近のゲームで採用されている制約ベース生成の手法として、「Wave Function Collapse (WFC)」が有名ということなので、まずは、WFCを試してみる。

Wave Function Collapse (WFC)

Wave Function Collapseは、日本語にすると「波動関数の崩壊」という名前が付いているが、量子力学の波動関数に着想を得た手法のようである。

以下のような手順でマップを生成する。

1. 学習元のマップからNxNの局所パターンを抽出する
2. 初期状態では、すべてのセルはすべてのパターンを取りうる状態なる
3. エントロピーが最小(取りうるパターンの範囲が狭い)のセルを選択し、パターンを確定する
4. 確定したパターンを隣接するセルに伝播する(そのセルのパターンが絞られる)
5. 3.~4.を繰り返す

途中で、選べるパターンがなくなり、生成が失敗する場合が場合があるが、その場合はやり直すことになる。

ゲームボーイウォーズのマップからパターンを学習

WFCには、パターンを学習するマップが必要になるため、以前にネット上のマップ画像からデータ化したゲームボーイウォーズのマップを学習に使うことにする。

実装

WFCはオープンソースになっているが、ゲームボーイウォーズのルールに特化したカスタマイズを行うため、Pythonで再実装した。

WFCアルゴリズムでマップを自動生成するツールをPython(uv環境)で実装してください。

WFCアルゴリズムの解説は、wfc.mdにあります。
参考として、WFCアルゴリズムのC#実装は、WaveFunctionCollapseにあります。

パターンの学習元となるマップデータは、mapsディレクトリにあります。
生成結果は同じJSON形式で出力してください。

マップの制約:
- capitalは、ownerがredとblueで一つずつ
- それぞれのcapitalの位置は接近しすぎず、マップの中央付近にはない

初回の実装では、以下のようなマップが生成された。

赤の首都の周りに生産拠点がなく、自軍の占領都市が首都から離れていて、修正が必要である。

制約を加える指示を行い、生成結果を確認を繰り返した。

以下の制約を加えることはできますか?
- 2つのcapitalがseaで隔たる場合は、capitalの近くにportが必要
- portは、seaに隣接している
マップの縁に出現しやすい地形が考慮されていません。
マップの縁はパターンで考慮されていますか?
capitalの近くには異なるownerの建物は出現しにくいという制約を加えたい。
redとblueのownerの数は近くする制約を加えることはできますか?
未占領の建物(city,port,airport)の数を、マップの広さに対して制限したい

他にも、多数指示を行った。

最終的に、生成されたマップの例は以下の通り。

港の有無は、オプションで指定できるようにした。

港ありのマップ:

マップの縁のパターンに引きずられて海が多くなるため、海の割合をオプションで下げられるようにした。

海の出現を下げたマップ:


未占領の都市は、分散して出現するように制約を入れているが、ハード制約ではなくソフト制約のため、局所パターンに引きずられて思ったようなマップにはなっていない。

砂浜が陸地に出現していたり、川が海の中にあったりと、まだ足りていない制約もある。

WFCの限界

ゲームとして成立するように、未占領の都市の距離がそれぞれの首都から同じになるような制約など加えたが、局所パターンを元に生成するため思った通りには生成できなかった。

自然な地形を生成するには良いが、戦略性を盛り込むのは別の手法が必要ということがわかった。

まとめ

WFC(Wave Function Collapse)を使ったマップの自動生成を試した。
各種制約(首都配置、港条件、所有バランスなど)を追加しながら調整し、一定の品質のマップが生成できるようになった。
ただしWFCは局所パターン依存のため戦略性の制御が難しく、ゲーム性を満たすには他手法が必要であることがわかった。

次は、グラフベースの手法を試したい。