# SNAKE HILFEEE!



## Guest (13. Jan 2006)

hi, also habe ein kleines problem. Bin totaler anfänger in Java und komme bei der Programmierung einfach net mehr weiter. Meine Schlange (falls man das schon bei mir nennen kann) bewegt sich ist aber durchlöschert , also da fehlen imme blöcke drin ich. Weiss das es hier >> public void keyPressed(KeyEvent e) also die darunter folgenden programmier schritte daran muss es legen aber habe alles versucht mein schlange wird nie komplett ich hoffe ihr könnt mir helfen. bin schon am verzweifeln!!!! :cry:

```
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

class CursorEmpfaenger extends KeyAdapter {
	Tastatur02 tApplet;
	Graphics g;
	CursorEmpfaenger(Tastatur02 tApplet){
		this.tApplet = tApplet;
	}
	int i=0;
	public void keyPressed(KeyEvent e){
	/*	switch(event.getKeyCode()){
			case (KeyEvent.VK_DOWN)  : tApplet.ry+=10;break;
			case (KeyEvent.VK_UP)    : tApplet.ry-=10;break;
			case (KeyEvent.VK_LEFT)  : tApplet.rx-=10;break;
			case (KeyEvent.VK_RIGHT) : tApplet.rx+=10;break;
			}*/
		
		if	(e.getKeyCode()== KeyEvent.VK_UP){
					tApplet.ry[i] = tApplet.y;
					tApplet.rx[i] = tApplet.x;
					
					tApplet.y-=10;	
					if (i>=tApplet.futter){
						for(i=0; (i+=1)>=tApplet.futter; i++){
							tApplet.rx[i] = tApplet.rx[i+=1];
							tApplet.ry[i] = tApplet.ry[i+=1];
							}
						}
						i+=1;
					
					}
		else if(e.getKeyCode()== KeyEvent.VK_DOWN){
					tApplet.ry[i] = tApplet.y;
					tApplet.rx[i] = tApplet.x;
				
					tApplet.y+=10;
					
					if (i>=tApplet.futter){
						for(i=0; (i+=1)>=tApplet.futter; i++){
							tApplet.rx[i] = tApplet.rx[i+=1];
							tApplet.ry[i] = tApplet.ry[i+=1];
							}
						}
						i+=1;	
					}
		else if(e.getKeyCode()== KeyEvent.VK_LEFT){
					tApplet.ry[i] = tApplet.y;
					tApplet.rx[i] = tApplet.x;
					
					tApplet.x-=10;
					if (i>=tApplet.futter){
						for(i=0; (i+=1)>=tApplet.futter; i++){
							tApplet.rx[i] = tApplet.rx[i+=1];
							tApplet.ry[i] = tApplet.ry[i+=1];
							}
						}
						i+=1;
					}
		else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
					tApplet.ry[i] = tApplet.y;
					tApplet.rx[i] = tApplet.x;
					
					tApplet.x+=10;
					
					if (i>=tApplet.futter){
						for(i=0; (i+=1)>=tApplet.futter; i++){
							tApplet.rx[i] = tApplet.rx[i+=1];
							tApplet.ry[i] = tApplet.ry[i+=1];
							}
						}
						i+=1;
					}
		
		tApplet.repaint();
	}
}
```


```
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Tastatur02 extends Applet {
	int rx[] = new int[100];
	int ry[] = new int[100];
	int x=300, y=300;
	int futter = 5;
	CursorEmpfaenger ce = new CursorEmpfaenger(this);
	public void init(){
				
		addKeyListener(ce);
		requestFocus();
		setSize(600,600);
		setVisible(true);
		
	}
	public void paint (Graphics g) {
		g.setColor(Color.red);
		g.fillRect(x,y,10,10);
	for (int j=0; j <= ce.i ;j++)	
		g.fillRect(rx[j],ry[j],10,10);
	
	}
}
```


----------



## MPW (13. Jan 2006)

Hehe, ich sitze auch gerade an einem Snake game....bin aber schon weiter, meine hat nur noch den bug, dass sie immer laenger wird, wenn man viele Kurven macht

Ich habe aber einen ooteren Weg gewaehlt, sehe jetzt gerade nicht, wo dein Fehler liegt....und da ich hier gerade kein Java hab, kann ich das auch nicht pruefen, werde es mir nachher mal anschauen, wenn ich Zeit habe...


----------



## Illuvatar (13. Jan 2006)

Ich muss sagen ich versteh den Code nicht so ganz, was wohl auch daran liegt, dass du Klassen verwendest, die nicht zur Standardbibliothek verwenden. Ich kann dir nur den Tip geben, wie ich das mal programmiert habe:
Eine Liste von Punkten, an denen sich die Teile der Schlange befinden. Dann alle xxx Millisekunden von hinten anfangen und durchgehen, für jedes Element: Element dahin setzen, wo das davorliegende ist. Das vorderste dann halt in die richtige Richtung setzen, dazu halt ne Variable halten, in welche Richtung es gehen soll. In paint alle Elemente der Liste malen. Wenn neue kommen, einfach "auf" das hinterste Element draufsetzen, dann funktioniert das schon.


