ゲームの開始時に作成された手続き的に生成された世界でゲームを作成しています。グリッドで表されるいくつかの領域で構成されています(8x8、9x6、サイズは理想的には任意です)。これらの領域は、依存関係リストを介して互いに接続されることになっています。
そのグリッドの少なくとも3つのスペースがこれらの2つの領域の間に露出している場合、接続が存在します。その3つのスペース接続エリアの中央のセルには、エリア間の出入り口があります。
私はそれらを接続する方法を見つけようとしてきましたが、同時に考慮する必要のある領域が増えるにつれて、ますます複雑になります。
ペーパープロトタイピングをいくつか試しましたが、視覚的に行うのは非常に簡単なプロセスですが、コードによって同じ効率で部屋を配置できる優れた数式のセットは見つかりませんでした。
これが私が今苦労している「単純な」例です:
- エリア「a」は「b」および「c」に接続する必要があります
- エリア「b」は「a」と「d」に接続する必要があります
- エリア「c」は「a」と「d」に接続する必要があります
- エリア「d」は「b」および「c」に接続する必要があります
簡単にするために、リストに表示される順番で部屋を配置していることを考えてみましょう(他の人も試しました)。そこで、標準の手続き型ダンジョン生成アルゴリズムとしてこれにアプローチしています。
最初の領域なので、ボード上の任意の場所に「a」を配置します。次に、壁をランダムに選択します。その壁には何も接続されていないため、そこに「b」を配置できます。
ここで「c」を配置する必要がありますが、「a」はすでにボード上にあり、壁が占有されているため、別の壁に配置することにします。しかし、「d」が表示され、「b」と「c」にも接続する必要があるため、すべてのプレースメントが実行されるわけではありません。
同じ依存関係を持つ2つの部屋を反対側の壁に置くことはできないという制限を試みましたが、それでも成功を保証するものではありません。
また、エリアのサイズが異なる他のケースでは、反対側の壁にいるとうまくいきます。
また、有効なソリューションを除外するため、使用済みの壁を考慮しないことは欠陥のある仮定です。
Optimal Rectangle PackingやGraph Layoutアルゴリズムなど、他の手続き生成アルゴリズムなどの研究を調べてみましたが、通常、これらのアルゴリズムはこの問題のすべての制約を考慮しておらず、一緒に混ぜることは困難です。
適切な配置が見つかるまで領域とバックトラックを配置するなど、たくさんのアプローチを考えましたが、それらは試行錯誤に非常に依存しており、計算の面でコストがかかるようです。しかし、私が言及した最後の2つの問題に関する広範な研究を考えると、それが唯一/最良の解決策かもしれませんか?
私はちょうど誰かが過去に同様の問題を抱えていたか、またはこれを理解し、アルゴリズムをどこから始めるべきかについていくつかの指針を与えてくれるかどうかを見たかっただけです。または、失敗した場合は、設定した制約を緩めることを検討する必要があります。