Tengo problemas para encontrar un término de búsqueda específico para esto, pero ¿cómo se puede encontrar los posibles movimientos en un juego de estrategia por turnos 2D (es decir, FF: tácticas, emblema de fuego, guerras avanzadas).
No estoy pensando tanto en el terreno (o incluso la colisión) en este momento. Me pregunto qué algoritmo puedo usar para descubrir que la entidad X puede mover 5 fichas y atacar 2 fichas más lejos que eso.
Sé que puedo usar algo como Dijkstra para encontrar la distancia entre dos puntos. Una posible implementación es comenzar en la ubicación de los jugadores y luego ramificarse desde allí hasta que la distancia devuelta por Dijkstra sea mayor que el conteo de movimientos.
Solo me preguntaba si alguien podría señalarme en la dirección correcta (es decir, nombre de algoritmos, técnica, artículos, etc.).
Respuestas:
Creo que un Dijkstra acotado es precisamente lo que quieres usar. La forma en que Dijkstra encuentra la distancia entre dos puntos es mapeando la distancia a cada nodo desde un nodo de origen, y luego 'selecciona' la ruta más corta de este mapa de distancia. Desea hacer prácticamente lo mismo, excepto que desea el gráfico de nodo de distancia que crea como salida, en lugar de una ruta a un punto en particular.
La única modificación que querrá hacer es omitir el cálculo de la distancia desde los nodos que ya han excedido su rango de movimiento máximo. Luego, tendrá un gráfico de nodos de todos los nodos a los que la unidad puede viajar, más un borde, así que simplemente corte los nodos que tengan una distancia mayor que la capacidad de movimiento.
Viola.
En otras palabras, más o menos lo que describiste en tu pregunta es lo que debes hacer. También tiene la ventaja de poder utilizar la salida para hacer la búsqueda de ruta, sin necesidad de hacer ningún cálculo adicional.
fuente
El enfoque más simple (y probablemente más ingenuo) que se me ocurre en este momento:
steps - 1
.steps - 1
dondesteps
estaría el número de paso del campo actual, a menos que el nuevo campo tenga un número ya mayor.fuente
Creo que lo que estás buscando podría ser Manhattan Distance . Suponiendo que no haya obstáculos, puede decir que un cuadrado es accesible simplemente si:
| toX-fromX | + | toY-fromY | <maxMoveDistance
Es posible que este algoritmo no sea la dirección correcta si va a tener obstáculos más adelante; Una posible forma de adaptarlo podría ser hacer que los obstáculos arrojen 'sombras' y reevaluar desde el punto más cercano.
EDITAR (porque ahora tengo un poco más de tiempo libre):
Por 'sombras' quiero decir algo como esto, si 0 es un cuadrado alcanzable, C es el personaje y X es un obstáculo:
Dado que (5, 2) es un obstáculo, comienza suponiendo que no puede llegar a nada con x> = 5 AND y <= 2. Luego puede volver a calcular desde otro cuadrado; si quieres ir a (5, 1) puedes calcular la distancia de Manhattan desde (4, 1) y ver si eso + la distancia del personaje a (4, 1) es menor que la distancia de movimiento del jugador.
Este es un ejemplo bastante trivial, pero si tiene múltiples obstáculos y / o un rango de movimiento un poco más largo, debería ser capaz de manejar la complejidad.
Si en realidad sería mejor que solo el llenado de inundaciones, ya sea en la complejidad de la programación o en la eficiencia de la ejecución, no tengo idea. Simplemente parecía una forma más interesante de resolver el problema.
fuente