ローグのような2Dダンジョン生成に最適なアルゴリズムは何ですか?[閉まっている]


47

ダンジョン世代のコンテキストでの手続き型コンテンツの生成に関する優れたリソースは何ですか?

私が見つけた最も近い記事は、2d迷路を生成するアルゴリズムでした。これは、私が探しているものとはまったく異なります。部屋や接続された廊下などの機能が理想的です。

ありがとう!


1
また、迷路の生成を見てください。
アンソニー

回答:


27

これは以前に多かれ少なかれ回答されています。あなたの最初の立ち寄り場所はhttp://pcg.wikidot.com/である必要が

あります。これはまったく有益な回答ではないと非難されたので(実際に? )、wikiのこのページでは、Dungeonジェネレーターを具体的に扱っており、このテーマに関するさまざまな記事へのリンクがあります。
http://pcg.wikidot.com/pcg-algorithm:dungeon-generation

手続き型コンテンツの生成は非常に創造的なアプローチであり、あらゆるアイデアが有効であるため、ウィキ全体を閲覧することをお勧めします。これは、ラテラル思考の課題であり、それは楽しいものです。


「すべてのアイデアが有効」の+1ですが、それについて明確にしたいと思います。すべてのアイデアは有効ですが、一部は他のアイデアよりもうまく機能します。あなたの<曖昧なコンピューターの専門用語>アイデアは機能し、おそらくあなたが望むものですが、あなたがどちらかでない限り、より効率的、よりランダム、より凝集的、よりカスタマイズ可能な、またはそれらの組み合わせになる他の方法があります本当に良いか本当にラッキー。
ニックハートリー

20

正方形グリッドに基づいて次のアルゴリズムを使用することで、かなり良いレベルを得ることができました。

最初に、部屋のセットを作成します。ランダムパラメーターは、部屋のサイズと部屋の数を定義します。適応アルゴリズムは、大きな廊下で作られたゾーンと非常に小さな部屋のゾーンを定義することさえできます。

次に、すべての部屋が互いに接続されていることを確認する必要があります。このために、パスファインダーを実行して、各部屋のペアで廊下(たとえばA *)を掘り、既存のスペース(部屋または他の廊下)にランダムに選択した重みを、まだ刻まれていないスペース(壁)と比較して与えます。重量の差が小さい場合、新しい廊下を掘るのはかなり安くなり、アルゴリズムは部屋の間で多くの廊下を作り、場所から別の場所に行く可能性が多くなります。重みの差が大きい場合、アルゴリズムは既存の部屋と廊下を通過することを好み、特定の目的地に到達するための経路をより蛇行させ、選択肢を少なくします。

これにより、少数のパラメーターから、非常に異なる外観レベルを作成することができます。狭い廊下が密に相互接続された部屋の巣のような迷路にリンクしているまばらな巨大ホールから。

生成されたレベルの例を次に示します。

ここに画像の説明を入力してください

このアルゴリズムに基づいて、ゾーンに依存する壁の装飾を追加したり、廊下を小さくしたり大きくしたり、特別な部屋を作成したりできます。


10

コードを読むのが好きでC#を解析できる場合、私のローグライクアマランスが使用するダンジョンジェネレーターを提案できますか?それはですここ。接続された部屋、拡張可能な機能、その他の便利な機能を処理します。

プロジェクト全体をプルダウンしてビルドする場合、ダンジョンを生成および描画するスタンドアロンツールがあり、ダンジョンを微調整して動作を確認できます。


1
数ヶ月前のように思えたアマランスに出くわしましたが、ダンジョン世代になった頃には名前を忘れていました。リンクをありがとう!
ガブリエルアイゼンバーグ

2
で、あなたの記事journal.stuffwithstuff.com/2014/12/21/rooms-and-mazesが、私はなど別の廊下世代エンジンのようないくつかの余分な機能を持つものの修正版を使用して、あまりにも本当に良いです
Tobsta

3

これらはすべて素晴らしいアイデアです。RogueBasinとpcg.wikidot.com から少し取って、C#で独自の実装を作成しました。

私は、セルオートマトン法を使用して生成できる洞窟のようなレベルの「自然な」外観が本当に好きでした。セルオートマトン法の意味を理解するには、ConwayのGame of Lifeを想像してください。私のコードは4-5メソッドと呼ばれるものを使用しています。つまり、タイルが壁であり、その9つの隣人の4つ以上が壁である場合、または壁ではなく5つ以上の隣人が壁である場合、タイルは壁になります。マップを壁またはスペースでランダムに埋めることから始め、次に各x / y位置に繰り返しアクセスして、4-5ルールを適用します。孤立した洞窟を形成する問題を軽減するために、マップをランダムに埋めた後、各タイルに4-5ルールを適用する前に、マップ全体の水平線を空白にして、壁ではなくスペースに設定します。

マップハンドラクラスのコードと、ここで行った改善を表示できます。

またはここにアーカイブされたバージョン。


2
この質問にはたくさんの票がありますが、この答えをもう少し開けばいいでしょう。リンクは最終的に死ぬ傾向があるので、リンクをクリックする必要がないように答えてみてください。それはどのように機能しますか?主なアイデアは何ですか?他のアルゴリズムとどう違うのですか?
カトゥ

1
リンクは実際に死にました。
htmlcoderexe

2

これを見つける最も直接的な場所は、ソースコードを実際に見ることだと思います。この分野の2つの主要なプレーヤー、AngbandとNethackは両方ともオープンソースです。


3
オープンソースですが、私が覚えているのは、非常によく文書化されたソースでも、透明なソースでも、学習のために書かれたソースでもありません。微調整を簡単にハッキングできますが、全体的に理解するのははるかに困難です。
トムハドソン

オリジナルは素晴らしいリファレンスではないかもしれませんが、膨大な数のバリアントがあり、そのうちのいくつかは優れています。たとえば、UnAngbandの開発者はダンジョン世代にいくつかの機能強化を行い、一連の優れたブログ投稿を書いので、コードではなくアイデアを間違いなく使用できます。
コンガスボン14年

NetHackのソースは理解が難しいことで有名です。ダンジョンジェネレータ(そのうちの一つ)が無未満THREE Cファイル全体に広がっており、約15の機能
エレクトラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.