Une petite remarque: vous dites "ressemble à une carte de la vie réelle avec des pays de formes différentes mais de tailles égales), mais les pays" réels "sont très différents, même dans certaines régions - même les" grands "pays d'Europe peuvent varier énormément, la France étant par exemple plus de deux fois plus grande que l'Italie. Cela dit, il existe évidemment des régions de gameplay pour essayer de garder les tailles à peu près les mêmes - sachez qu'une petite variation ici est probablement une bonne chose!
Mon approche initiale du problème serait «d'évoluer» (plutôt que de «grandir») vos régions:
- Commencez par une division concrète de la carte en morceaux de taille à peu près égale par des lignes droites (par exemple, si vous vouliez 6 pays, alors vous pourriez diviser la carte en trois tranches horizontales, puis diviser chacune de ces tranches `` sur la diagonale '' en deux morceaux). C'est évidemment facile à faire par programme, d'autant plus que cela n'a pas besoin d'être très exact (en fait, ne devrait probablement pas être très exact).
- Faites un premier passage sur la division, construisant une structure de données `` limite '': un ensemble d'hexs qui ont un voisin appartenant actuellement à un pays différent. Ce serait également un bon moment pour compter le nombre d'hexagones dans chaque pays.
Maintenant, aussi longtemps que vous le souhaitez, exécutez le pseudocode suivant:
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;
}
Cela maintiendra un équilibre approximatif entre la taille de deux pays voisins et la vérification `` déconnectée '' (qui peut être effectuée avec un algorithme de remplissage par inondation simple) garantit qu'aucun pays ne se sépare jamais en morceaux. La mise à jour de la liste des limites est une opération à temps constant - l'hex modifié sera évidemment toujours toujours sur la limite, et vous pouvez simplement vérifier ses six voisins pour voir si l'un d'eux est devenu une cellule de limite (car son voisin est maintenant dans un pays différent) ou a cessé d'être une cellule de frontière (parce que son voisin est dans le même pays maintenant), modifiant l'ensemble de frontières selon les besoins.
Pour affiner cette approche, vous pouvez même rendre la condition de l'hexagone pour changer un peu aléatoire - plutôt que de toujours `` équilibrer '' les deux pays, vous pouvez toujours faire le swap avec une certaine probabilité, et même diminuer progressivement cette probabilité sur temps (similaire au processus de refroidissement dans un algorithme de recuit simulé ) pour commencer à les forcer à avoir à peu près la même taille.
Notez que cela ne garantira pas que toutes les zones sont exactement de la même taille (ce qui est impossible à moins que N ne divise parfaitement la taille de votre grille de toute façon), et cela ne garantira même pas que tous les pays sont à moins d'un hex les uns des autres dans la zone; il doit garantir (exécuter pendant suffisamment d'itérations) que chaque pays n'est pas plus d'un hex plus grand ou plus petit que chacun de ses voisins immédiats.