[Planung] Snake Projekt



  • Hallo,
    wie im Titel zu lesen ist Arbeite ich an einem Snake Projekt in C für die Schule.
    Die Ausgabe wird mit der Graphics.h realisiert.
    Leider hapert es bei mir irgendwie an meiner Planung, ich komme einfach nicht drauf wie ich Schlange und Futter mit dem Feld verbinde.

    Ich habe mir überlegt ich mache ein zweidimensionales Array Feld[x][y].
    Überall wo der Körper der Schlange ist soll in in die Koordinaten eine 1 rein geschrieben werden und für Futter eine 2 für eine spätere Kollisionsabfrage.

    Ich würde die Schlange gerne als Funktion machen, wo ich alles intern Berechne, also Größenangabe, Laufrichtung und X,Y Position.
    Futter auch als Funktion wo per Zufall X,Y Koordinaten generiert werden und auch hier die Position ins Spielfeld übertragen wird.

    Nun komme ich irgendwie nicht drauf, wie ich dem Feld[x][y] sage wo die Schlange sich grade aufhält.

    Irgendwie bin ich mir aber bei meiner Planung und Denkansätzen selber etwas unsicher ob das überhaupt so funktionieren kann 😕 .

    Währe sehr dankbar um ein paar Planungsvorschläge und Anregungen wie man es umsetzen könnte.
    C-Code brauch ich nicht unbedingt, für mich ist erstmal nur die Planung wichtig, da diese bei unseren Projekten mit Dokumentation zu 80% zählt, zudem ist es zumindest für mich einfacher ein Quellcode aus einer Planung zu erstellen.

    Danke schon mal im voraus und frohe Weihnachtswochen :xmas1:



  • mach's so, dass jeder 'pixel' ein zähler ist. wenn der schlangenkopf bewegt wird, werden alle counter runtergezählt. ist einer 0, dann wird der pixel gelöscht. frisst die schlage was, dann wird der init-wert für neue counter erhöht. so wird deine snake immer länger je mehr sie zu futtern kriegt.
    🙂



  • Wie die Schlange wächst hatte ich ich mir auch schon überlegt gehabt, indem ich den Körper wert nach jeder Futterzufuhr um 1 multipliziere.
    Bei der Bewegung wird vorne halt etwas dazuaddiert und der hintere Teil gelöscht.

    Leider muss mir erstmal verständlich werden, wie ich das Spielfeld realisiere, also wie ich die Schlange dadrauf bekomme.

    Ich muss dem Feld ja sagen, der Schlangenkörper ist an Position x,y und Futter an x,y , dann muss ja geguckt werden ob an der Position wo der Kopf sich befindet eine 0 ist oder nicht, wenn eine 1 Dort ist, also sein eigener Körper dann Game Over.
    Aber irgendwie will sich das mir von mir nicht in ein verständliches Struktogramm oder Pseudocode umsetzen lassen.

    So hatte ich mir es Anfangs Skizziert wie es intern aussehen sollte, durch die Graphics.h werden die Nullen später durch die Grafik des Spielfeldes ersetzt, Einsen bekommen nen Schlangenkörper und Zwei wird das Futter.

    0000000000
    0020010000
    0000010000
    0000010000
    0000000000



  • Du mußt dir in zwei separaten Variablen, die aktuelle Position des Schlangenkopfes sowie zusätzlich noch die Bewegungsrichtung merken.

    int nSnakeX, nSnakeY;       // Werte von 0-(MaxX-1) bzw. 0-(MaxY-1)
    int nSnakeXDir, nSnakeYDir; // Nur die Werte -1, 0, 1
    

    Bei jedem Zeitstep addierst du dann einfach die aktuelle Richtung zur Position und prüfst dann die entsprechende Feldposition ab.
    Und für das Ändern der Richtung mußt du halt entsprechend die aktuelle Richtung abfragen und neu setzen (Links- oder Rechtsdrehung).

    P.S. Dein Spielfeld alleine reicht nicht aus, sondern du mußt die gesamte Schlange als Liste implementieren ((x,y)-Position jedes einzelnen Schlangenelements, um bei einer Bewegung alle Elemente vorzurücken).
    D.h. in das Spielfeld solltest du keine Schlange eintragen...



  • Th schrieb:

    P.S. Dein Spielfeld alleine reicht nicht aus, sondern du mußt die gesamte Schlange als Liste implementieren ((x,y)-Position jedes einzelnen Schlangenelements, um bei einer Bewegung alle Elemente vorzurücken).

    Es reicht auch aus einfach das letzte "Element" der Schlange zu löschen und an den
    Anfang ein Neues einzufügen. Das dürfte effizienter sein als die gesamte Schlange
    zu bewegen.



  • Ok, wenn die Positionen relativ zum Kopf (bzw. dem Vorgänger) abgespeichert werden, ich bin aber von absoluten Positionen ausgegangen.

    Also, es gibt hierbei verschiedene Wege, hauptsache der Designer (bzw. Programmierer) versteht es.



  • Es reicht auch aus einfach das letzte "Element" der Schlange zu löschen und an den
    Anfang ein Neues einzufügen. Das dürfte effizienter sein als die gesamte Schlange
    zu bewegen.

    Für mich die verständlichere Methode.
    Muss ich für die Kollisionsprüfung dann einfach nur die länge runterrechnen mit Berücksichtigung wo die Schlange zuletzt ein Richtungswechsel hatte?
    Oder gibt es da eine einfachere Methode?



  • Für die Kollisionsprüfung brauchst du nur den Kopf der Schlange zu betrachten, denn der Rest der Schlange folgt ja dem vorherigen Weg des Kopfes.


Anmelden zum Antworten