# Hinterteil von Snake programmieren



## chaostheory (24. Mai 2011)

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:


```
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());
    }
```


----------



## Fu3L (24. Mai 2011)

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:

```
List<Part> parts = new LinkedList<Part>();
Part p = new Part();
parts.add(p);
```

Und lesen geht natürlich auch:


```
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^^


----------



## chaostheory (24. Mai 2011)

Fu3L hat gesagt.:


> 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^^


----------



## Fu3L (24. Mai 2011)

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ß^^)


----------



## chaostheory (24. Mai 2011)

Fu3L hat gesagt.:


> 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.


----------



## Fu3L (24. Mai 2011)

> 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^^


----------



## chaostheory (24. Mai 2011)

> Dieses Buch darf nicht als Programmierbuch für Anfänger verstanden werden.





> Gedrucktes Buch sofort lieferbar, 49,90 Euro
> Online-Ausgabe: sofort verfügbar, 44,90 Euro



Unter openbook habe ich es aber auch kostenlos gefunden, werde mich mal reinlesen =)


----------



## Matthias K. (24. Mai 2011)

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


----------



## chaostheory (25. Mai 2011)

Wo ist denn da die Lösung? Meinst du, dass die Schlange praktisch aus mehreren Nachfolgern besteht, wie die Waggons?


----------



## Cola_Colin (25. Mai 2011)

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.


----------



## c_sidi90 (26. Mai 2011)

Du füllst 2 Arrays (am besten int) in den du die Bestandteile der Snake speicherst 


```
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


```
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:


```
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;
        }
    }
```


----------



## SkonroX (26. Mai 2011)

angenehmste lösung meiner meinung nach ist meine ;D :

```
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


----------