----------



## Reath (14. Jan 2006)

wie meinst du das mit "nicht zur standart bibliothek" also mein programm ist doch eigentlich ganz einfach gestaltet. Also die schlangen bewegung wird in public void keyPressed(KeyEvent e) berechnet. Wenn du dir da den code anschaust. Also läuft es wie folgt wenn ich den cursor bsp nach oben drücke dann wird die momentane posi (x,y) in das Array gespeichert. Dann wird das viereck um 10 pixel an der y axe verschoben. Dann will ich ja auch das die schlange grösser wird wenn sie die punkte einsammelt die ich aber noch net programmiert habe. deswegen wird anhand einer Variable = futter überprüft ob die schlange einen punkt eingesammelt hat. Schliesslich die schleife die dazu dient das bspw. Array[7] in Array[8] reingeschrieben wird so das alle Arrays um 1 verschoben werden, das ist dann die schlangen bewegung. Jedoch mein Problem habe ich immer noch net gelösst warum meine schlange fehlerhaft ist?????? Bitte um hilfe


----------



## Illuvatar (14. Jan 2006)

Ups, ich hab die Klasse Tastatur02 irgendwie übersehen


----------



## Reath (14. Jan 2006)

hi, 
habe mein problem gelöst der fehler war inder klasse tastatur02 !!
for (int j=0; j <= futter ;  j++)	
		g.fillRect(rx[j],ry[j],10,10);
bei futter hatte ich ce.i 
naja warum weiss ich auch net aber jetzt gehts.  ???:L 

sagt mal habt ihr vieleicht noch andere verbesserungs vorschläge, wie ich das programm besser programmieren kann oder anders  ??  :lol:


----------



## MPW (16. Jan 2006)

Reath hat gesagt.:
			
		

> sagt mal habt ihr vieleicht noch andere verbesserungs vorschläge, wie ich das programm besser programmieren kann oder anders  ??  :lol:



Wie meinst du das?

 - mehr Performance?
 - Features?
 - schoenere Programmstruktur?


----------



## Reath (16. Jan 2006)

Ja zum Beispiel!! Weil das mein erstes Programm ist, mit Java. Ich denke mal, das einige von euch es vieleicht anders programmiert hätten.


----------



## MPW (17. Jan 2006)

Aha, interessant, sorry wenn ich das sage, aber man merkt ein bisschen, dass es dein erstes game ist nicht boese sein*g*

Hier ein paar Tipps:

 - Bau Threads ein, damit die Schlange automatisch laeft und man nur noch die Richtung vorgibt
 - Bau Ereignisse ein, z.B. Zahlen oder Fruechte
 - Bau Hindernisse ein, gegen die man fahren kann, bzw. die Schlange dann stirbt.

Ich koennte dir jetzt eine Version zeigen, die das kann, aber das ist glaube ich nicht das was dir hilft. Ich meine, du es wird dir mehr bringen, das selber zu entwickeln...und es macht auch mehr spass, da man Erfolgerlebnisse hat(wenn nicht, werden wir ein bisschen nachhelfen).

Also, sag uns, was du zunaechst einbauen moechtest, ich wuerde sagen, wir fixen erstmal den paintbug, oder? Und danach Threads?


----------



## Reath (17. Jan 2006)

Hi, also erstmal Danke für die hilfe.
Ich habe schon mein Programm erweitert habe schon threads eingebaut und struktur bissl verbessert.
Die Schlange bewegt sich jetzt automatisch. Ich habe auch Kollisionsabfrage reinprogrammiert. Und statt Applet versuch ich jetzt das Programm als JPanel zum Laufen zu bringen. Jedoch bekomme ich eine fehlermeldung, unzwar der übliche fehler Java.lang.Nosuchmethoderror:main. Ich weis auch das es bedeuted das er keine Main findet. Aber habe hier im Forum schonn alles durchsucht aber nix gefunden was mir so richtig helfen konnte.

