Якщо припустити, що у вас загальна шестигранна клітка n
та p
гравці, де p <= n
, найкращий спосіб вирішити це - це розподіл круглої робіни через стільникові автомати (CA).
Ініціалізація
Випадково (та / або використовуючи ту чи іншу евристику, наприклад відстань від центру карти), виберіть початкову клітинку для кожного гравця. Оскільки p <= n
це не повинно бути проблемою.
Стільникові автомати
Вам потрібна повна зв’язок між вашими шестигранними клітинками. Я б запропонував 6-сусідський масив на комірку:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
Використання масивів фіксованого розміру дозволяє існувати поняття топографічних напрямків між клітинками, чого не було б у списку чи векторі. Я рекомендую це, оскільки це може полегшити певні можливості навігації.
Ви також можете зберігати свою шістнадцяткову карту у двовимірному масиві із зрушеннями на рядок. Однак це може бути трохи менш інтуїтивно зрозумілим, ніж зберігати сусідський масив на комірку, лише через геометричне зміщення в кожному другому рядку.
Переконайтесь, що кожна клітина підключена до всього, що є сусідом. Ви можете робити цей рядок за рядком, клітинку за коміркою, коли ви генеруєте повну шестнадцятку. PS Якщо ви в кінцевому підсумку хочете непрямокутно обмежену шістнадцятку, ви можете просто видалити окремі комірки та посилання на ці клітини, щоб утворити негативні пробіли, що дозволяє створити контур органічної карти.
Круглоличний розподіл
Псевдокод:
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
Цей алгоритм дасть можливість кожному гравцеві вирощувати свою територію за допомогою одного кругообігу, за умови, що територія гравця ще має дійсне місце для зростання. Якщо деякі гравці блоковані рости далі, алгоритм, незважаючи на це продовжує зростати території гравців , які дійсно все ще мають дійсне зростаюче простір. Ви можете легко обмежити кожного гравця однаковою кількістю комірок, як тільки одна з них досягає межі, але це повинно бути досить простим, щоб ви зрозуміли, якщо бажаєте.
Це забезпечить "домашні території" максимального розміру для кожного гравця. Якщо ви хочете додатково мати "острівні" території, щоб виконати квоту на кількість комірок для цього гравця, то, як тільки у гравця не вистачає місцевого простору для зростання, ви можете вибрати нову стартову клітинку зі списку нейтральних комірок і продовжуйте той самий процес "зростання", звідти. Таким чином, у вас вийде красивий розмір, узгоджені набори островів для кожного гравця, а не випадковий шум.