Hinterteil von Snake programmieren

chaostheory

Bekanntes Mitglied
Hallo,
ich habe jetzt seit fast einem Jahr Informatik-Unterricht in der 10. Klasse und habe aus Spaß angefangen kleinere Spielchen oder Programme zu schreiben (Teilweise sehr nutzlos, z.B. wird der Bildschirm auf Knopfdruck mit bunten Kreisen zugespammt.)
Als größeres Projekt habe ich mich an das Retro-Handyspiel Snake gemacht.
Im Unterricht arbeiten wir mit BlueJ und der Bibliothek SuM, die ausschließlich zum Erlernen der Java-Grundlagen geschrieben wurde.
Das Prinzip funktioniert so, dass ein Stift etwas auf dem Bildschirm zeichnet, es dann wieder löscht und anschließend daneben neu zeichnet, so kommt eine Bewegung zustande.
Meine Schlange ist bisher nur ein einfaches Rechteck, aber ich würde gerne auch ein Hinterteil haben, das immer länger wird und auch um Ecken läuft. Im Unterricht hatten wir außer Variablen aber noch nichts, mit dem man Position speichern kann. Den Versuch mehrere Rechtecke hintereinander laufen zu lassen habe ich schnell aufgegeben, da die Anzahl an Variablen viel zu groß wurde.
Nach etwas googlen bin ich auf Arrays gestoßen, ginge es vielleicht damit? Aber wie schreibe ich, dass bei jedem Treffer die Schlange länger und somit der Array größer wird?


Anbei der Code der Mainmethode:

Java:
public void agiere()
    {
        do
        {
            if(hatTastatur.wurdeGedrueckt())
            {
                switch(hatTastatur.zeichen())
                {
                    case Zeichen.PFEILOBEN:     hatSnake.drehe(90);                                            
                                                break;
                    case Zeichen.PFEILUNTEN:    hatSnake.drehe(270);
                                                                                              break;
                    case Zeichen.PFEILRECHTS:   hatSnake.drehe(0);
                                                                                                break;
                    case Zeichen.PFEILLINKS:    hatSnake.drehe(180);
                                                                                                break;
                    case '0':                   hatSnake.zSpeed=0; break;
                    case'+':                    hatSnake.zSpeed=hatSnake.zSpeed+0.5; break;
                    case'-':                    hatSnake.zSpeed=hatSnake.zSpeed-0.5; break;
                }
                hatTastatur.weiter();
            }
                                    
            if(hatSnake.getroffen(hatFutter.hPosition(), hatFutter.vPosition()))
            {
            hatFutter.loesche();
            hatFutter.zeichne();
            hatCounter.zaehle();
            }

            hatSnake.bewege();
            hatFutter.zeichneNeu();
            hatCounter.zeichne();   
            hatCounter.zaehleNeu();
            hatBildschirm.zeichneDich(); 
        }while(!hatMaus.doppelKlick());
    }
 
Noch besser als ein Array ist zB eine java.util.List
Man könnte, für einen Anfänger, sagen, das ist wie ein Array, das seine Größe selbstständig erweitert, wenns voll ist (bei einer ArrayList wäre das genau das, bei LinkedList funktioniert es intern nochn Stück anders, aber das braucht dich nicht zu interessieren^^)

Sagen wir, du erstellst eine Klasse, deren Objekte je einen Teil der Schlange repräsentieren und nennst diese Klasse Part, dann sähe das so aus:
Java:
List<Part> parts = new LinkedList<Part>();
Part p = new Part();
parts.add(p);

Und lesen geht natürlich auch:

Java:
for(Part p : parts) {
   //zeichne den Teil p oder verschiebe ihn oder so
}

Damit wird die gesamte Liste durchlaufen und immer ein Teil daraus gelesen und über die Variable p zugänglich gemacht.

Ob das jetzt deine Fähigkeiten sprengt, weil ihr nur dieses lächerliche und unnütze Lernprogramm mit SuM nutzt, kann ich nicht einschätzen^^
 
Ob das jetzt deine Fähigkeiten sprengt, weil ihr nur dieses lächerliche und unnütze Lernprogramm mit SuM nutzt, kann ich nicht einschätzen^^

Ähm ja, tut es 😳
Als ich mal nach Tutorials danach gesucht habe, war ich auch nur noch mehr verwirrt.
Vielleicht sollte ich aber erst mal was leichteres schreiben, bei unserem Unterricht sind wir da wahrscheinlich eh erst in einem Jahr^^
 
Kenn ich aus meiner Stufe^^ Dieses Jahr Abi gemacht. Die, die 2 Jahre Informatik hatten, können nicht einmal ein Hallo Welt Programm ohne BlueJ ausführen :noe: (gut der Unterricht fand auch nur zur Hälfte der Zeit statt.. aber trotzdem arm^^)

Ich würde sagen, wenn es dich wirklich interessiert, lies einfach mal selbst ein Buch. Ich hab mir Java auch in der 10 selbst beigebracht ohne Informatikunterricht^^ 😉

