手続き型ダンジョン生成:これらの部屋すべてを最小限の廊下を使用して接続することを確認する簡単なアルゴリズムはありますか?


9

廊下をあまり持たずにすべての部屋をつなぐハイブのような構造にすることは可能ですか?(1つの部屋から来る3-4以上の廊下が多すぎる)

以下は、私の部屋がどのように見えるかの出力です。基本的にはランダムに配置されています。

ランダムに配置されたグリッドルームの出力

廊下ごとに実現したいこと。

http://i.imgur.com/9GUi6Yy.png


3回や4回は「廊下が多すぎる」とは思いません。特にあなたのダンジョンに9部屋がある場合。さらに、「ハイブのような構造」が何を意味するのかわからないので、どのような外観を目指しているのか詳しく説明していただけませんか。
2013

多分、あなたが持っていることに興味があるものを示すために「完成した」地図を含めてください。
MichaelHouse

ああ、はい、私は各部屋から最大3つまたは4つの廊下が来ることを意味しました。
Blenderer 2013

廊下までのイメージを追加しました。
Blenderer 2013

2
どの部屋からも廊下が3つない場合は、部屋を単純に直線で結ぶだけなので、1つを選択して、隣接していない2つの隣接する部屋に結合するだけです。
ニック

回答:


6

さて、私が考えることができる最も簡単な方法は、すべての部屋が少なくとも1つの廊下で接続されていることを確認することから始まります。

  1. 最後または最初の部屋から始めます。
  2. まだいくつかの部屋に接続されていない1距離以内のランダムな部屋をつかみます(すべての部屋は接続が解除されているので、これを追跡します)。
  3. そのような部屋がない場合は、距離+1に移動します。別の部屋の上下にトンネルを張っても問題ない場合は、コリドーを接続したくない場合に、これは簡単です。
  4. すべての部屋が接続されるまで、擬似ランダムに通り抜けます。

これで、すべての部屋に到達できることがわかりましたが、この厳密に線形の迷路以上が必要な場合は、部屋をステップスルーして、部屋を接続するための新しいパスをランダムに作成し、部屋ごとに2〜3個の制限まで、または部屋の特定の割合が最大接続数に達するまで-など

最後のステップとして、さまざまな状況に合わせて結果を変更するルールを追加できます。たとえば、廊下が1つしかない部屋は、定義上、行き止まりになっていることがあります。より多くの行き止まりを作るか、すべてに少なくとも2つの接続があることを確認することで、それらすべてを排除できます。あなたは行き​​止まりに秘密の通路を作ることができます。あなたはボスルームが行き止まりであることを確認することができます。最初の部屋が行き止まりであることを確認できますが、2番目の部屋には最低X個の接続があることを確認してください。無限の広告。

それぞれの仮定とルールによって、レベルの外観が根本的に変わる可能性がありますが、それは楽しみの一部です!これにより、少なくともハイブ/洞窟のような部屋が開始されます。


これはKruskalの最小スパニングツリーアルゴリズムにかなり近いです。これにより、2の条件が「まだ一部の部屋に接続されていない」から「同じクラスターにまだ接続されていない」に変更され、上記のルールのバグが修正されます。各部屋はいくつかの部屋に接続されてますが、ダンジョンは全体として、複数の接続されていない島を形成しています。Kruskalは、最小の総廊下長を持つ接続グラフを見つけることが保証されています。
DMGregory

3

すでに接続されている部屋を構築するだけです。1つの部屋から始めて、他の部屋への1〜3つの廊下を作成します。次に、十分な数の部屋を追加するまで再帰します。


2

これらの部屋は2Dプレーンに埋め込まれたグラフの頂点であるため、これは理論的には巡回セールスマン問題を解決することで実行できます(これはいくつかの部屋で十分です)。明らかに、単純なヒューリスティックが適切であり、妥当なスケーラビリティを可能にします。

すべての部屋間のエッジ(廊下の長さ)を計算します。長さで並べ替えます。サイクルを作成したり、頂点(ルーム)の次数を希望の最大値(3-4)(繰り返し)を超えない限り、最短のコリドーを追加します。サイクルを確認するには、UnionFindを適用するか、小さなデータに対してクイックBFSを実行します。


この答えは、受け入れられた答えよりも優れています。最短の接続廊下を最初に選択するという貪欲な戦略が機能するはずです。サイクルを回避するために、廊下が接続されている部屋には接続しないでください。
Jelle van Campen

@JellevanCampenありがとう。;)2つの分離された接続コンポーネントがある場合があります。したがって、2つのノードが接続されている場合は、おそらくunion findを使用するか、BFSで確認する必要があります。
AturSams 2015

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