SNAKE HILFEEE!

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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:
Code:
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();
	}
}
Code:
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

Top Contributor
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

Top Contributor
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

Mitglied
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
 

Reath

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
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.
Code:
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();
		}
	}
}
Code:
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();
		}
			
}
Code:
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

Top Contributor
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.
Code:
   // Bewegung bw = new Bewegung();
	public static void main() {
	JFrame f = new JFrame("Snake");
	
		
	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();
	}

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

Reath

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J SNAKE-GAME-LOOP / (Applet zu Application) Spiele- und Multimedia-Programmierung 4
P Snake Game Verbessern Spiele- und Multimedia-Programmierung 15
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
F Koordinieren und Essen von Snake - Spiel Spiele- und Multimedia-Programmierung 14
B "Snake"-Game Logikfehler Spiele- und Multimedia-Programmierung 1
B noch ein snake klon Spiele- und Multimedia-Programmierung 2
Viktim Snake - Schlange wächst nicht Spiele- und Multimedia-Programmierung 3
M Hilfe bei Snake Spiele- und Multimedia-Programmierung 4
J LWJGL Update Schleife (Snake) Spiele- und Multimedia-Programmierung 6
N Schulprogramm "Snake" Spiele- und Multimedia-Programmierung 4
R Hilfe bei Snake-Programmierung Spiele- und Multimedia-Programmierung 6
C Hinterteil von Snake programmieren Spiele- und Multimedia-Programmierung 11
S Snake versuch Spiele- und Multimedia-Programmierung 14
J Snake Programmierung Spiele- und Multimedia-Programmierung 18
V Snake Spiel Spiele- und Multimedia-Programmierung 7
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
N Hilfe bei snake Spiele- und Multimedia-Programmierung 37
N Snake (Programmier Stil) Spiele- und Multimedia-Programmierung 8
G Snake Alphaversion Spiele- und Multimedia-Programmierung 18
B Snake-Game fürs Handy Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben