Digamos que estoy construyendo un juego de mesa con una cuadrícula hextil, como Settlers of Catan :
Tenga en cuenta que cada vértice y borde puede tener un atributo (una carretera y un asentamiento arriba).
¿Cómo haría una estructura de datos que represente este tablero? ¿Cuáles son los patrones para acceder a los vecinos, bordes y vértices de cada mosaico?
data-structures
un nerd pagado
fuente
fuente
Respuestas:
Amit Patel ha publicado una página asombrosa sobre este tema. Es tan completo y maravilloso que debe ser la respuesta definitiva a esta pregunta: Cuadrículas hexagonales
fuente
Tal cuadrícula se puede representar en una matriz bidimensional:
Si
es el número uno con sus vecinos en la cuadrícula hexadecimal, entonces puedes poner esto en una matriz 2D así:
Obviamente, la vecindad se determina en esta cuadrícula no solo por ser adyacente horizontal o verticalmente, sino también usando una diagonal.
Sin embargo, también puede usar un gráfico, si lo desea.
fuente
Este artículo explica cómo configurar un juego de cuadrícula isomérica / hexagonal. Te recomiendo que eches un vistazo a la
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
sección y la sección de movimiento. Aunque es diferente de lo que está buscando, puede ayudarlo a formular cómo hacer lo que desea.fuente
He tratado mucho con maleficios. En casos como este, rastreas cada uno de los 6 puntos de los bordes del hex. Esto te permite dibujarlo con bastante facilidad.
Tendría una sola matriz de objetos que representan hexágonos. Cada uno de estos objetos hexadecimales también tiene 6 "punteros" (o un índice a otra matriz) que apuntan a otra matriz de "lados". Lo mismo para "vértices". Por supuesto, los vértices tendrían 3 punteros a los hexágonos contiguos, y los lados tendrían 2.
Entonces, un hex puede ser algo como: X, Y, Punto (6), Vértices (6), Lados (6)
Entonces tienes una matriz Hex, una matriz de vértice y una matriz lateral.
Entonces es bastante simple encontrar los vértices / lados de un hex, o lo que sea.
Cuando digo puntero, podría ser fácilmente un número entero que apunta al elemento en el vértice o matriz lateral o lo que sea. Y, por supuesto, las matrices pueden ser listas o lo que sea.
fuente
También puede intentar "planar" filas de su mapa. Para este ejemplo sería:
A veces es más útil tener filas en una fila: P
fuente
Sugeriría algo como lo siguiente (usaré declaraciones de estilo Delphi):
Cada hex tiene seis bordes y seis vértices. Cada borde realiza un seguimiento de sus dos hexágonos contiguos, y cada vértice realiza un seguimiento de sus tres hexágonos contiguos (los hexágonos en los bordes del mapa serán un caso especial).
Por supuesto, hay muchas cosas que podrías hacer de una manera diferente. Podría usar punteros en lugar de matrices, podría usar objetos en lugar de registros, y podría almacenar sus hexes en una matriz bidimensional como han sugerido otros respondedores.
Con suerte, eso podría darte algunas ideas sobre una forma de abordarlo.
fuente
Implementamos una IA de Settlers of Catan para un proyecto de clase y modificamos el código de esta respuesta (que tenía errores) para crear un tablero con acceso aleatorio de tiempo constante a vértices y bordes. Fue un problema divertido, pero la placa tomó mucho tiempo, así que en caso de que alguien todavía esté buscando una implementación simple, aquí está nuestro código Python:
fuente
Estoy sentado aquí "en mi tiempo libre codificando por diversión" con maleficios. Y dice así ... te diré cómo se ve en palabras.
Esta es solo una idea de cómo lo trabajaría.
fuente
Puede crear una matriz 2D y luego considerar las posiciones válidas como:
Para cada celda, sus vecinos serían:
Ilustración: Cuadrícula hexagonal
Las marcas x son hexes. x que son diagonales entre sí son vecinos. | conecta vecinos verticales.
fuente