Encontrar ruta en un juego Java 2d?

votos
6

Básicamente es un juego de clones de pacman en el que estoy trabajando. Tengo una clase Enemy y se crearon 4 instancias de esta clase que representan 4 fantasmas del juego.

Todos los fantasmas se inician en áreas aleatorias de la pantalla y luego tienen que abrirse paso hacia el personaje de pacman. A medida que el jugador controla el pacman, moviéndolo, debe seguirlo y tomar el camino más cercano posible hacia él.

No hay laberinto / obstáculos (todavía) por lo que todo el mapa (400x400 píxeles) está abierto para ellos.

Para el jugador y cada Fantasma, puedo recuperar los atributos X, Y, ancho y alto de la imagen. Además, ya tengo un algoritmo de detección de colisión, así que no me preocupa eso, solo los fantasmas encuentran su camino hacia pacman.

Publicado el 08/03/2009 a las 06:14
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
0

Puedes comenzar a mirar A * (Una estrella)

Y aquí hay una página que tiene enlaces a otros algoritmos de búsqueda de ruta.

[edit] gah ... el cerebro es demasiado lento ... se olvidó de este libro, es C o C ++ (se me olvida cuál), pero aún se pueden obtener los conceptos para Java. Puede que no sea lo más fácil para ti leer, pero no está mal en general. AI para Game Developers por David M. Bourg, Glenn Seemann .

Respondida el 08/03/2009 a las 06:17
fuente por usuario

votos
12

Para un buen algoritmo de pathfinding, el uso de A * probablemente sería una buena idea, sin embargo, para un juego simple que no requiere una búsqueda de ruta sofisticada, eficiente y efectiva, simplemente haciendo que los personajes se muevan hacia un objetivo descubriendo la dirección de el objetivo debería ser suficiente.

Por ejemplo, la decisión de hacer que el personaje se mueva, en pseudocódigo:

if (target is to the left of me):
    move(left);
else
    move(right);

if (target is above me):
    move(up);
else
    move(down);

Sí, el personaje no hará el movimiento más eficiente, pero se acercará más y más al objetivo en cada iteración del ciclo del juego.

También creo que un juego de arcade de principios de los 80 probablemente no usaría sofisticados algoritmos de pathfinding.

Respondida el 08/03/2009 a las 06:25
fuente por usuario

votos
6

Si solo tiene una cuadrícula de píxeles, un "gran campo" en el que Pacman y el fantasma pueden moverse libremente, entonces el camino más corto es fácil: una línea recta entre el fantasma y el pacman.

Pero el "camino más corto" invariablemente significa que estamos tratando de resolver un problema de teoría de grafos. (¡Estoy asumiendo el conocimiento de gráficos, algunas teorías de grafos, matrices adj, etc.!)

En el caso anterior, considere cada píxel como un nodo en un gráfico. Cada nodo está conectado a sus vecinos por un borde, y cada borde tiene el mismo "peso" (moverse al nodo "arriba" no es más lento que moverse al nodo "debajo").

Entonces tienes esto: ("*" = nodo, "-, /, \, |" = borde)

*-*-*
|\|/|
*-*-*  ... (etc)
|/|\|
*-*-* 

Si Pacman está en el centro, puede moverse a cualquier otro nodo muy fácilmente.

Algo más cercano a la realidad podría ser esto:

*-*-*
| | |
*-*-*  ... (etc)
| | |
*-*-* 

Ahora, pacman no puede moverse en diagonal. Para ir del centro a la parte inferior derecha, se requieren 2 "saltos" en lugar de uno.

Para continuar la progresión:

*-*-*-*
| | | |
| | | |
| | | |
*-*-*-*
| | | |
*-*-*-*

Ahora, para pasar de un nodo en el medio a un nodo en la parte superior, necesita 3 saltos. Sin embargo, para avanzar hacia la parte inferior solo se necesita 1 salto.

Sería fácil traducir cualquier configuración de tablero de juego en un gráfico. Cada "intersección" es un nodo. El camino entre dos intersecciones es un borde, y la longitud de ese camino es el peso de ese borde.

Entrar a*. Al construir un gráfico (use una matriz de ajuste o una lista de nodos), puede usar el algoritmo A * para encontrar la ruta más corta. Otros algoritmos incluyen Dijkstra. ¡Y muchos otros! Pero primero necesitas enmarcar tu problema en términos de un gráfico, y luego jugar con cómo irías del nodo A (pacman) al nodo B (fantasma).

