Mostrando rango en cuadrícula hexagonal

10

Aquí está la situación.

Tengo un tablero hexagonal y una unidad en él, con velocidad o valor de movimiento 4. El terreno diferente tiene un costo diferente. Cuando hago clic en la unidad, el juego debería mostrarme un rango de movimiento.

Mi solución fue verificar cada hex en el rango de 4, con A * pathfinding, y si el costo de la ruta era inferior a 4, entonces este hex estaba en el rango. Finalmente, el juego me muestra muy bien el rango de esa unidad.

Mi pregunta es: ¿hay otra solución para buscar el rango en cuadrículas hexagonales o cuadrícula cuadrada, porque incluso si estoy realmente orgulloso de lo que hice en mi solución, creo que es un poco exagerado? :))

¿Qué me hizo hacer esta pregunta? Noté que cuando la velocidad de la unidad es 4 o 6 o incluso 8, el tiempo para calcular el rango de mi computadora era realmente bueno, pero cuando la velocidad era 10 y más, noté que necesitaba esperar unos segundos para calcular Bueno, en los juegos reales prefiero no ver algo como esto y mi pathfinding A * está bastante bien optimizado, así que estoy pensando que mi solución está mal.

Gracias por cualquier respuesta

user23673
fuente
1
Estoy de acuerdo con Byte56 en que un algoritmo de búsqueda de amplitud es una buena solución. Esto no quiere decir que no debas tratar de ser creativo, pero en lo que respecta a los algoritmos conocidos, es bueno que se aplique bien.
theJollySin

Respuestas:

11

Tienes razón en que A * es un poco exagerado, pero no mucho. No deberías ver retrasos como tú. A * es realmente solo un algoritmo modificado de Dijikstra . Como no está utilizando una posición final (ya que su posición final es "lo más lejos que puede llegar"), no es necesario usar A * con su heurística adicional. Simplemente usando Dijikstra o una simple búsqueda de amplitud será suficiente.

Por ejemplo, Dikikstra se extenderá de manera uniforme en todas las direcciones:

ingrese la descripción de la imagen aquí

(Una primera búsqueda de amplitud simple será similar a esta)

Mantenga un registro del costo de viajar a cada nodo. Una vez que un nodo está al costo de viaje máximo, no procese más sus nodos conectados. (Similar a donde los nodos se topan con la pared de abajo).

Si tiene problemas de rendimiento con solo 10 nodos, querrá ver cómo accede a los nodos. Una primera búsqueda amplia debería ser capaz de navegar cientos de nodos sin un retraso notable (ciertamente no unos segundos). Considere almacenar una versión simple de su mundo en un formato gráfico, para un recorrido rápido.

MichaelHouse
fuente
¿Puedes encontrar la distancia entre dos nodos usando BFS y teniendo en cuenta los obstáculos / pesos diferentes?
Luke B.
El costo de moverse entre nodos debe calcularse previamente en su mayor parte. El costo no se calcula usando BFS, BFS es un algoritmo para atravesar los nodos. La forma en que determina el costo de viajar de un nodo a otro es independiente de cómo atraviesa los nodos.
MichaelHouse
Gracias, ahora veo por qué mi pensamiento estaba equivocado, la clave para eso fue esta afirmación "Ya que no estás usando una posición final (ya que tu posición final es" tan lejos como puedas "). En mi solución, yo tenía una posición final, era la unidad. Simplemente resolví el problema desde la dirección equivocada. Primero determiné el borde, y desde allí volví a mi unidad, de esa manera probablemente pasé muchas veces por los mismos nodos. cuando mi velocidad aumenta, la cantidad de cómputo también aumenta mucho. La forma en que me muestras, siempre visitaré el nodo una vez. Simplemente tuve un punto de vista incorrecto, realmente gracias, esto simplifica mucho.
user23673
4

Amit Patel ha proporcionado un excelente recurso para obtener rangos en su sitio . En el artículo, usa el siguiente algoritmo para recolectar fichas hexagonales dentro de un rango:

for each -N  Δx  N:
    for each max(-N, x-N)  Δy  min(N, x+N):
        Δz = xy
        results.append(H.add(Cubex, Δy, Δz)))

Esto crea límites alineados con la cuadrícula hexadecimal:

ingrese la descripción de la imagen aquí

Esto encontrará todos los hexágonos dentro de una cierta distancia del hexágono central, si desea considerar los obstáculos, use la búsqueda de amplitud primero de mi otra respuesta.

MichaelHouse
fuente
1

En caso de que alguien lo necesite, aquí está la implementación de C # del algoritmo de Patel:

IEnumerable<Hex> GetRange(Hex center, int range)
    {
        var inRange = new List<Hex>();
        for (int q = -range; q <= range; q++)
        {
            int r1 = Math.Max(-range, -q - range);
            int r2 = Math.Min(range, -q + range);
            for (int r = r1; r <= r2; r++)
            {
                inRange.Add(center.Add(new Hex(q, r, -q - r)));
            }
        }

        return inRange;
    }
Allan Haugsted
fuente