snake problem...



  • Ziel: Speichern der gesamten Schlange anstatt nur der jetzigen Position + Länge.

    Problem mit Array: Würde eine beschränkte Schlangenlänge bedeuten und desweiteren immer volle Größe haben - auch wenn die Schlange nur aus 2 Elementen bestehen würde.

    Lösung: Eine Liste :). Wenn du noch keine verkettete Liste kennst such danach mal bei Google und schau dir ein Tutorial an!

    MfG SideWinder



  • ja, aber dann würde er doch immer nur "OOOOOO" ausgeben, oder?!
    also auch wenn man nach oben ode runten fahrn würde...oder kurve etc



  • ok, hab mir jetzt ma 3 tuts mehrmals durchgelesen..aber ich raff das net...

    könnt mir das ma bitte jdm erklären? un vor allem annem verständlcihen bsp zeigen wies geht? (un evtl. sagen wie ichs auf mein projekt anwenden kann...aber die erten 2 punkte sin wichtig(er) 😉 )



  • Eine verkettete Liste ist ein Objekt, bei dem du ganze Datenstrukturen hinzufügen und Löschen kannst.
    Quasi ein Flexibles Array.
    Du würdest dann dort drin X und Y positionen speichern und immer das Vorderste(also älteste) Zeichen löschenund ein neues (am Ende) einfügen...
    Und wenn man ein Teil Frisst muss das am Ende halt nicht gelöscht werden.

    Oder so in der art... ^^"

    edit: wenn ich zuhause bin schaue ich mal ob ich die zeit hab was zu schreiben für dich..

    Ansonsten halt weitersuchen..
    VIelleicht auch mal auf Englisch? Dann nach "linked-list" schaun.. sollte gehen..



  • danke schonma...solangsam gehts licht an...

    but...

    wie is denn die syntax?! zm erstellen/ändern/ausgeben...weil in den tuts stand nur was generell drüber drinn 😉

    das spiel is ja komplett fertig, bis auf das 😉



  • // Basics:
    struct snakeelem
    {
        snakeelem* next;
        int x;
        int y;
    };
    
    snakeelem* kopf = 0;
    snakeelem* schwanz = 0;
    
    // Mit der Funktion fügen wir vorne in die Liste ein (also vorne am Kopf ein Element dazu):
    void insert (snakeelem* kopf, snakeelem* schwanz, int x, int y)
    {
        // Neues Schlangenteil erstellen
        snakeelem* newelem = new snakeelem;
        newelem->x = x;
        newelem->y = y;
    
        // Je nachdem ob die Liste leer ist oder nicht gibts zwei Einfügearten:
        if(kopf == 0)
        {
            // VORHER: 000000
                       ^    ^
                       Kopf Schwanz
            newelem->next = 0;
            kopf = newelem;
            schwanz = newelem;
            // DANACH: ELEMENT1 -> 0
            //         ^      ^
            //         Kopf   Schwanz
        }
        else
        {
            // VORHER: ELEM1 -> ELEM2 -> ELEM3 -> 0
            //         ^                 ^
            //         Kopf              Schwanz
            newelem->next = kopf;
            kopf = newelem;
            // DANACH: NEWEL -> ELEM1 -> ELEM2 -> ELEM3 -> 0
            //         ^                          ^
            //         Kopf                       Schwanz
        }
    }
    
    // Mit der Funktion löschen wir am Ende der Liste (also hinten ein Element weg):
    void delete (snakeelem* kopf, snakeelem* schwanz)
    {
        // nix zu löschen da? wiederschaun
        if(kopf==0)
            return;
    
        // nur eins da?
        if(kopf == schwanz)
        {
            delete kopf;
            kopf = 0;
            schwanz = 0;
        }
    
        // Bis eins vor den Schwanz wandern und das Element danach löschen, das tun wir deshalb, damit wir eins vor Schwanz->next auf 0 setzen können - wichtig 
        snakeelem* runner = kopf;
        while(runner->next != schwanz)
            runner = runner->next;
    
        delete runner->next;
        runner->next = 0;
        schwanz = runner;
    }
    
    // Mit der Funktion löschen wir am Schluss die gesamte Liste (damit wir den mit new geholten Speicher in den insert-Funktionen auch wieder brav freigeben):
    void clear (snakeelem* kopf, snakeelem* schwanz)
    {
        while(kopf)
        {
            snakeelem* temp = kopf;
            kopf = kopf->next;
            delete temp;
        }
    }
    
    // Zu Beginn fügst du jetzt in deine Liste ein paar Elemente ein:
    insert(k,s,5,5);
    insert(k,s,6,5);
    insert(k,s,7,5);
    insert(k,s,8,5);
    
    // Jedesmal wenn sich die Schlange bewegt:
    position_mit_leerzeichen_ueberschreiben(s->x,s->y)
    delete(k,s);
    insert(k,s,neuesx,neuesy);
    an_position_schlangenelement_zeichnen(neuesx,neuesy);
    
    // Wenn sie dabei frisst, delete einfach weglassen
    

    Ich glaub das wars mal für den Anfang, ist sowieso ein harter Brocken 🙂

    MfG SideWinder



  • vielen dank...werd mich dann ma ransetzen un versuchen das zu verstehen^^



  • ähmm...ja...wie füg ich das ein?!^^



  • *topic wieder hochschieb*

    bräuchte bitte noch hilfe beim einfügen....



  • den funktionsname "delete" darf man doch nicht benutzen oder?

    bei
    insert(k,s,5,5);
    etc. un bei allem in dem k und s vorkommen, beschwerter sich, wegen undecleared....als was, wie muss ich k/s deklarieren?!

    position_mit_leerzeichen_ueberschreiben(s->x,s->y)

    an_position_schlangenelement_zeichnen(neuesx,neuesy);

    un was muss ich dafür schreiben?! (also für das vor der klammer)


Anmelden zum Antworten