Perdón por el pobre título, pero no tenía una mejor manera de expresarlo ...
Así que hay un juego increíble de Nintendo (¡sí!) En Wii llamado WiiPlay . Hay 9 minijuegos, ¡y mi favorito se llama Tanques! . Se trata de destruir tanques enemigos COM sin que te destruyan a ti mismo. Aquí hay una captura de pantalla de un nivel:
Una forma de destruir tanques es disparando balas. Existe este tanque enemigo verde lima que dispara balas de alta velocidad que rebotan (contra las paredes y los bloques) dos veces. Puedes ver cómo el tanque del jugador puede ser destruido instantáneamente si se queda donde está ahora, ya que ese tanque de cal en el centro puede disparar una bala que sigue el camino verde que dibujé en la imagen.
Como programador aficionado, me he estado preguntando cómo puede determinar el tanque de cal en qué dirección debe disparar para golpear el tanque del jugador.
Lo pensé yo mismo, pero no se me ocurrió ningún algoritmo posible. Explicaré mis conclusiones en caso de que inspiren a alguien. Solo por simplicidad durante mi explicación, supongo que una pared es cualquier superficie contra la cual una bala puede rebotar . Un rectángulo aislado de bloques forma así cuatro paredes.
Llegué a la conclusión de que los 2 puntos en los que la bala rebota siempre se encuentran en un lado de un paralelogramo o se convierten en vértices opuestos de un paralelogramo. El tanque enemigo que dispara y el tanque del jugador al que apunta no son necesariamente los otros 2 vértices, sino que definitivamente se encuentran en las líneas colineales a cualquiera de los cuatro lados del paralelogramo. Aquí hay una ilustración de las 4 formas posibles en que se puede formar un paralelogramo:
HOR-VER significa que la bala primero golpea una pared horizontal, luego golpea una pared vertical.
Y luego estoy atascado. Pensé en moverme alrededor de una línea que conecta el tanque enemigo y el tanque del jugador alrededor del mapa para ver si forma un paralelogramo con dos golpes con cualquier muro, pero esto no siempre funciona porque el tanque enemigo y el tanque del jugador no están necesariamente coincidente con los vértices del paralelogramo.
Además, no estoy seguro del flujo general del algoritmo. ¿El algoritmo toma alguna de las siguientes 2 estructuras, o tal vez estoy equivocado con ambas?
- Siga descubriendo posibles caminos y marque siempre uno como el mejor (puede ser el más corto, el más oscuro, el más inevitable, o una evaluación combinada y ponderada basada en múltiples criterios) y olvide el resto. El que queda después de todo el cálculo es el mejor para tomar.
- Primero determine todas las paredes primero alcanzables con la bala (la bala no necesita rebotar contra ninguna otra pared para alcanzar cada una de estas paredes), luego determine todos los rangos alcanzables en cada una de estas paredes (a veces es imposible alcanzar un punto lejano en una pared sin rebote si hay otra pared cerca de usted), luego determine de nuevo todas las paredes accesibles con rebote, y todos los rangos alcanzables en estas paredes. Estos 4 procesos se pueden realizar de manera similar al trazado de rayos. Durante cada proceso, si el rayo golpea el tanque del jugador, descubra el camino de la bala de acuerdo con ese rayo.
En mi opinión, este algoritmo es difícil de entender porque:
- se puede disparar una bala en cualquier dirección; y
- hay infinitos puntos en cualquier pared, como en matemáticas, donde hay infinitos puntos en una línea.
Pero la gente de Nintendo lo logró de todos modos, así que ... ¿alguien con una idea?