Digamos que eu esteja construindo um jogo de tabuleiro com uma grade hextila, como Settlers of Catan :
Observe que cada vértice e aresta podem ter um atributo (uma estrada e assentamento acima).
Como eu faria uma estrutura de dados que representasse esta placa? Quais são os padrões para acessar os vizinhos, bordas e vértices de cada bloco?
data-structures
um nerd pago
fonte
fonte
Respostas:
Amit Patel postou uma página incrível sobre esse assunto. É tão abrangente e maravilhoso que precisa ser a resposta definitiva para esta pergunta: Grades hexagonais
fonte
Essa grade pode ser representada em uma matriz bidimensional:
E se
é o número um com seus vizinhos na grade hexadecimal, então você pode colocá-lo em uma matriz 2D assim:
Obviamente, a vizinhança é determinada nesta grade não apenas por ser horizontal ou verticalmente adjacente, mas também usando uma diagonal.
Você também pode usar um gráfico, se quiser.
fonte
Este artigo explica como configurar um jogo de grade isomérica / hexagonal. Eu recomendo que você dê uma olhada na
Forcing Isometric and Hexagonal Maps onto a Rectangular Grid
seção e na seção de movimento. Embora seja diferente do que você está procurando, pode ajudá-lo a formular como fazer o que deseja.fonte
Eu lidei muito com feitiços. Em casos como esse, você rastreia cada um dos 6 pontos das bordas do hexágono. Isso permite que você desenhe com bastante facilidade.
Você teria uma única matriz de objetos que representam hexágonos. Cada um desses objetos hexadecimais também tem 6 "ponteiros" (ou um índice para outro array) apontando para outro array de "lados". Mesma coisa para "vértices". É claro que os vértices teriam 3 ponteiros para os hexágonos adjacentes e os lados teriam 2.
Portanto, um hexágono pode ser algo como: X, Y, Ponto (6), Vértices (6), Lados (6)
Então você tem uma matriz Hex, uma matriz de vértices e uma matriz lateral.
Então é muito simples encontrar os vértices / lados de um hex, ou qualquer outra coisa.
Quando digo ponteiro, poderia facilmente ser um inteiro apontando para o elemento no vértice ou na matriz lateral ou qualquer outra coisa. E, claro, os arrays podem ser listas ou o que for.
fonte
Você também pode tentar 'achatar' as linhas do mapa. Para este exemplo, seria:
Às vezes é mais útil ter linhas em uma linha: P
fonte
Eu sugeriria algo como o seguinte (usarei declarações no estilo Delphi):
Cada hexágono possui seis arestas e seis vértices. Cada aresta acompanha seus dois hexágonos adjacentes e cada vértice monitora seus três hexágonos adjacentes (hexágonos nas arestas do mapa serão um caso especial).
Existem muitas coisas que você poderia fazer de maneira diferente, é claro. Você poderia usar ponteiros em vez de matrizes, poderia usar objetos em vez de registros e poderia armazenar seus hexágonos em uma matriz bidimensional, como outros respondentes sugeriram.
Esperançosamente, isso pode lhe dar algumas idéias sobre uma maneira de abordá-lo.
fonte
Implementamos um Settlers of Catan AI para um projeto de classe e modificamos o código desta resposta (que estava cheio de erros) para criar uma placa com acesso aleatório em tempo constante a vértices e arestas. Foi um problema divertido, mas a placa demorou muito, então caso alguém ainda esteja procurando por uma implementação simples aqui está nosso código Python:
fonte
Estou sentado aqui "no meu tempo livre, codificando para me divertir" com feitiços. E é assim ... Eu vou te dizer como fica em palavras.
Esta é apenas uma ideia de como eu trabalharia nisso.
fonte
Você pode criar uma matriz 2D e, em seguida, considerar as posições válidas como:
Para cada célula, seus vizinhos seriam:
Ilustração: Hex Grid
As marcas x são hexágonos. x que são diagonais entre si são vizinhos. | conecta vizinhos verticais.
fonte