シードからランダムレベルを生成する方法 [閉まっている]


46

ランダムシードを使用してゲームレベルを生成するにはどうすればよいですか?同じシードは常にまったく同じレベルを生成する必要があります。

この例では、Wormsスタイルレベルになります。したがって、各レベルにはテーマ(草地、雪など)、基本地形、木などのさまざまなオブジェクトがあります。

それでは、この種のレベルジェネレータの作成をどこから始めますか?何が関係しますか?どのような概念を使用していますか?

良好なリンクに対するボーナスポイント(ワームなどで行われた方法に関連するものに対するボーナスボーナスポイント)

ありがとう。


ランダムレベル生成は、手続き型コンテンツ生成(PCG)とも呼ばれます。そして、まさにそれを扱うwikiがあります。pcg.wikidot.comはあなたにいくつかのアイデアを与えるはずです!:o)
カイ

1
Chris Crawfordには、興味深い記事があります。90年代前半に書かれましたが、それでも関連性があります。世界を構築する方法
アンソニー

同じ乱数ジェネレーターを使用するフォームまたはアルゴリズムを使用する場合(システム時間のような不変式で何らかの方法で潜入するものを除く)、同じシード同じレベル生成しますが、実際に回避する方法はありません。
カイ

1
はい、しかし、私はトリックが実際にレベルを生成するためにそもそもシードを使用していると思います。以前にランダムレベルジェネレーターを作成しましたが、単一のシードを使用しませんでした。多くの場合、ランダムなポイントを選択してから、各ポイントに対してランダムなアセットを選択してそこに配置します。このようにすると、独自の乱数を生成するものがたくさんあるため、常に同じレベルを生成する真のシードはありません。
アダムハート

10
「シード」の意味を知っていますか?これは、たとえばを介して渡される「初期ベクトル」srand(int)です。への後続の呼び出しはrand()、このシードに基づいて常に同じ順序で計算される連続値を返します。プログラムでシードを一度設定します。その後、アルゴリズムがからの結果のみに依存する場合、rand毎回同じ結果が得られます。
ヒースハニカット

回答:


7

これの鍵は、既知のシード値で初期化する独自のカスタム擬似乱数ジェネレーターを使用することです。「Mersenne Twister」は人気のあるアルゴリズムです。Wikipediaのエントリサンプルソースがあります。これおよび他のPRNGアルゴリズムは、シード値が開始点として機能する(非常に長い)固定された一連の数値を実際に生成します。

毎回世界を生成するためのまったく同じ手順に従う限り、各値は一意の再現可能な世界を表します。


4

ActionScript(AS2またはAS3で使用可能)で実装されたPRNG(擬似乱数ジェネレーター)を次に示します。軽量で高速、ゲームに最適:http : //lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

上記の実装は、Park-Miller-Carta PRNGに基づいています。このサイトでは、これらすべての背後にある数学についての洞察が得られます。

ワームのようなレベルを構築するには、おそらくPerlin-Noise関数を使用します。高さ1ピクセル、ゲームワールドの幅でperlinノイズイメージを生成すると、基本的に高さマップが得られ、すぐに使用できます。パーリンノイズ関数も、常に同じシードを使用して同じマップを生成します。

次に、上記のPRNGを使用して、マップ上のランダムオブジェクトを配置する場所、または地面に穴を開ける場所を決定します。穴については、パーリンノイズを再度利用することもできます。マップのサイズ(x、y)でperlin-noiseイメージを作成し、次にピクセル値が指定されたしきい値(例:0.2)を下回るマップに穴を作成します。


私はperlinノイズを使用しますが、少し異なる方法で、3Dの高さマップを作成し、マップを斜面に置き、しきい値よりも低いピクセルをすべて削除します。(pixel.height-(pixel.distanceToBottom * slopeFactor)<しきい値)ピクセル=透明の場合)
ニールズ

2

理論的には、疑似乱数ジェネレーター(Perlin-NoiseやMarsenne Twisterなど)を使用してマップを共有できる場合

シード番号を使用すると、カスタムマップを作成し、それらをシードに変換して、作成できないという問題を解決できます。

PRNGを使用する場合のカスタムマップ。ただし、これはいくつかの前提に基づいています。つまり、擬似乱数ジェネレータは

リバーシブルプロセスであり、PRNGに逆方向に送られるデータはすべて、有効なシードを生成します。シードはまったくありません。

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