# Schulprogramm "Snake"



## Nookieslot (28. Nov 2012)

Hallo Leute,

ich muss ein Snakespiel in Java programmieren. Dabei wollte ich, dass die Schlange, wie beim richtigen "Snake" von alleine in eine Richtung läuft und ich dann mit Buttons die Richtung ändern kann. Leider kann ich mit der Pause-Funktion die Richtung zwischendurch nicht verändern.

Wie kann man das Während der Pausen machen?

Hier mein Code:



```
public void Pause(int M) {
     try {Thread.sleep(M);}
     catch(InterruptedException e) {return;}
    }
```









```
if(e.getSource()==Up){
            direction=1;
            while(direction==1){
            if(direction!=2){
              K.yPosition=K.yPosition-10;
              Q.enqueue(K.xPosition,K.yPosition);
              
              if((K.yPosition==S.yPosition)&&(K.xPosition==S.xPosition)){
                  Leinwand.setColor(Color.white);
                  Leinwand.fillOval(S.xPosition,S.yPosition,S.durchmesser,S.durchmesser);
                  S.setx();
                  S.sety();
                  Leinwand.setColor(Color.red);
                  Leinwand.fillOval(S.xPosition,S.yPosition,S.durchmesser,S.durchmesser);
                  i=i+1;
                }
                
              Leinwand.setColor(Color.blue);
              Leinwand.fillOval(K.xPosition,K.yPosition,K.durchmesser,K.durchmesser);
            
              if(ZV>i){
                Leinwand.setColor(Color.white);
                Leinwand.fillOval(Q.getx(),Q.gety(),K.durchmesser,K.durchmesser);
                Q.dequeue();
              }else{ZV=ZV+1;}
              direction=1;
              Pause(1000);
            }
        }       
 }
```

"direction" und "ZV" ist nicht relevant für das Problem, habs nur dringelassen, damit ich keine Syntaxfehler habe. "Enqueue" ist so etwas, wie ein Schritt weiter mit der Schlange, wobei der hintere Teil sofort mit "dequeue" gelöscht wird (sie soll ja nicht länger werden). "K" ist meine Kreisklasse, aus der die Schlange besteht. "S" ist das, was die Schlange essen kann. "Q" ist das Nebenprogramm, worin "enqueue" und "dequeue" usw. enthalten ist. "Leinwand" ist einfach die Fläche, auf der gezeichnet wird.

Alles wird über Buttons gesteuert. Das ist mein Beispiel für den Vorgang "Up" (Schlange bewegt sich nach oben).

Edit: "direction" ist doch relevant merke ich grad 

Bei up ist sie 1
bei down 2
bei left 3
bei right 4


----------



## Titanpharao (28. Nov 2012)

Ich schau mal in meine Glaskugel und erkenne das 
if(e.getSource()==Up){ ...
sich in einer keyPressed Methode befindet...

Also erstmal baust du dein Snake Clon komplett falsch auf.

Du solltest einen Thread starten welcher ständig alles neuzeichnet und ~10ms "wartet" um nicht auf 100% CPU zu kommen.
Gameloop ist hier das Strichwort.

Er sollte auch die Schlange anhand deiner Eingabe bewegen und könnte sogar neue "Gegner" spawn usw usw.

Dann fängst du im KeyEvent nur noch die Eingabe der Tastatur ab und setzt die Richtung.
Wenn die Schlange "gewechselt" hat, setzt du die Richtung wieder auf -1 oder einen ungültigen Wert.


Etwas code der dich inspirieren soll:


```
Thread gameLoop=new Thread(new Runnable(){
	public void run(){
		Thread.sleep(10);
		moveSnake();....
	}
});


public void keyPressed(KeyEvent e){
	if(direction==-1){
 switch(e.getKeyCode()){... direction= ....
}
```

Ist etwas schwer zu erklären, aber deine Event basierte Methodik ist hier vollkommen fehl am Platz.

Es gibt doch auch hier ein gutes Tutorial wie man ein simples Spiel macht mit einem Gameloop.

Und lehren euch die Lehrer nicht mehr Java CodeStyles? Aber unsere Professoren sind da genauso schlecht, deswegen muss ich jetzt etwas "flamen".

upCamelCase, Denglish, Klassen groß, Methoden & Variablen klein ... *.* 

Aber keine Angst, wir waren alle mal so ...


----------



## Titanpharao (28. Nov 2012)

Ach da fällt mir noch etwas ein, wie du deine Schlange dauer bewegen kannst.

Nimmst du den Thread und sagst dort einfach alle eine Sekunde (oder wie schnell sie sein soll),
bewege dich in Richtung um +X.
Dann prüfst du jedes mal vor dem Verschieben, ob sie nicht die Richtung ändern soll.

Naja ähnelt eigentlich fast dem Gameloop ...


----------



## Nookieslot (28. Nov 2012)

Danke für die schnelle Antwort.

Naja, unser Lehrer möchte halt, dass wir das nach einem bestimmten Muster machen (kann sein, dass ich das trotzdem falsche habe )

Noch eine Frage, ich habe dieses "Thread.sleep(10);" auch in anderen Beiträgen hier gelesen, jedoch weiß ich nicht was das bewirkt (wir sind noch nicht so weit). Stoppt dann einfach das ganze Programm für 10ms und prüft, ob irgendetwas passiert ist??

PS: Mein Programm wir (noch) über Buttons gesteuert (also "ActionListener" usw.), deshalb kann ich noch nicht mit KeyPressed o.Ä. arbeiten.


----------



## TKausL (29. Nov 2012)

mit Thread.sleep(10) pausiert der AKTUELLE THREAD 10 Sekunden lang. Fals du nicht bewusst neue Threads erstellt und gestartet hast kannst du davon ausgehen, dass dein "Programm" solange pausiert, ja. Das Thema "Threads" wird warscheinlich später behandelt werden.


----------

