グラフのエッジの数を減らし、接続を維持する


10

私はランダムに生成されたダンジョンでゲームをデザインしています。これを、ノードが部屋であり、エッジがドアまたは廊下である、接続された無向グラフとして表示したいと思います。次に、ダンジョンの入口として「サイド」ノードを選択し、この入口と他のすべてのノードとの間の距離を計算し、最も遠いノードの1つをダンジョンの「ゴール」(宝物、ボス、プリンセスなど)。

最終的なダンジョンの地形を生成する2つの方法を見ました。

  • 最初にランダムグラフを生成し、エッジの接続を尊重して、ランダムな場所にある部屋で2Dワールドを塗りつぶします。部屋の生成が不可能な場所に部屋を適合させようと「ロック」される可能性があるため、これは時々困難になると考えました。
  • 最初の部屋を生成し、それらが収まる場所にランダムに配置してから、結果をノードとエッジにマッピングします。私はこれを試すことにしました。

私の考えは次のとおりです。

  • 最初に、ダンジョン全体を含む大きな部屋を生成します。
  • 大きな部屋の内側のランダムな場所に壁を置き、大きな部屋を異なる面積の2つの小さな部屋に分割します。
  • 次に、部屋が小さすぎるか、部屋の総数が最大(またはその他の条件)に達するまで、各部屋を2つに分割し続けます。新しい部屋はそれぞれノードです。
  • 終了したら、各部屋をチェックして、隣接する他のすべての部屋を見つけ、2つのノードをエッジで接続されているものとしてマークします。

そうすることで、すべての部屋が2Dの世界で可能な場所に配置され、接続されたグラフによって正しくマッピングされるようにします。

私の問題は、部屋をつなぐドアと廊下が多すぎることです。

したがって、接続された無向グラフのエッジの数減らし、最終的には接続されまま(すべてのノードが到達可能なまま)のアルゴリズムが必要です。


あなたが知りたいのであれば、あなたのアイデアは基本的に二分探索木です。私はそれを使いました。それはかなり良いダンジョンを作り、簡単です。:)
共産主義者のダック

2
参考:完全なグラフでは、頂点のすべてのペアの間にエッジがあるため、(重複したエッジは許可されないと仮定して)エッジを削除して完全なグラフを保持することはできません。右の項は連結グラフです。
Michael Madsen

二分探索木、連結グラフ、右。物事の慣習的な名前がとても下手です。
Splo

回答:


13

Primのアルゴリズムを使用してグラフの最小全域木を取得し(ランダムな重みを追加するか、入り口近くに高い重みを追加するか、選択したアルゴリズムを実行します)、ドア/エッジをランダムに再追加します。これにより、すべての部屋が接続され、余分なパスがいくつか追加されます。


1
もちろん、最小の全域木です!良い考え、ありがとう。
Splo


0

このリストにあるInkwell Ideasのダンジョンジェネレーターの一部は、オープンソースであるか、それらのアルゴリズムに関するドキュメントを提供しています。グーグルはまた、「[programminglanguagename]ダンジョンジェネレーター」の検索によってあなたにたくさんを与えるでしょう。残念ながら、私のお気に入りはこれらの方法のいずれでも見つけることができません。これまで出会った中で最もよく文書化されているにもかかわらず、最近ハードドライブのクラッシュで失ったため、その名前を思い出せません。そのドライブでリカバリを実行した後で、この回答を更新します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.