En supposant que vous ayez un hexmap de n
cellules au total et des p
joueurs, où p <= n
la meilleure façon de résoudre ce problème est la distribution à tour de rôle via des automates cellulaires (CA).
Initialisation
Au hasard (et / ou en utilisant une ou une autre heuristique, comme la distance du centre de la carte), choisissez une cellule de départ pour chaque joueur. Depuis p <= n
, cela ne devrait pas être un problème.
Automates cellulaires
Vous avez besoin d'une connectivité complète entre vos cellules hexadécimales. Je suggérerais un tableau à 6 voisins par cellule:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
L'utilisation de tableaux de taille fixe permet au concept de directions topographiques entre les cellules d'exister, ce qui n'existerait pas pour une liste ou un vecteur. Je le recommande, car cela peut faciliter certaines opérations de navigation.
Vous pouvez également stocker votre hexmap dans un tableau 2D, avec des décalages par ligne. Cela peut cependant être légèrement moins intuitif que le stockage d'un tableau voisin par cellule, uniquement en raison du décalage géométrique sur toutes les autres lignes.
Assurez-vous que chaque cellule est connectée à tout ce qui est voisin. Vous pouvez le faire ligne par ligne, cellule par cellule lorsque vous générez l'hexmap complète. PS Si vous voulez en fin de compte une carte hexadécimale non délimitée de manière rectangulaire, vous pouvez alors simplement supprimer les cellules individuelles et les références à ces cellules, pour former des espaces négatifs, vous permettant de créer un contour de carte organique.
Distribution à tour de rôle
Pseudocode:
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
Cet algorithme donnera à chaque joueur une chance d'agrandir son territoire d'un point, à la manière d'un tournoi à la ronde, à condition que le territoire du joueur ait encore un espace de croissance valide. Si certains joueurs sont empêchés de croître davantage, l'algorithme continuera malgré tout à étendre les territoires des joueurs qui le font n'ont toujours valide l' espace de plus en plus. Vous pouvez facilement limiter chaque joueur au même nombre de cellules dès que l'un d'eux atteint une limite, mais cela devrait être assez facile pour vous de comprendre, si vous le souhaitez.
Cela fournira des "territoires d'origine" de taille maximale pour chaque joueur. Si vous voulez avoir des territoires "insulaires" en plus, afin de remplir le quota de nombre de cellules pour ce joueur, puis une fois qu'un joueur manque d'espace local pour grandir, vous pouvez alors choisir une nouvelle cellule de départ dans la liste des cellules neutres et procéder avec le même processus de "croissance", à partir de là. De cette façon, vous vous retrouverez avec des ensembles d'îlots cohérents et de bonne taille pour chaque joueur, plutôt que du bruit aléatoire.