Snake
-
Hoi,
da ich (immer noch, aber die Zeit mangelt im Moment bisschen) vor habe mir einen kleinen Snake-Klon zu programmieren (verwendete Sprache ist für das folgende Problem eher irrelevant) stehe ich bzgl. der Überlegung an die Herangehensweise bei einem kleinen Problem:
Meine Schlange wird bewegt sich ja kontinuierlich in eine Richtung. Wenn ich jetzt aber die Richtung ändere, bewegt sich der erste Teil der Schlange in die gewünschte Richtung, während der restliche Teil der Schlange noch der alten Richtung folgt. Beispielhaft wäre das: die Schlange bewegt sich von links nach rechts, ist 10 "Elemente" lang und ich will nach die Schlange nun nach oben bewegen. Also ensteht nun mehr oder weniger ein Eckpunkt für die Schlange, dem die Schlange folgt - so wandern in den ersten Moment nach dem Richtungswechsel die ersten Elemente nach oben, während die anderen Elemente noch von links nach rechts bis zu besagten Eckpunkt wandern.
Die Frage jetzt aber ist: wie realisiere ich das am besten? Entweder denke ich einfach zu kompliziert, oder mir bleibt keine Wahl, sämtliche solcher Eckpunkte zu speichern und so die Schlange eben so durch das Feld zu loten.
Schöne Grüße
-
Sollte es nicht ausreichen, einfach an jedem Block der Schlange zu schauen wo die Nachbarblöcke liegen, um rauszufinden in welche Richtung man den Block bewegen muss?
-
Stimmt, dass wäre tatsächlich um einiges einfacher wie sich die Koordination der Punkte zu speichern!
-
Es geht noch einfacher:
man merkt sich alle Punkte der Schlange in einer Liste und beim Bewegen löscht man den hintersten Punkt der Liste und fügt am Kopf entsprechend der Richtung einen neuen Punkt hinzu.
So braucht man auch beim Zeichnen immer nur zwei Punkte zu aktualisieren (anstatt die ganze Schlange).
Programmtechnisch entweder eine (doppelt-)verkette Liste oder eine Deque (double ended queue).P.S. Und beim Verlängern der Schlange (Apfel gefunden), am Ende der Liste N gleiche Punkte hinzufügen.
-
Stimmt, ist wohl noch einfacher.
Danke
-
Th69 schrieb:
Programmtechnisch entweder eine (doppelt-)verkette Liste oder eine Deque (double ended queue).
Nein, einen Ringpuffer.
-
Jap, ein einfacher Ringbuffer wär wohl das schlaueste.
-
Und den Ringbuffer dann vergrößern wenn die Schlange länger wird, oder wie?
-
Ja
-
Gibt es nicht eine Boost-Implementierung eines Ringpuffers?
-
Hacker schrieb:
Gibt es nicht eine Boost-Implementierung eines Ringpuffers?
Ja. http://www.boost.org/doc/libs/1_49_0/libs/circular_buffer/doc/circular_buffer.html