回答:
ロイドのアルゴリズムを試しましたか?手順は非常に単純で、実行する反復の数に応じて、かなり規則的な外観の領域を生成します。
見栄えの良いマップを作成するために、それほど長く実行する必要はありません。 この例では、3回の反復のみが必要でした。
あなたが試すことができる1つの簡単な方法。
n
ヘクスをランダムに選択します。それぞれがグループを開始します。私はテストしませんでしたが、これにより島が生成され、長く細いブレースがいくらか回避されるはずです。また、ほとんどの場合、隣接する境界線がありますが、必ずしもそれぞれが他の境界線と接触するわけではなく、その密度はの値に依存しますn
。
一部のグループは他のグループに追い込まれ、サイズが20未満に達する場合があります。スターターヘクスを最短距離でスポーンすることで、スペースを拡大できます。
必要に応じてテストおよび微調整します。
また、ではない。この問題に関連しているがヘクスでの作業に非常に、非常に便利な、このページを参照してください。http://www.redblobgames.com/grids/hexagons/#basics
それはと1つの場所で、六角情報の全体の束を集約します素晴らしいビジュアル。
何らかのタイプのグラフ構造がこれを可能にすると確信しています。基本的に、マップ全体をシミュレートするために2つのHexノードが隣接している場合は、それらの間にエッジを作成します。ただし、そのマップ内で「国」を生成するための正確なアルゴリズムはわかりません。問題は、国に「見せる」方法に応じて、異なるアルゴリズムが必要になることです。
頭上から、ポイントを選んでそこから外側に移動し、国の一部ではない隣接するタイルがある「成長する国」内のランダムなタイルを選ぶことをお勧めします。
戦略パターンを使用して、希望する国のタイプに応じてアルゴリズムを切り替えることができます。http://en.wikipedia.org/wiki/Strategy_pattern つまり、チリのような細い海岸線の国が欲しいですか?それとも、もっと丸くて閉じ込められたものが欲しいですか?
グラフのプロパティを使用すると、最終的な「国」を次のように調整することもできます。http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)
大きな国が欲しいですか?グラフのプロパティを微調整し、生成された国(単なるグラフ)に必要な「外観」を与えるプロパティを強制します。
最後になりましたが、グラフは国間の境界を定義するのにも非常に役立ちます。国同士が隣接している場合、2つのノード間の接続を持つグラフを作成できます。これはゲーム内のある種のパーティショニングに役立ち、開発中に特定のものをさらに最適化できる可能性があります。
1つの小さなメモ:「形状は異なるがサイズが等しい国の実生活の地図のように見えます)が、「実際の」国は特定の地域内であってもサイズが大きく異なります。ヨーロッパの「大きな」国でさえ、たとえば、フランスはイタリアの2倍以上です。そうは言っても、サイズをほぼ同じにしようとするゲームプレイ領域は明らかにあります-ここで少し変更することはおそらく良いことであることに注意してください!
問題に対する私の最初のアプローチは、地域を「成長させる」のではなく「進化させる」ことです。
ここで、必要な限り、次の擬似コードを実行します。
Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
change hex B to belong to A's country;
} else {
flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
undo and reject this move;
} else {
update the boundary list around the changed hex and its neighbors;
}
これにより、任意の2つの近隣国のサイズの大まかなバランスが維持され、「切断」チェック(単純なフラッドフィルアルゴリズムで実行可能)により、どの国もバラバラにならないことが保証されます。境界リストの更新は一定時間の操作です-変更されたヘックスは常に境界上にあり、6つの隣接セルをチェックして、いずれかの境界セルになったかどうかを確認できます(隣接セルは現在別の国)または境界セルになるのをやめ(隣国は現在同じ国にあるため)、必要に応じて境界セットを変更します。
このアプローチを改良するために、変更するヘックスの条件を少しランダム化することもできます-2つの国を常に「バランスさせる」のではなく、常に特定の確率でスワップを行い、その確率を徐々に減少させることさえできます(シミュレーテッドアニーリングアルゴリズムの冷却プロセスと同様)、それらをほぼ同じサイズに強制し始めます。
これは、すべてのエリアがまったく同じサイズであることを保証しないことに注意してください(Nがグリッドサイズを完全に分割しない限り不可能です)。また、すべての国がエリア内で互いに1ヘクス以内にあることも保証しません。ただし、各国が隣接国のそれぞれよりも1ヘクスだけ大きくも小さくもならないことを保証する必要があります(十分な反復回数で実行)。