¡Espero que ayude!

Respondida el 08/03/2009 a las 06:55
fuente por usuario

votos
0

Creo que elegir el algoritmo de ruta más corto en cada movimiento realizado por pacman. Una muy buena implementación es el algoritmo de Dijkstra .

Solo para resumir: Visualice el laberinto como un gráfico con vértices y bordes. Cada borde tiene una espera (en su caso, todos los bordes tienen el mismo peso). El algoritmo encuentra la ruta más corta desde el vértice de origen al vértice de destino moviendo un paso hacia abajo cada borde accesible inmediato. Luego, en el siguiente vértice haces lo mismo y sigues haciendo hasta llegar al objetivo. El primer camino alcanzado es el camino más corto. Puede haber muchas optimizaciones hechas a este algoritmo para acelerar cosas como tener en cuenta dónde estaba el pacman en su posición anterior y en qué dirección se movió para que pueda obtener algo de herejía en el algoritmo. Sugeriría encontrar el camino más corto de cada fantasma a pacman en cada movimiento y mover el fantasma en esa dirección. Eventualmente la distancia se reducirá y podrás capturar pacman.

Otra heurística que puede usarse para encontrar todos los bordes inmediatos accesibles desde pacman e intentar cubrir la mayor cantidad de estos vértices como sea posible por fantasmas. Entonces, en lugar de configurar a pacman como el vértice objetivo, establecemos los vértices inmediatamente accesibles por pacman como objetivo, el resultado será que los fantasmas disponibles tratarán de cubrir las principales rutas de escape de pacman y atraparlo.

Respondida el 08/03/2009 a las 08:26
fuente por usuario

votos
3

Ha sido un tiempo muy largo, pero de memoria los fantasmas en Pac-Man no hicieron mucho en el camino de pathfinding. Realizarían un recorrido de laberinto aleatorizado bastante estándar hasta que lo "descubrieran", lo que implicaba encontrar un camino sin obstrucciones a lo largo del eje de un corredor hacia usted, y luego se moverían directamente hacia usted hasta que desapareciera de su línea de visión, con lo cual se reanudaría un patrón aleatorio. En niveles más altos, Pac-Man dejaría rastros invisibles detrás de él por un tiempo que los fantasmas "huelen" y a veces siguen.

Cuando Pac-Man tiene un encendido, la única diferencia en el algoritmo es que, cuando te vieron, los fantasmas huirían de ti en lugar de moverte hacia ti.

Entonces, para una experiencia auténtica, probablemente no necesite un algoritmo de identificación de caminos muy sofisticado. Si quieres ser elegante, por supuesto, puedes implementar A *.

Respondida el 10/03/2009 a las 09:11
fuente por usuario

votos
2

Caminar directamente hacia tus enemigos es un comienzo, pero cuando agregas un laberinto querrás agregar un pathfinding un poco más inteligente para que tus fantasmas no se atasquen en curvas o callejones sin salida.

El siguiente tutorial es una gran guía ligera para comenzar con A *, con ejemplos descargables.

Búsqueda de ruta en mapas basados ​​en mosaico

Respondida el 12/03/2009 a las 13:42
fuente por usuario

votos
1

en Pacman, todos los fantasmas tenían un algoritmo de persecución diferente

  • Blinky -> Chases. Por lo general, tomará la ruta más corta hacia usted y tenderá a seguirla.
  • Pinky -> Emboscadas. Tiende a tomar una forma más indirecta de pac-man. Mortal. (meñique y parpadeante tienden a tomar decisiones diferentes al elegir una dirección, a menudo enjaulándolo en una esquina)
  • Inky -> Freak. Este tipo actúa de manera extraña. Se mueve por el tablero bastante al azar, pero a veces persigue cuando se acerca.
  • Clyde -> Idiota. Se mueve al azar. No es una gran amenaza.

Los fantasmas tienen un patrón interesante programado en sus movimientos: de vez en cuando, simultáneamente cesan y desisten de perseguir a Pac-Man y regresan a sus respectivos rincones del laberinto, ingresando al "modo de dispersión".

hay una descripción completa del algo en el dosier de pacman

Saludos

Guillaume

Respondida el 10/04/2009 a las 15:59
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more