Snake - 2D



  • Hallo,
    aktuell schreibe ich aus langeweile ein Snake. Es ist ganz simpel in 2D und per GDI gezeichnet.

    Es funktioniert soweit auch recht gut, bis auf einen Haken, wo ich gerade ein Logikproblem habe.

    In Benutzung eines Timers lasse ich die Schlange wandern und ändere je nach gewählter Richtugn die Laufrichtung der Schlange.

    Nun ist es aber im klassischen Snake so, dass die Schlange je mehr sie gegessen hat länger wird. - Stellt an sich ja auch kein Problem dar, weil ich ja dann nur eins beim löschen überspringen muss.

    Allerdings tritt mein Problem beim löschen auf. Zuerst dachte ich mir, gut die Schlange bewegt sich im Koordinatensystem. Durchsuchst du dieses eben nach jedem Wechsel der Position nach dem 1. auftretenden Schlangenteil im Array, welches nicht der Kopf ist.

    Also vom Prinzip her prüfe ich, ob der Arraybereich nach links, rechts, oben und unten insgesammt mehr als einen Nachbarn hat bzw. der Kopf ist, wenn dies eben nicht der Fall ist soll das Feld freigegeben werden.

    Dies funktioniert soweit auch noch. Allerdings ist es ja auch möglich, dass das letzte Stück des Schwanzes dennoch 2 benachbarte Schlangenteile hat. Nämlich genau dann, wenn ich direkt neben einem Bereich der Schlange entlang gehe.

    Allerdings fiel mir noch kein Weg ein, wie ich dies dort auch zum löschen bekomme. Darum frage ich jetzt hier, ob ihr einen Vorschlag habt. (Hoffe doch ihr habt mein Problem verstanden.)



  • Du hast deine Datenstruktur etwas unguenstig gewaehlt, glaub ich. Hier was einfacheres:

    Speicher die "Schlangenpositionen" als verkettete Liste (oder deque): Eine Liste voller (x,y) Werte, die dir sagt, an welchen Positionen die Schlange gerade ist.
    Bei jedem Logik-Tick fuegst du am Anfang der Liste ein neues Feld ein (Schlangenkopf) und loescht den Eintrag ganz am Ende -- ausser die Schlange hat grad gegessen, dann loescht du gar nichts.

    Ist vermutlich wesentlich einfacher als deine derzeitige Logik.



  • Ja hab es nun in ein Stringarray gepackt, wo die Koordinaten für X & Y jeweils als ein String eingetragen sind und splitte den dann nur.

    Funktioniert nun auch dank deinem Ansatz. 🙂

    Vorallem mit wesentlich weniger Programmcode.


Log in to reply