100 x 100 グリッドのすべての正方形にタイル タイプ (水用と土地用) を割り当てることができるアルゴリズムを作成する必要があり、「島」を生成したいと考えています。ランダムなものですが、すべての土地の正方形が一緒にあり、すべての水の正方形が境界にあります。何か案は?
「パーリン ノイズ」について聞いたことがありますが、それを実装して希望する結果を得る方法がわかりません。私の場合も、そのような複雑なアルゴリズムにはおそらく基本的すぎるように感じます。
ありがとう!
100 x 100 グリッドのすべての正方形にタイル タイプ (水用と土地用) を割り当てることができるアルゴリズムを作成する必要があり、「島」を生成したいと考えています。ランダムなものですが、すべての土地の正方形が一緒にあり、すべての水の正方形が境界にあります。何か案は?
「パーリン ノイズ」について聞いたことがありますが、それを実装して希望する結果を得る方法がわかりません。私の場合も、そのような複雑なアルゴリズムにはおそらく基本的すぎるように感じます。
ありがとう!
私がプレイしている Brogue と呼ばれるローグライク ゲームでは、セル オートマトンのルールを使用して湖や洞窟を生成します。このようなルールは島の作成にも適用できます。
ここでそれについて読んでください:http://brogue.wikia.com/wiki/Level_Generation#Lakes
サンプル:
レベルと同じ大きさのバッファーが使用され、55% の生きた要素と 45% の死んだ要素がシードされます。ルール B5678/S45678 を 5 回繰り返します。
私が死んでいて、生きている隣人が 5 ~ 8 人いる場合、私は生き返ります。
私が生きていて、隣人が 4 ~ 8 人いる場合、私は生き続けますが、そうでない場合は死んでしまいます。
この後、水平/垂直に接続された有効な要素のすべての「ブロブ」がカウントされ、lakeMaxWidth および lakeMaxHeight より小さい最大のブロブが保持されます。4x4 よりも大きく、これよりも小さいブロブがない場合、セル オートマトンは最初からやり直されます。
w
マップの幅、高さh
、中心点を呼びましょうC
。C
は 2 次元ベクトル(w / 2, h / 2)
です。
から遠ざかるC
につれて、できれば何らかのカットオフ ポイントを使用して、水の可能性が高くなるはずです。
現在評価されている点を と呼びましょう。これもとが座標でP
ある 2 次元ベクトルです。(x, y)
x
y
P - C = D
その長さはD
、中心から評価される点までの距離です。
最初の実装として、 の長さ (または大きさ) が水タイルを置くD
よりも大きいとしましょう。w - 20
次に、グリッドを構築します。すべてのタイルを繰り返し、計算しD
ます。if D > (w - 20)
、タイルを水としてマークし、そうでない場合は土地としてマークします。
これにより、「完全に」円形の島ができます。
いくつかのランダム性を導入しましょう。条件をif D > ((w - 20) + randint(4))
( randint(x)
0 から x までのランダムな整数を返します) に変更します。今、私たちはある種の傷ついた海岸線を手に入れました。
この条件では、小さな孤立した土地タイルが得られる可能性があります。それは解決できますが、そのような簡単な条件では解決できません。この場合、トーマス・マシューズのアイデアがうまく機能します。
島はまだかなり円形ですが、状態で何を食べさせるかによって、島がどの程度傷んでいるかが異なりますrandint
。20 より大きい値が得られる場合randint(someval)
、境界でまったく水が得られない可能性があるため、そのようなシナリオに注意してください。
代わりに何らかの正方形の島が必要な場合は、代わりに境界からの距離を確認する必要があります。P.x < 5
たとえば、左の境界線から 4 タイル以内にいるか、右の境界線から 10 タイル以内にいるかを確認するのも簡単P.x > w - 5
です。
パーリンノイズとハレンチプラグについて。私は余暇に、ラティス ノイズを生成するライブラリに取り組んでいます (Perlin はラティス ノイズの一種です)。このコードは自由に使用できます。決して完全ではなく、バグがあることは確かですが、フラクタル ノイズを生成する可能性があります。
パーリン ノイズには多くの望ましい特性がありますが、それを形作るために追加の処理 (通常は単純な計算) が必要になる場合があります。
グリッドをすべて水に設定することをお勧めします。地球上には、陸地よりも多くの水があります。
次に、ランダムな点を選びます。土地として割り当てます。
新しい島の各面について、乱数を生成して、土地が最初の正方形に対して次の正方形を決定することができます。また、島に「湖」ができず、その土地が土地に接しないように、いくつかの重みとルールを追加することもできます。
Web で「地形エディタ」を検索します。Sim City ゲームには、山から湖までの深さを許可する地形エディタがいくつかありました。