Entschuldigen Sie den schlechten Titel, aber ich hatte keinen besseren Weg, ihn auszudrücken ...
Es gibt also dieses erstaunliche Spiel von Nintendo (yes!) Auf der Wii namens WiiPlay . Es gibt 9 Minispiele, und mein Lieblingsspiel heißt Tanks! . Es geht darum, gegnerische Panzer zu zerstören, ohne sich selbst zu zerstören. Hier ist ein Screenshot eines Levels:
Eine Möglichkeit, Panzer zu zerstören, besteht darin, Kugeln abzufeuern. Es gibt diesen hellgrünen feindlichen Panzer, der Hochgeschwindigkeitskugeln abfeuert, die zweimal (gegen die Wände und Blöcke) prallen. Sie können sehen, wie der Panzer des Spielers sofort zerstört wird, wenn er dort bleibt, wo er jetzt ist, da dieser Kalkpanzer in der Mitte eine Kugel abfeuern kann, die dem grünen Pfad folgt, den ich auf dem Bild gezeichnet habe.
Als Amateur-Programmierer habe ich mich gefragt, wie der Kalk-Panzer bestimmen kann, in welche Richtung er feuern soll, um den Spieler-Panzer zu schlagen.
Ich habe selbst darüber nachgedacht, aber keinen möglichen Algorithmus gefunden. Ich werde meine Schlussfolgerungen erklären, falls sie jemanden inspirieren. Nur der Einfachheit halber in meiner Erklärung, nehme ich an eine Wand zu sein , jede Oberfläche , gegen die eine Kugel abprallen kann . Ein isoliertes Rechteck von Blöcken bildet somit vier Wände.
Ich bin zu dem Schluss gekommen, dass die beiden Punkte, an denen die Kugeln abprallen, immer entweder auf einer Seite eines Parallelogramms liegen oder entgegengesetzte Eckpunkte eines Parallelogramms werden. Der schießende feindliche Panzer und der Spielerpanzer, auf den er abzielt, sind nicht unbedingt die anderen 2 Eckpunkte, sondern liegen definitiv auf den Linien, die zu einer der vier Seiten des Parallelogramms kollinear sind. Hier ist eine Illustration der 4 Möglichkeiten, wie ein Parallelogramm erstellt werden kann:
HOR-VER bedeutet, dass die Kugel zuerst auf eine horizontale Wand trifft, dann auf eine vertikale Wand.
Und dann stecke ich fest. Ich überlegte, ob ich mich auf einer Linie, die den feindlichen Panzer und den Spielerpanzer verbindet, auf der Karte bewegen sollte, um herauszufinden, ob bei zwei Treffern mit einer beliebigen Wand ein Parallelogramm entsteht müssen mit den Eckpunkten des Parallelogramms übereinstimmen.
Ich bin mir auch des allgemeinen Ablaufs des Algorithmus nicht sicher. Nimmt der Algorithmus eine der folgenden 2 Strukturen an oder bin ich mit beiden falsch?
- Finden Sie mögliche Wege heraus und markieren Sie immer einen als den besten (kann der kürzeste, der dunkelste, der unvermeidlichste sein oder eine kombinierte und gewichtete Bewertung basierend auf mehreren Kriterien) und vergessen Sie den Rest. Die verbleibende Berechnung ist die beste.
- Bestimmen Sie zuerst alle Wände, die mit der Kugel erreichbar sind (die Kugel muss nicht gegen eine andere Wand prallen, um jede dieser Wände zu erreichen), und bestimmen Sie dann alle erreichbaren Bereiche an jeder dieser Wände (manchmal ist es unmöglich, einen entfernten Punkt zu erreichen) Eine Wand ohne Abpraller (wenn eine andere Wand in Ihrer Nähe steht), bestimmen Sie erneut alle erreichbaren Wände mit einem Abpraller und alle Reichweiten, die auf diesen Wänden erreichbar sind. Diese 4 Prozesse können auf ähnliche Weise wie Raytracing durchgeführt werden. Wenn der Panzer des Spielers während jedes Vorgangs von einem Strahl getroffen wird, ermitteln Sie den Kugelpfad entsprechend diesem Strahl.
Meiner Meinung nach ist dieser Algorithmus schwer herauszufinden, weil:
- eine Kugel kann in jede Richtung abgefeuert werden; und
- Es gibt unendlich viele Punkte an jeder Wand, wie in der Mathematik, wo es unendlich viele Punkte auf einer Linie gibt.
Aber Nintendo-Leute haben es trotzdem geschafft, also ... hat jemand eine Idee?