Je fais un jeu simple basé sur une grille hexadécimale, et je veux que la carte soit divisée également entre les joueurs. La carte est créée au hasard, et je veux que les joueurs aient à peu près le même nombre de cellules, avec des zones relativement petites. Par exemple, s'il y a quatre joueurs et 80 cellules sur la carte, chacun des joueurs aurait environ 20 cellules (il n'est pas nécessaire qu'elles soient précises). De plus, chaque joueur ne doit pas avoir plus de quatre cellules adjacentes. C'est-à-dire que lorsque la carte est générée, les plus gros "morceaux" ne peuvent pas avoir plus de quatre cellules chacun.
Je sais que ce n'est pas toujours possible pour deux ou trois joueurs (car cela ressemble au problème de "colorier la carte"), et je suis d'accord pour faire d'autres solutions pour ceux-ci (comme créer des cartes qui résolvent le problème à la place). Mais, pour quatre à huit joueurs, comment pourrais-je aborder ce problème?
Réponses:
Voici ce que je ferais:
la source
En supposant que vous ayez un hexmap de
n
cellules au total et desp
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:
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:
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.
la source
n
, et par la suite vous contredisez en disant que vous "ne voyez pas de voie" et que je "mentionne [comment obtenir des îles] dans un texte ultérieur". Ai-je ou n'ai-je pas répondu à la question? Cet algorithme généralisé peut être utilisé pour diffuser des cellules (en limitantn
à 1) ou pour créer des îlots (en fixant n> 1). Vous avez donc, dans un seul algorithme, non seulement la capacité de se disperser, mais aussi de se regrouper. Comment cela ne répond-il pas à la question du PO? Comment vaut-il un downvote?Une autre approche consisterait à commencer par une distribution qui est «juste» mais régulière, puis à utiliser une approche similaire au recuit simulé pour briser la régularité sans perdre l'équité:
Les clés ici sont que le fait que vous échangez deux points signifie que vous ne déséquilibrez jamais les couleurs, et de même le test que vous faites avant de finaliser votre échange garantit que vous ne créez jamais de régions trop grandes. Si vous avez un moyen d'afficher votre grille, vous pouvez même visualiser ce processus pour voir comment il «construit» ses régions à travers les échanges répétés.
Si vous ne pouvez pas commencer par une coloration régulière équidistribuée, vous devriez être en mesure de faire quelque chose de similaire pour équidistribuer la coloration: bien que votre coloration ne soit pas équidistribuée, choisissez un élément au hasard; puis, s'il s'agit d'une des couleurs surreprésentées, définissez provisoirement sa couleur sur l'une des couleurs sous-représentées, puis assurez-vous que cela ne crée pas une région trop grande de la nouvelle couleur.
la source