n
合計で16進数のセルとp
プレイヤーがいると仮定すると、p <= n
これに取り組む最善の方法は、セルラーオートマトン(CA)を介したラウンドロビン配信です。
初期化
ランダムに(および/またはマップの中心からの距離などの何らかのヒューリスティックを使用して)各プレイヤーの開始セルを選択します。以来p <= n
、これは問題になりません。
セルオートマトン
16進セル間の完全な接続が必要です。セルごとに6隣接配列を提案します。
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
固定サイズの配列を使用すると、セル間の地形方向の概念が存在することができますが、リストやベクトルは存在しません。特定のナビゲーション操作が簡単になる可能性があるため、これをお勧めします。
16進マップを行ごとにオフセットして2D配列に保存することもできます。ただし、これは、セルごとに隣接配列を保存するよりも、1行おきに幾何学的オフセットがあるために、やや直感的ではない場合があります。
すべてのセルが隣接するすべてのものに接続されていることを確認してください。完全な16進マップを生成する際に、セルごとに行ごとにこの操作を実行できます。PS最終的に非長方形の16進数マップが必要な場合は、個々のセルとそれらのセルへの参照を削除して、負のスペースを形成し、有機マップアウトラインを作成できます。
ラウンドロビン配布
擬似コード:
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
このアルゴリズムは、プレイヤーのテリトリーに有効な成長スペースがある場合、ラウンドロビン方式で各プレイヤーにテリトリーを1つずつ成長させる機会を与えます。特定のプレーヤーがさらに成長するのをブロックされた場合、アルゴリズムはこれにもかかわらず、それを行うプレーヤーの領域を成長させ続けますまだ有効で成長しているスペースを持っています。プレーヤーが制限に達するとすぐに、すべてのプレーヤーを同じ数のセルに簡単に制限できますが、必要に応じて、簡単に把握できるはずです。
これにより、各プレーヤーに最大サイズの「ホームテリトリー」が提供されます。「島」の領域を追加して、そのプレーヤーのセル数割り当てを満たすために、プレーヤーがローカルスペースを使い果たして成長したら、ニュートラルセルリストから新しい開始セルを選択し、そこから同じ「成長」プロセスに進みます。この方法では、ランダムなノイズではなく、各プレイヤーに対して適切なサイズの一貫した島のセットになります。