Problem bei Spiel Snakes

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem bei Spiel Snakes

    Sollen von der Schule aus das Spiel Snakes umsetzen (kennt jeder wahrscheinlich von den alten Nokia Handys ^^).

    Hab jetzt allerdings ein Problem mit den "Futterstücken". Ich weiss nicht genau, wie ich das machen soll und wie es am Besten ist.
    Also ich mach dafür ne extra Klasse z.B. TFutter. Und davon werden, wenn so ein Futter erscheinen soll, an zufälliger Position dynamische Objekte erzeugt. Wenn jetzt die Schlange die gleiche Position wie das Futterteil hat, wird ja die Schlange nach hinten länger.
    Und genau da ist das Problem. Soll ich jetzt einfach die Futterdinger hintendransetzten und mitlaufen lassen, oder wie macht man das am Besten?? Die Schlange sollte ja aus einzelnen Segmenten bestehen, damit sie auch gut ums Eck laufen kann.

    Und gerade kam das nächste Problem auf. Kann man (dynamische) Objekte mit Arrays durchnummerieren. Ich habs mir so vorgestellt: "TFutter *Futter[1];" Aber so will es nicht klappen. Ich brauch 20 Objekte (wenn ich es so wie oben mache) und will die nicht alle einzeln von Hand machen...

    lg
    [SIZE="1"][COLOR="DeepSkyBlue"][COLOR="Black"]W[/color]ithout
    [COLOR="Black"]A[/color]ny
    [COLOR="Black"]R[/color]easons[/color]
    [/SIZE]
  • Ich habe es mal in TP geproggt, da stell ich dir mal hier rein, wie ich das gemacht habe

    Quellcode

    1. procedure generiere_futter(var futter:t_futter);
    2. var x,y:integer;
    3. begin
    4. RANDOMIZE;
    5. repeat
    6. x:=random(BILD_X-2)+2;
    7. y:=random(BILD_Y-2)+1;
    8. until not (ausgabe.besetzt(x,y));
    9. futter.x:=x;
    10. futter.y:=y;
    11. futter.punkte:=punkte_berechnen(einstellungen);
    12. ausgabe.zeichen_zugriff(FUTTER_ZEICHEN,x,y);
    13. ausgabe.farb_zugriff(FUTTER_FARBE,x,y);
    14. end;
    Alles anzeigen

    sollte dir ein wenig weiterhelfen
    Judenverfolgung, Inquisitionen, Kreuzigungen,
    Hexenverbrennung, wir wissen wie man feiert
    - Ihre Kirche †
    Blacklist
  • Du wirst doch sicherlich auch sowas wie eine Snake Klasse haben mit der die Schlange repräsentiert wird oder? Ich würde die schlange selbst als eine art Liste aufbauen in der jedes Segment der schlange + Position steht. Wenn der kopf nun auf was essbares stößt schiebst du das neue Segment einfach in die Liste, setzt es auf die letzte aktuelle Position und fährst mit der restlichen routine normal fort (positionen der segmente erhöhen, neu zeichnen). Beim Nokia Snake bleibt meine ich das ende der Schlange ein segment lang stehen wenn man was frist.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hört sich schonmal nicht schlecht an. Nur weiss ich nicht genau wie ich das umsetzen soll. Eigene Klasse für die Schlange hab ich schon.
    Hab jetzt mal mit ner Futterklasse versucht, wo dann das Futterteil hinter der Schlange herläuft, das klappt bisher gut. Aber ich glaube, das ist auf Dauer umständlich wenn mal mehrere dranhängen...
    [SIZE="1"][COLOR="DeepSkyBlue"][COLOR="Black"]W[/color]ithout
    [COLOR="Black"]A[/color]ny
    [COLOR="Black"]R[/color]easons[/color]
    [/SIZE]
  • implementier die Schlange als ne linkedList (verkettete Liste).

    in etwa so (nur grobe idee, so in etwa würd ichs denk ich machen)

    PHP-Quellcode

    1. class CSnake {
    2. private:
    3. CSnake *next; // nächstes Schlangenelement (beim Kopf das letzte)
    4. CSnake *last; // vorgänger (beim letzten element der kopf)
    5. int posx;
    6. int posy;
    7. bool isHead;
    8. public:
    9. CSnake(bool pIsHead) { isHead = pIsHEad; /* Noch weitere Initialisierungen der Schlange (elemente einfügen etc) */ } //konstruktor sagt ob das Element der Kopf ist
    10. bool moveTo(int direction); // könnte man als enum für hoch runter links rechts machen
    11. bool update(); // prüft last element ob die koordinaten sich geändert haben (x oder y position darf nicht mehr als 1 step entfernt sein, wenn erstes Element, wird hier auch gefressen und neues Element angehängt)
    12. void addElement(); // Fügt ein neues Element ans Ende der Schlange ein
    13. void drawSnake(); //Zeichnet die gesamte Schlange vom Kopf bis zum Schwanz
    14. // ... Noch mehr methoden die ich jetzt auf die schnelle sicher vergessen hab ;)
    15. };
    Alles anzeigen


    Nur mal ein spontaner Gedankengang von mir... vielleicht ist der ja garnicht schlecht ;)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • ich habs mal in java so umgesezt:
    die einzelnen ketten der schlange in ein array einen byte um zu zählen wie viele glieder sie schon hat. wenn ein futterstück weg ist dann einfach den byte um eins erhöhen jenachdem wie hoch der byte ist werden neue glieder hinzugefügt. Die position wird in einer for schleife bestimmt, bei bewegung kriegt das erste glied eine neue position das zweite die des ersten vor der bewegung usw
    Wenn du zum weibe gehst nimm die Peitsche mit (Nietzsche)
  • C-R-K schrieb:

    @Zerd
    Ich werde hier NICHT mein gesamten Snake-Code posten... wozu soll ich die Arbeit anderer machen, wenn die sich dann nicht mal mehr anstrengen müssen?


    Ja und jetzt?
    Hab ich meinen ganzen code geposted?? Hab ich ihm ne komplette Lösung gegeben?? Was isn das für ne Aussage??
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Danke erstmal Zerd ;)
    Das von C-R-K kapier ich auch nicht -.-

    PHP-Quellcode

    1. CSnake *next; // nächstes Schlangenelement (beim Kopf das letzte)
    2. CSnake *last; // vorgänger (beim letzten element der kopf)

    Den Teil kapier ich nicht. Sind doch dann nur 2 Objekte? Oder hat das was mit der LinkedList zu tun? Die kenn ich nämlich nicht.

    Ich habs jetzt mal so probiert, dass ich ein extra Futterobjekt gemacht hab, dass sich nachher hinten dran hängt. Die Position ist dann von der Richtung, in die die Schlange gerade läuft, abhängig. Also bei hoch ist dann die Position "y(Schlange)-20". Das läuft bisher so wie es soll.


    Folgendes läuft bei jedem Takt durch:

    PHP-Quellcode

    1. [...]
    2. if((Futter->gibXPos()==x/20)&&(Futter->gibYPos()==y/20)) //Überprüfen ob Schlange über Futter ist
    3. {
    4. Futter->setGefressen(true);
    5. }
    6. if(Futter->getGefressen())
    7. {
    8. //Position von Futter an Position von Schlange anpassen
    9. if (derWurm->gibRichtung()==1) Futter->anhaengen((derWurm->gibXPos()-20)/20,derWurm->gibYPos()/20);
    10. if (derWurm->gibRichtung()==2) Futter->anhaengen((derWurm->gibXPos()+20)/20,derWurm->gibYPos()/20);
    11. if (derWurm->gibRichtung()==3) Futter->anhaengen(derWurm->gibXPos()/20,(derWurm->gibYPos()-20)/20);
    12. if (derWurm->gibRichtung()==4) Futter->anhaengen(derWurm->gibXPos()/20,(derWurm->gibYPos()+20)/20);
    13. }
    Alles anzeigen

    Das mit dem /20 kommt davon, dass ich nicht immer mit Pixel, sonder beim Futter im Raster arbeite...ist für mich so leichter.

    Ich hab mir jetzt überlegt, dass ich in der Objektdeklaration (ist im Private von der Steuerungsschicht) folgendes mach:

    PHP-Quellcode

    1. TFutter *Futter[20] //20x fressen bis nächstes Level

    und dann eine int-Variable, z.B. FutterNr, nehm, die beim Fressen inkrementiert wird und mit der ich dann auf die Futterobjekte zugreifen kann, also ungefähr so (müsste dann oben auch noch angepasst werden):

    PHP-Quellcode

    1. Futter[FutterNr]->blablabla;


    Ist das sinnvoll? Weil funktionieren tut es so ;)
    Nur das ich ein Problem bekomme, wenn ich das zweite Futter dranhängen möchte. Da müsste ich dann mit der vorherigen Position arbeiten, weiss allerdings auch nicht, wie ich das am Besten mache. Sollte ich da zwei extra Variablen (für x u. y) machen, in die ich vor dem aktualisieren der Position die jetzige reinschreibe? Sonst fällt mir nichts anderes ein.

    ~edit~
    Hab es gleich ausprobiert und es klappt perfekt!!!!
    [SIZE="1"][COLOR="DeepSkyBlue"][COLOR="Black"]W[/color]ithout
    [COLOR="Black"]A[/color]ny
    [COLOR="Black"]R[/color]easons[/color]
    [/SIZE]
  • Zuerst mal: Es gibt immer mehrere Möglichkeiten etwas zu lösen. Es ist immer gut sich selbst gedanken zu machen, und das hast du gemacht und das ist auch gut so :)

    lalala22 schrieb:


    PHP-Quellcode

    1. CSnake *next; // nächstes Schlangenelement (beim Kopf das letzte)
    2. CSnake *last; // vorgänger (beim letzten element der kopf)

    Den Teil kapier ich nicht. Sind doch dann nur 2 Objekte? Oder hat das was mit der LinkedList zu tun? Die kenn ich nämlich nicht.

    Eine LinkedList speichert in jedem Element einen Zeiger auf das nächste Element. Das Beispiel was ich da geschrieben hab ist eine doppelt verlinkte Liste, die sowohl den Zeiger zum vorherigen als auch zum nachfolgenden Objekt speichert. -> Liste (Datenstruktur) - Wikipedia


    Ist meiner Meinung nach eine ganz gute idee das bei nem snake-clone einzusetzen... Aber wie gesagt verfolge erstmal deine Idee :)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]