Désolé pour le pauvre titre mais je n'avais pas de meilleure façon de le dire ...
Il y a donc ce jeu incroyable de Nintendo (oui!) Sur Wii appelé WiiPlay . Il y a 9 mini-jeux, et mon préféré s'appelle Tanks! . Il s'agit de détruire les chars ennemis COM sans vous faire détruire. Voici une capture d'écran d'un niveau:
Une façon de détruire des chars est de tirer des balles. Il y a ce char ennemi vert lime qui tire des balles à grande vitesse qui ricochent (contre les murs et les blocs) deux fois. Vous pouvez voir comment le réservoir du joueur peut être instantanément détruit s'il reste à l'endroit où il se trouve maintenant, car ce réservoir de chaux au centre peut tirer une balle qui suit le chemin vert que j'ai tracé sur l'image.
En tant que programmeur amateur, je me suis demandé comment le réservoir de chaux peut déterminer dans quelle direction il doit tirer pour frapper le réservoir du joueur.
J'y ai pensé moi-même mais je n'ai trouvé aucun algorithme possible. Je vais expliquer mes conclusions au cas où elles inspireraient quelqu'un. Pour plus de simplicité lors de mon explication, je suppose qu'un mur est n'importe quelle surface contre laquelle une balle peut ricocher . Un rectangle isolé de blocs forme ainsi quatre murs.
J'ai conclu que les 2 points auxquels les ricochets de balle se situent toujours d'un côté d'un parallélogramme ou deviennent des sommets opposés d'un parallélogramme. Le char ennemi tirant et le char joueur qu'il vise ne sont pas nécessairement les 2 autres sommets mais se trouvent définitivement sur les lignes colinéaires à l'un ou l'autre des quatre côtés du parallélogramme. Voici une illustration des 4 façons possibles de former un parallélogramme:
HOR-VER signifie que la balle frappe d'abord un mur horizontal, puis elle frappe un mur vertical.
Et puis je suis coincé. J'ai pensé à contourner une ligne qui relie le tank ennemi et le tank joueur autour de la carte pour voir si elle forme un parallélogramme avec deux coups sûrs avec n'importe quel mur, mais cela ne fonctionne pas toujours parce que le tank ennemi et le tank joueur ne sont pas nécessairement coïncidente avec les sommets du parallélogramme.
De plus, je ne suis pas sûr du flux général de l'algorithme. L'algorithme prend-il l'une des 2 structures suivantes, ou peut-être que je me trompe avec les deux?
- Continuez à trouver des chemins possibles et marquez-en toujours un comme le meilleur (peut être le plus court, le plus obscur, le plus incontournable ou une évaluation combinée et pondérée basée sur plusieurs critères) et oubliez le reste. Celui qui reste après tout le calcul est le meilleur à prendre.
- Déterminez d'abord tous les murs accessibles en premier avec la balle (la balle n'a pas besoin de ricocher contre un autre mur pour atteindre chacun de ces murs), puis déterminez toutes les plages accessibles sur chacun de ces murs (il est parfois impossible d'atteindre un point éloigné sur un mur sans ricochet si un autre mur se trouve près de chez vous), puis déterminez à nouveau tous les murs accessibles avec un ricochet, et toutes les plages accessibles sur ces murs. Ces 4 processus peuvent être effectués d'une manière similaire au lancer de rayons. Au cours de chaque processus, si le tank du joueur est touché par un rayon, déterminez le chemin de la balle en fonction de ce rayon.
À mon avis, cet algorithme est difficile à comprendre car:
- une balle peut être tirée dans n'importe quelle direction; et
- il y a infiniment de points sur n'importe quel mur, comme en mathématiques, où il y a infiniment de points sur une ligne.
Mais les gens de Nintendo ont quand même réussi, alors ... quelqu'un avec une idée?