Galileo Computing :: Java ist auch eine Insel – Vorwort

Das hier ist online sogar kostenlos (wobei ich persönlich gedruckte Bücher mehr zu schätzen weiß^^)
 
Das hier ist online sogar kostenlos (wobei ich persönlich gedruckte Bücher mehr zu schätzen weiß^^)

Da steht das kostet auch online 45€ ???:L
Zudem richtet es sich nicht an blutige Anfänger und da zähle ich mich lieber noch zu.
Wahrscheinlich wird mein Programmiererleben leider auf Autodidaktik hinauslaufen, vielleicht hat die Bibliothek ja was parat.
 
Die Kapitel dieses Buchs sind für Einsteiger in die Programmiersprache Java wie auch für Fortgeschrittene konzipiert.

Und dort steht ein Preis, aber der ist für die gebundene, papierende Ausgabe. Fast alle hier im Forum verweisen bei Anfängerfragen auf die Insel, weil die Insel kostenlos von vorne bis hinten online steht 😉

Ich glaube in der Bücherrei wirste nix besseres finden^^
 
Hi,
ich muss auch mit BlueJ programmieren, aber diese kleine Entwicklungsumgebung ist
für richtige Projekte nicht geeignet.
Guck mal einfach auf deine CPU-Auslastung, wenn du eine Programm ausführst.
Müsste um die 50% ausgelastet sein.
Ich würde dir empfehlen Eclipse herunter zu laden und dann richtig los zu legen.
Ich stehe dir gerne für jegliche Fragen zur Verfügung.
Jedoch ist es nicht falsch, das BlueJ-Buch durch zu arbeiten.
Im Zug-Kapitel findest du z.B. eine Lösung für dein Problem.
Außerdem gewöhnst du dir einen guten Programmier-Stile an.

Gruß,
Matthias
 
Um Snake umzusetzen kann man wohl verschiedene Ansätze wählen.

Im allgemeinen läuft es immer darauf hinaus, dass die Schlange aus einer Reihe von Einzelstücken besteht, die alle eine eigene Bewegungsrichtung für den nächsten "Zug" haben und miteinander verkettet sind.
Bei der Bewegung wird erst jedes Teil anhand seiner Wunschrichtung bewegt und danach wird jedem Teil die Bewegungsrichtung des Vordermans gegeben.
Kann man sich wie eine Reihe von Waggons vorstellen, ja.

Verwalten kann man diese einzelnen Teile am besten per OOP in einer verketten Liste.
 
Du füllst 2 Arrays (am besten int) in den du die Bestandteile der Snake speicherst

Java:
          int maxSize = 500;
          int x [] = new int [maxSize] //z.B.
          int y [] = new int [maxSize] //^
          int dotSize = 10; //Beispielsweise jenachdem wie groß dein Image ist (Pixel)

Dann brauchst du noch eine Variable die die aktuelle Größe deiner Snake speichert

Java:
 int snakeSize = 3; //3 ist der Startwert ist beliebig zu verändern


Jedes mal wenn die Schlange ein Objekt frisst, erhöst du diese Variable um 1.
Nun brauchst du ein Algorithmus, welcher die Bestandteile der Schlange im Array an die Bewegung anpasst (x,y Koords).

Das könnte in etwa so aussehen:

Java:
    public void bewegen() {

        for (int z = snakeSize ; z > 0; z--) {
            x[z] = x[(z - 1)];
            y[z] = y[(z - 1)];
        }

        if (links) {
            x[0] -= DOT_SIZE;
        }

        if (rechts) {
            x[0] += DOT_SIZE;
        }

        if (hoch) {
            y[0] -= DOT_SIZE;
        }

        if (runter) {
            y[0] += DOT_SIZE;
        }
    }
 
angenehmste lösung meiner meinung nach ist meine ;D :
Java:
private void SnakeMove() {
    for (int i = SnakeGame.lage.size() - 1; i > 0; i--)
      SnakeGame.lage.set(i, (Point)SnakeGame.lage.get(i - 1));
    if (SnakeGame.CurrentTurn == 0)
      SnakeGame.lage.set(0, new Point(((Point)SnakeGame.lage.get(0)).x, ((Point)SnakeGame.lage.get(0)).y - 17));
    if (SnakeGame.CurrentTurn == 1)
      SnakeGame.lage.set(0, new Point(((Point)SnakeGame.lage.get(0)).x - 17, ((Point)SnakeGame.lage.get(0)).y));
    if (SnakeGame.CurrentTurn == 2)
      SnakeGame.lage.set(0, new Point(((Point)SnakeGame.lage.get(0)).x + 17, ((Point)SnakeGame.lage.get(0)).y));
    if (SnakeGame.CurrentTurn == 3)
      SnakeGame.lage.set(0, new Point(((Point)SnakeGame.lage.get(0)).x, ((Point)SnakeGame.lage.get(0)).y + 17));
  }
Deklarationen:
ArrayList< Point > lage;
int CurrentTurn;

lg
 

Zurück
Oben