Disons que je construis un jeu de société avec une grille hextile, comme Settlers of Catan :
Notez que chaque sommet et chaque arête peuvent avoir un attribut (une route et un règlement au-dessus).
Comment créer une structure de données qui représente ce tableau? Quels sont les modèles d'accès aux voisins, arêtes et sommets de chaque tuile?
data-structures
un nerd payé
la source
la source
Réponses:
Amit Patel a publié une page incroyable sur ce sujet. C'est tellement complet et merveilleux qu'il doit être la réponse définitive à cette question: Grilles hexagonales
la source
Une telle grille peut être représentée dans un tableau à deux dimensions:
Si
est le numéro un avec ses voisins dans la grille hexadécimale, alors vous pouvez le mettre dans un tableau 2D comme ceci:
Évidemment, la voisinage est déterminée dans cette grille non seulement en étant adjacente horizontalement ou verticalement mais aussi en utilisant une diagonale.
Cependant, vous pouvez également utiliser un graphique si vous le souhaitez.
la source
Cet article explique comment configurer un jeu de grille isomérique / hexagonale. Je vous recommande de jeter un œil à la
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
section et à la section mouvement. Bien qu'il soit différent de ce que vous recherchez, il peut vous aider à formuler comment faire ce que vous voulez.la source
J'ai beaucoup traité de maléfices. Dans de tels cas, vous suivez chacun des 6 points pour les frontières de l'hex. Cela vous permet de le dessiner assez facilement.
Vous auriez un seul tableau d'objets qui représentent des hexagones. Chacun de ces objets hexadécimaux possède également 6 "pointeurs" (ou un index vers un autre tableau) pointant vers un autre tableau de "côtés". Même chose pour les "sommets". Bien sûr, les sommets auraient 3 pointeurs vers les hexagones adjacents, et les côtés en auraient 2.
Ainsi, un hexagone peut être quelque chose comme: X, Y, Point (6), Vertices (6), Sides (6)
Ensuite, vous avez un tableau Hex, un tableau de sommets et un tableau latéral.
Ensuite, il est assez simple de trouver les sommets / côtés d'un hexagone, ou autre.
Quand je dis pointeur, cela pourrait tout aussi bien être un entier pointant vers l'élément dans le sommet ou le tableau latéral ou autre. Et bien sûr, les tableaux peuvent être des listes ou autre.
la source
Vous pouvez également essayer de «mettre à plat» les lignes de votre carte. Pour cet exemple, ce serait:
Il est parfois plus utile d'avoir des lignes sur une seule ligne: P
la source
Je suggérerais quelque chose comme ce qui suit (j'utiliserai des déclarations de style Delphi):
Chaque hexagone a six arêtes et six sommets. Chaque bord garde la trace de ses deux hexs adjacents, et chaque sommet garde la trace de ses trois hexs adjacents (les hexagones sur les bords de la carte seront un cas particulier).
Il y a beaucoup de choses que vous pourriez faire d'une manière différente bien sûr. Vous pouvez utiliser des pointeurs plutôt que des tableaux, vous pouvez utiliser des objets plutôt que des enregistrements, et vous pouvez stocker vos hexagones dans un tableau à deux dimensions, comme d'autres répondants l'ont suggéré.
J'espère que cela pourrait vous donner quelques idées sur une façon de l'aborder.
la source
Nous avons implémenté une IA Settlers of Catan pour un projet de classe et modifié le code de cette réponse (qui était boguée) pour créer un tableau avec un accès aléatoire en temps constant aux sommets et aux arêtes. C'était un problème amusant, mais le tableau a pris beaucoup de temps, donc au cas où quelqu'un chercherait encore une implémentation simple, voici notre code Python:
la source
Je suis assis ici "dans mon temps libre à coder pour le plaisir" avec des hexagones. Et ça va comme ça ... Je vais vous dire à quoi ça ressemble en mots.
C'est juste une idée de la façon dont je travaillerais dessus.
la source
Vous pouvez créer un tableau 2D et considérer les positions valides comme:
Pour chaque cellule, ses voisins seraient:
Illustration: grille hexagonale
Les marques x sont des hexagones. x qui sont en diagonale les uns par rapport aux autres sont voisins. | relie les voisins verticaux.
la source