これは初心者の質問ですが、ここにそれがあります:
私のマップは2Dグリッドであり、道路と川を生成したいです。開始点から終了点までのルートは、タイル数で最適なルートであってはなりません。代わりに、一定レベルのランダム性(ターン)が必要です。
この種のものに標準的なアルゴリズムはありますか?
乾杯!
更新:
これは、グリッド上の重みで遊んで、jgraphtライブラリを使用して最短経路アルゴリズム(Bellman-Ford)を適用した結果です。結局、ドーナツの答えに行きました。
これは初心者の質問ですが、ここにそれがあります:
私のマップは2Dグリッドであり、道路と川を生成したいです。開始点から終了点までのルートは、タイル数で最適なルートであってはなりません。代わりに、一定レベルのランダム性(ターン)が必要です。
この種のものに標準的なアルゴリズムはありますか?
乾杯!
更新:
これは、グリッド上の重みで遊んで、jgraphtライブラリを使用して最短経路アルゴリズム(Bellman-Ford)を適用した結果です。結局、ドーナツの答えに行きました。
回答:
A *を使用して最適なパスを生成してから、中点変位で歪みます。
これにより、エンドポイントが確実に満たされ、ランダム性を大幅に制御できます。たとえば、道路を川ほどランダム化することはしません。道路を構築する知性が何であれ、通常、それについて最適化を試みます。
マップに障害物がある場合は、反復のたびにそれらの障害物を越えていないことを確認してください。
別の方法は、最適なパスを見つけた後にパーリンノイズを生成し、生成されたノイズに基づいてポイントをシフトすることです。たとえば、次のノイズを使用します。
次に、最適なパスを赤で、シフトしたパスを青で表示します。
シフトされたパスがノイズの暗い領域にどのように「収まった」ことに注目してください。川が谷を流れるのと同じ方法。
パーリンノイズを選択する利点の1つは、アルゴリズムの一部として障害物を考慮に入れて回避できることです。
高さが要因である場合はどうですか?ダイアモンドスクエアアルゴリズムでハイトマップを作成できます。ランダムな水を各タイルに追加してから、繰り返し処理し、水がすべて落ち着くまで低地に移動することを考えていましたが、それは遅くなり、おそらく川ではなく湖になります。
また、各タイルの法線を見ることも考えていました。2つの法線が互いに向かっている場合、それは谷でなければなりません。谷に水がたまります。それらが同じ方向を向いている場合、または互いに離れている場合、水はたまりません。これはおそらく反復法よりも高速ですが、湖を作成せず、川のみを作成する場合があります。タイルポイントのすべてのインスタンスが互いに向かい合って川になるのを防ぐために、それをいじる必要があります。