Encontrar caminos con múltiples caminos aleatorios en un juego de Tower Defense

8

Pensé en encontrar caminos aleatorios para mi juego Tower Defense. A * no funcionaría para mis pupos, porque específicamente necesito encontrar rutas aleatorias .

Imagine un mapa con rutas, un punto de partida y un destino. Tengo múltiples rutas, que conducen desde el punto de partida hasta el destino, de una forma u otra. Podría verse así:


Dos ramificaciones en forma de cuadrado

Descripción del color: rojo - punto de partida; negro - destino; gris - ruta; blanco - espacio libre
(los números se usan en el texto como referencia para algunos mosaicos)


Primero pensé en calcular el siguiente waypoint al azar, cuando una entidad pasa un mosaico. Pero eso no funcionaría. Cuando una entidad pasa el mosaico 1, puede subir o bajar. Cuando se trata de 2, puede ir hacia abajo / arriba (en relación con su posición) o hacia la derecha.
Si se va hacia abajo / arriba iría a baldosa 1, lo que significa que va hacia atrás. Malo...

Realmente me gustaría hacerlo dinámico , pero no puedo entender qué puedo hacer ahora. ¿Alguien con ideas o experiencia en esto?

Marco
fuente
La mayoría de los juegos de defensa de la torre que conozco hacen que las cosas se arrastren por el camino más corto hacia la salida y bloquean cualquier movimiento que invalidaría la salida ... La parte difícil aquí sería asegurarse de recalcular los caminos cuando el jugador cambia los diseños de la torre
James
@ James: ¿Te refieres a obtener el camino más corto, que es A *, o te refieres a gatear por los puntos de referencia para obtener direcciones válidas para cada mosaico? Tampoco necesito volver a calcular el camino ya que mis caminos están arreglados y el jugador no puede colocar torres allí. Pero en general tienes razón.
Marco

Respuestas:

4

En lugar de tener todos los cuadrados adyacentes como posibles puntos de referencia próximos, solo incluya cuadrados que no conduzcan al principio y elija al azar de ellos. Si hiciera esto, sería imposible retroceder porque retroceder no es una opción.

Este es un problema de gráfico dirigido con cada punto de referencia como vértice y cada ruta como borde. Solo necesita limitar el número de ciclos, quizás eliminándolos por completo.

Chemball masticable
fuente
Ese fue mi segundo pensamiento. Tengo que pensar en la implementación de la cuestión "el camino conduce de regreso ahora". Limitar el número de mosaicos para pasar no sería dinámico y flexible.
Marco
Puede resolver esto creando un gráfico dirigido y haciendo un seguimiento de los mosaicos visitados / no visitados. Luego, solo asegúrese de buscar solo mosaicos no visitados. Eso debería crear un gráfico que represente sus caminos. Ahora, si golpea un mosaico donde una nota tiene varios bordes salientes (en el gráfico que se creó anteriormente), simplemente elija uno al azar.
bummzack
Quise escribir "nodo" no "nota" en mi comentario anterior. Lo siento.
bummzack
@bummzack: No, eso no funcionaría. Imagina un mapa con 3 caminos. Si busco nodos no visitados, también podría simplemente ir al principio. Pienso en implementar un algoritmo que recorra el mapa y elija aleatoriamente entre las direcciones. Cuando se da cuenta de que se remonta al principio, esta parte no se puede utilizar. Podría hacer esto con un mostrador. Cuando la distancia al inicio se reduce, vuelve. Esto se analizaría una vez en la creación del mapa en el proceso de desarrollo, por lo que no hay problemas de rendimiento.
Marco
@Marco ¿Por qué eso no funcionaría? Si implementa una primera búsqueda amplia desde su nodo de inicio, no volverá a visitar los nodos anteriores. Nunca volverás a comenzar, porque es muy parecido a un relleno de inundación.
bummzack
7

Dices al azar, pero ¿cuánta aleatoriedad quieres? ¿Está bien si los enemigos eligen un camino que es 10 veces más largo que el más corto? ¿Está bien si los enemigos entran en un callejón sin salida y tienen que retroceder? Es decir, al azar sobre qué conjunto de caminos, y con qué distribución de probabilidad?

Suponiendo que desea que los enemigos prefieran caminos cortos, puede usar A *, pero al azar puede variar los pesos de borde que se le suministran. Luego, los enemigos siempre elegirán una ruta aleatoria que visite cada nodo como máximo una vez, con un sesgo hacia rutas más cortas. En particular, si sin aleatorización hubiera varios caminos de la misma longitud, cada uno de estos caminos se elegiría con la misma probabilidad.

Alternativamente, en A *, puede iterar sobre los vecinos en orden aleatorio. En su ejemplo, cuando la búsqueda de ruta alcanza el nodo 1, al azar colocaría primero la parte superior del vecino inferior, haciendo que la ruta superior o inferior se considere primero. Esta solución haría que los enemigos elijan entre todos los caminos más cortos al azar. En su ejemplo simple, ambas rutas más cortas serían igualmente probables, pero en una situación como:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

la ruta superior se elegiría con probabilidad 1/2, mientras que las inferiores se elegirían con probabilidad 1/4 cada una.

Meriton
fuente
No estoy seguro de qué significa exactamente el OP por "búsqueda aleatoria de rutas", pero su solución para elegir aleatoriamente entre todas las rutas más cortas es lo que supongo que quiso decir, y su "alternativa, etc." es una gran solución para ese problema.
jhocking
0

Solo una prueba de concepto:

  1. Elige una dirección aleatoria.
  2. Si esto nos hace ir a algún lugar donde ya hemos estado, elija otra dirección.
  3. Si nos hemos quedado sin direcciones, regrese al último cuadrado con una dirección inexplorada.
orlp
fuente