```
class Bewegung extends Thread {
	Snake tJPanel;
	
	Bewegung(Snake tJPanel){
		this.tJPanel = tJPanel;
	}
	
	public void run () {
		while (tJPanel.an) {
		//	if (isInterrupted()){tApplet.move();}
			try{
			  Thread.sleep(100);
			} catch(InterruptedException e){
			  interrupt();
			}
			tJPanel.move();
		}
	}
}
```


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake extends JPanel {
	Tastatur ce = new Tastatur(this);
    Bewegung bw = new Bewegung(this);
	
	int rx[] = new int[100];
	int ry[] = new int[100];
	int x=300, y=300;
	int futter = 20;
	int richtung = 0;
	int i=0;
	boolean an = true;
    
    
   // Bewegung bw = new Bewegung();
	
	public static void main() { 

		JFrame f = new JFrame("Snake");
		
		Tastatur ce = new Tastatur(this);
    	        Bewegung bw = new Bewegung(this);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        f.setSize(600,600);
    	        Container con = f.getContentPane();
    	
    	        setBorder(BorderFactory.createEtchedBorder(Color.black,Color.blue));
    	        f.setVisible(true);
		requestFocus();
			
		addKeyListener(ce);
				
	/*	requestFocus();
		setSize(600,600);
		setVisible(true);*/
		bw.start();
	}
	public void paint (Graphics g) {
		g.setColor(Color.BLACK);
		rx[0]=x; ry[0]=y;
		g.fillRect(rx[0],ry[0],10,10);
	
	for (int i=0; i <= futter ;i++)	
		g.fillRect(rx[i],ry[i],10,10);
	
	}
	void weiter(){
	
		if (i >= futter){
				for(i=0; (i+=1)>=futter; i++){
						rx[i] = rx[i+=1];
						ry[i] = ry[i+=1];
				}
		}
	}
		
	void move(){
		
		if(richtung == 0){
					ry[i] = y;
					rx[i] = x; y-=10;
					
				}
	     else if(richtung == 1){
					ry[i] = y;
					rx[i] = x; y+=10;
					
					}
		else if (richtung == 2){
					ry[i] = y;
					rx[i] = x; x-=10;
				
					}
		else if (richtung == 3){
					ry[i] = y;
					rx[i] = x; x+=10;
				
					}
		for (int i=0; i>=futter; i++){
			if ((rx[futter] == rx[i]) && (ry[futter] == ry[i])){
			//	bw.stop();
				an = false;}
			}
		i+=1;
		
		if (an)
		weiter();
			
		repaint();
		}
			
}
```


```
import java.awt.event.*;

class Tastatur extends KeyAdapter {
	Snake tJPanel;
	
	Tastatur(Snake tJPanel){
		this.tJPanel = tJPanel;
	}
	
	public void keyPressed(KeyEvent e){
		
		if	(e.getKeyCode()== KeyEvent.VK_UP && tJPanel.richtung !=1)
		tJPanel.richtung = 0;
					
		else if(e.getKeyCode()== KeyEvent.VK_DOWN && tJPanel.richtung !=0)
		tJPanel.richtung = 1;
					
		else if(e.getKeyCode()== KeyEvent.VK_LEFT && tJPanel.richtung !=3)
		tJPanel.richtung = 2;
				
		else if(e.getKeyCode()== KeyEvent.VK_RIGHT && tJPanel.richtung !=2)
		tJPanel.richtung = 3;
	tJPanel.move();
	}
}
```


----------



## MPW (17. Jan 2006)

Reath hat gesagt.:
			
		

> Jedoch bekomme ich eine fehlermeldung, unzwar der übliche fehler Java.lang.Nosuchmethoderror:main. Ich weis auch das es bedeuted das er keine Main findet. Aber habe hier im Forum schonn alles durchsucht aber nix gefunden was mir so richtig helfen konnte.
> 
> ```
> // Bewegung bw = new Bewegung();
> ...



^^das programm faengt jetzt nicht mehr bei init an, sondern bei main.


----------



## Reath (18. Jan 2006)

also wenn ich das so mache wie du das schreibst dann bekomme ich ja nur noch Fehler. Ich weis net wie du das meinst also besser wirds dadurch ja nicht ???


----------



## MPW (18. Jan 2006)

sry doppelpost


----------



## MPW (18. Jan 2006)

1. Fehler bitte posten.
2. Deines geht ja wohl auch nicht? Der Unterschied zwischen unseren beiden: Bei mir stimmt die Theorie, aber die Praxis nicht, aber bei dir stimmen sowohl Theorie und Praxis nicht, d.h. meines wirdk - nach dem debuggen - funktionieren, deines nicht;-)


----------



## Reath (18. Jan 2006)

Also erstmal hat er gemeckert das er bw.start(); also (bw. gekennzeichnet) nicht erkennt dann habe ich mir gedacht vieleicht muss ja die deklarationen also:Tastatur ce = new Tastatur(this);
    	                                                  Bewegung bw = new Bewegung(this);
auch in void static stehen also reingeschoben.
Dann sagt er mir : 
\Snake.java:38: non-static method addKeyListener(java.awt.event.KeyListener) cannot be referenced from a static context

		addKeyListener(ce);

                ^
\Snake.java:35: non-static method requestFocus() cannot be referenced from a static context

		requestFocus();

                ^

\Snake.java:33: non-static method setBorder(javax.swing.border.Border) cannot be referenced from a static context

    	setBorder(BorderFactory.createEtchedBorder(Color.black,Color.blue));

        ^
\Snake.java:28: non-static variable this cannot be referenced from a static context

    	Bewegung bw = new Bewegung(this);

                                   ^


----------



## MPW (18. Jan 2006)

Aso, du greifst aus start() heraus nochmal auf das Fram zu, das geht natuerlich nicht.

2 Loesungen:

1. Mach eine extra Klasse, die das Panel in einem Frame darstellt, so muesste es eigentlich oo richtig sein.
2. Beschrenke alle Zugriff auf f auf innerhalb der main-Methode. Ich weiss nicht, was in start gemacht wird, aber setVisible(true) kann man auch aus der main ausrufen, und einen Thread starten kann man auch aus main


----------

