# Snake Programmierung



## Joeline (14. Apr 2011)

Hallo,
ich habe noch nie ein Spiel programmiert, deshalb habe ich gleich am Anfang der Programmierung von Snake so meine Probleme.

Ich weiß mein Spiel ist noch lange nicht fertig und das kann so noch nicht funktionieren, aber was ich erst einmal hinbekommen möchte ist, dass die Schlange (besteht aus bildern) auf dem dafür vorgesehenen "Spielfeld" erscheint. Das Applet und die Schlange ist vorerst nur provisorisch, damit ich überprüfen konnte ob sich die Schlange schon wenigstens gleichmäßig in eine Richtung bewegt.

Könnt Ihr euch den code bitte mal anschauen und mir sagen wie ich die schlange auf das Spielfeld bekomme?? Dankeschön schon im Vorraus!

Hier wir der Schlangenkörper erstellt


```
package paketSnake;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.applet.Applet;


//Damit das Applet einen Thread versteht, wird das Interface Runnable API: java.lang.Runnable implementiert.
public class Schlange extends Applet implements Runnable
{ 
	public Schlange()
	{
		addKeyListener(new KeyEvents());
		setFocusable(true);
	}
	
	//Definiert die Anfangswerte
	int px = 0;
    int py = 50;
    Thread wiederhole;// Objektname aufgabenbezogen
    
    private boolean left = false;
    private boolean right = true;
    private boolean up = false;
    private boolean down = false;
 
    
    
    public boolean keyPressed (KeyEvent event)
    {
   
    	
    	if (event.getKeyCode()==KeyEvent.VK_LEFT) 
    	{
    		left= true;
    		right=false;
    		up = false;
    		down = false;
    	}
    	
    	if (event.getKeyCode()==KeyEvent.VK_RIGHT)
    	{
    		right = true;
    		left= false;
    		up = false;
    		down = false;
    	}
    	if (event.getKeyCode()==KeyEvent.VK_UP)
    	{
    		up = true;
    		right = false;
    		left= false;
    		down = false;
    	}
    	
    	if (event.getKeyCode()==KeyEvent.VK_DOWN)
    	{
    		down = true;
    		right = false;
    		left= false;
    		up = false;
    	}
    	return true;
    
    	
    }
    

	 public void start()
	 {//Thread erzeugen und starten
	        wiederhole = new Thread(this);
	        wiederhole.start();
	        
	    }
	 
	 //Innerhalb der run() Methode teile ich in einer Dauerschleife mit was zu wiederholen ist.
	    public void run(){//wiederhole
	    	//Eine unendliche Schleife starten
			//die alle 100 Millisekunden (Standard) das Bild Aktualisiert und 
			//Die Schlange um ein Kästchen weiter bewegt
	    	

	        while(true)
	        {
	        	
	        	if (right)
	        	{
	        		px++;//Wert aendern
		            repaint();//neu zeichnen
		            try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}
	        	}
	        	
	        	if (left)
	        	{
	        		px--;
	        		repaint();
	        		try{ wiederhole.sleep(60);}//pausieren (//Standardeinstellung: 100?)
		            catch(InterruptedException e){}	
	        	}
	        	
	        	if (up)
	        	{
	        		py--;;
	        		repaint();
	        		try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}	
	        	}
	        	
	        	if (down)
	        	{
	        		py++;
	        		repaint();
	        		try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}	
	        	}
	            
	        }
	    }

	    public void paint(Graphics g)//zuerst Eigenschaft dann Objekt
		{  
	    	super.paint(g);
			/**
			 * Bilder sind vom Typ Image. Der Dateiname des Bildes (GIF oder JPG) wird aus der Klasse Toolkit dem Image Objekt mit der Methode:
				Toolkit.getDefaultToolkit().getImage (DateinameDesBildes) ¸bergeben.
				Anschlieﬂend kann es als Graphics-Objekt mit der Methode: drawImage(nameImageObjekt,x,y,null) gezeichnet werden.
			 */
			
	    	if (right)
	    	{
			// Objekt holen
	    		Image rhead = getImage(getCodeBase(),"SnakeBody/snake_head_r.jpg");
		        Image rbody = getImage(getCodeBase(),"SnakeBody/snake_body_r.jpg");
		        Image rtail = getImage(getCodeBase(),"SnakeBody/snake_tail_r.jpg");
    		 
			// Objekt ausgeben
			        g.drawImage(rhead,px,py,this);
			        g.drawImage(rbody,px-10,py,this);
			        g.drawImage(rbody,px-20,py,this);
			        g.drawImage(rbody,px-30,py,this);
			        g.drawImage(rbody,px-40,py,this);
			        g.drawImage(rtail,px-50,py,this);
	    	}   
	    	
	    	if (left)
	    	{
	    		Image lhead = getImage(getCodeBase(),"SnakeBody/snake_head_l.jpg");
		        Image lbody = getImage(getCodeBase(),"SnakeBody/snake_body_l.jpg");
		        Image ltail = getImage(getCodeBase(),"SnakeBody/snake_tail_l.jpg");
		        
		        g.drawImage(lhead,px,py,this);
		        g.drawImage(lbody,px+10,py,this);
		        g.drawImage(lbody,px+20,py,this);
		        g.drawImage(lbody,px+30,py,this);
		        g.drawImage(lbody,px+40,py,this);
		        g.drawImage(ltail,px+50,py,this);
		           
	    	}
	    	
	    	if (up)
	    	{
	    		Image uhead = getImage(getCodeBase(),"SnakeBody/snake_head_u.jpg");
		        Image ubody = getImage(getCodeBase(),"SnakeBody/snake_body_u.jpg");
		        Image utail = getImage(getCodeBase(),"SnakeBody/snake_tail_u.jpg");
		        
		        g.drawImage(uhead,px,py,this);
		        g.drawImage(ubody,px,py+10,this);
		        g.drawImage(ubody,px,py+20,this);
		        g.drawImage(ubody,px,py+30,this);
		        g.drawImage(ubody,px,py+40,this);
		        g.drawImage(utail,px,py+50,this);
	    		
	    	}
	    	
	    	if (down)
	    	{
	    		Image dhead = getImage(getCodeBase(),"SnakeBody/snake_head_d.jpg");
		        Image dbody = getImage(getCodeBase(),"SnakeBody/snake_body_d.jpg");
		        Image dtail = getImage(getCodeBase(),"SnakeBody/snake_tail_d.jpg");
		 
		// Objekt ausgeben
		        g.drawImage(dhead,px,py,this);
		        g.drawImage(dbody,px,py-10,this);
		        g.drawImage(dbody,px,py-20,this);
		        g.drawImage(dbody,px,py-30,this);
		        g.drawImage(dbody,px,py-40,this);
		        g.drawImage(dtail,px,py-50,this);
	    	}
	    		
			        
		} 
	    
	    public static void main(String[] args)
		  {
		    new Schlange();
		  
		  }
		   
}
```

Das hier ist mein Spielfeld


```
package paketSnake;

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

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.SwingUtilities;
import java.awt.Graphics; // Enthält Methoden zum zeichnen geometrischer Figuren
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Spiel extends javax.swing.JFrame {
	private JPanel pLeiste;
	private JPanel lbHintergrund;
	private JLabel lbScore;
	private JButton btHautmenue;
	


	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Spiel inst = new Spiel();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
				
			}
			
			
		});
	}
	
	public Spiel() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				pLeiste = new JPanel();
				getContentPane().add(pLeiste);
				pLeiste.setBounds(0, 262, 452, 25);
				pLeiste.setLayout(null);
				
				{
					btHautmenue = new JButton();
					pLeiste.add(btHautmenue);
					btHautmenue.setText("Hauptmenü");
					btHautmenue.setBounds(349, 0, 98, 22);
					btHautmenue.setFont(new java.awt.Font("Arial",0,11));
					btHautmenue.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							btHautmenueActionPerformed(evt);
							
							Hauptmenue menueFenster = new Hauptmenue();
							menueFenster.setVisible(true);
							
							Spiel.this.dispose();
						}
					});

				}
				{
					lbScore = new JLabel();
					pLeiste.add(lbScore);
					lbScore.setText("Score:");
					lbScore.setBounds(6, 3, 49, 15);
					lbScore.setFont(new java.awt.Font("Arial",0,11));
				}
			}
			{
				lbHintergrund = new JPanel();
				getContentPane().add(lbHintergrund);
				lbHintergrund.setBounds(0, 0, 460, 259);
				lbHintergrund.setBackground(new java.awt.Color(255,255,255));
				lbHintergrund.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));

			}
			
			pack();
			setSize(460, 314);
			setTitle("Snake");
			
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void btHautmenueActionPerformed(ActionEvent evt) {
		System.out.println("btHautmenue.actionPerformed, event="+evt);
		//TODO add your code for btHautmenue.actionPerformed
	}
	
}
```


----------



## Quaxli (14. Apr 2011)

Da sind schon mal zu viele repaint-Aufruf drin.

Hier gibt's jede Menge Anfänger-Tutorials: http://www.java-forum.org/spiele-multimedia-programmierung/6529-tutorials.html

Speziell für Applets kannst Du mal dieses anschauen: Welcome to Java Cooperation site


----------



## Joeline (15. Apr 2011)

Aso hätt mir eigentlich auch selber aufallen müssen, ein Aufruf von repaint reicht in dem fall ja. 

Dankeschön, aber du hast meine Frage noch nicht richtig beantwortet und ich habe die Antwort auf dieses Problem auch so noch nicht gefunden. Ich wollte statt dem Applet die Klasse Spiel aufrufen, auf der dann meine Schlange sich bewegt. Ungefär so nur dass hier nur das Spielfeld aufgerufen wird:


```
package PaketSnake;

import java.awt.*;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


//Damit das Applet einen Thread versteht, wird das Interface Runnable API: java.lang.Runnable implementiert.
public class Schlange extends Spiel implements Runnable
{ 
	//Definiert die Anfangswerte, beginnt links oben
	int px = 0;
    int py = 50;
    Thread wiederhole;// Objektname aufgabenbezogen
    
    private boolean left = false;
    private boolean right = true;
    private boolean up = false;
    private boolean down = false;

    public void keyPressed (KeyEvent e)
    {
    	int key = e.getKeyCode();

    if (key==KeyEvent.VK_LEFT) 
     {
    	left = true;
    	right = false;
    	up = false;
    	down = false;
    	
     }
 
    if (key==KeyEvent.VK_RIGHT)
     {
    	right = true;
    	left= false;
    	up = false;
    	down = false;
     }
    if (key==KeyEvent.VK_UP)
     {
    	up = true;
    	right = false;
    	left= false;
    	down = false;
     }

    if (key==KeyEvent.VK_DOWN)
     {
    	down = true;
    	right = false;
    	left= false;
    	up = false;
     }
    
    } 
    

	 public void start()
	 {//Thread erzeugen und starten
	        wiederhole = new Thread(this);
	        wiederhole.start();
	        
	    }
	 
	 //Innerhalb der run() Methode teile ich in einer Dauerschleife mit was zu wiederholen ist.
	    public void run(){//wiederhole
	    	
	        while(true)
	        {
	        	if (right)
	        	{
	        		px++;//Wert aendern
		            try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}
	        	}
	        	
	        	if (left)
	        	{
	        		px--;
	        		try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}	
	        	}
	        	
	        	if (up)
	        	{
	        		py--;
	        		try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}	
	        	}
	        	
	        	if (down)
	        	{
	        		py++;
	        		try{ wiederhole.sleep(60);}//pausieren
		            catch(InterruptedException e){}	
	        	}
	        	
	        	repaint();//neu zeichnen
	            
	        }
	    }

	    public void paint(Graphics g)//zuerst Eigenschaft dann Objekt
		{ 
			/**
			 * Bilder sind vom Typ Image. Der Dateiname des Bildes (GIF oder JPG) wird aus der Klasse Toolkit dem Image Objekt mit der Methode:
				Toolkit.getDefaultToolkit().getImage (DateinameDesBildes) ¸bergeben.
				Anschlieﬂend kann es als Graphics-Objekt mit der Methode: drawImage(nameImageObjekt,x,y,null) gezeichnet werden.
			 */
			
	    	if (right)
	    	{
			// Objekt holen
			        Image rhead = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_head_r_2.png");
			        Image rbody = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_body_r_.png");
			        //Image rcurve = getImage(getCodeBase(),"SnakeBody/snake_curve_tr.jpg");
			        Image rtail = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_tail_r.png");
			 
			// Objekt ausgeben
			        g.drawImage(rhead,px,py,this);
			        g.drawImage(rbody,px-10,py,this);
			        g.drawImage(rbody,px-20,py,this);
			        g.drawImage(rbody,px-30,py,this);
			        g.drawImage(rbody,px-40,py,this);
			        g.drawImage(rtail,px-50,py,this);
	    	}   
	    	
	    	if (left)
	    	{
	    		Image lhead = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_head_l.png");
		        Image lbody = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_body_l.png");
		        Image ltail = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_tail_l.png");
		        
		        g.drawImage(lhead,px,py,this);
		        g.drawImage(lbody,px+10,py,this);
		        g.drawImage(lbody,px+20,py,this);
		        g.drawImage(lbody,px+30,py,this);
		        g.drawImage(lbody,px+40,py,this);
		        g.drawImage(ltail,px+50,py,this);
		           
	    	}
	    	
	    	if (up)
	    	{
	    		Image uhead = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_head_u.png");
		        Image ubody = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_body_u.png");
		        Image utail = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_tail_u.png");
		        
		        g.drawImage(uhead,px,py,this);
		        g.drawImage(ubody,px,py+10,this);
		        g.drawImage(ubody,px,py+20,this);
		        g.drawImage(ubody,px,py+30,this);
		        g.drawImage(ubody,px,py+40,this);
		        g.drawImage(utail,px,py+50,this);
	    		
	    	}
	    	
	    	if (down)
	    	{
	    		Image dhead = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_head_d.png");
		        Image dbody = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_body_d.png");
		        Image dtail = Toolkit.getDefaultToolkit().getImage("SnakeBody/snake_tail_d.png");
		 
		// Objekt ausgeben
		        g.drawImage(dhead,px,py,this);
		        g.drawImage(dbody,px,py-10,this);
		        g.drawImage(dbody,px,py-20,this);
		        g.drawImage(dbody,px,py-30,this);
		        g.drawImage(dbody,px,py-40,this);
		        g.drawImage(dtail,px,py-50,this);
	    	}
	    		
			        
		}
		   
}
```

Hier noch mal die Klasse Spiel

```
package paketSnake;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import java.awt.Graphics; // Enth‰lt Methoden zum zeichnen geometrischer Figuren
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Spiel extends javax.swing.JFrame {
	private JPanel pLeiste;
	private JLabel lbHintergrund;
	private JLabel lbScore;
	private JButton btHautmenue;
	


	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Spiel inst = new Spiel();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
				
			}
			
			
		});
	}
	
	public Spiel() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				pLeiste = new JPanel();
				getContentPane().add(pLeiste);
				pLeiste.setBounds(0, 262, 452, 25);
				pLeiste.setLayout(null);
				{
					btHautmenue = new JButton();
					pLeiste.add(btHautmenue);
					btHautmenue.setText("Hauptmenü");
					btHautmenue.setBounds(349, 0, 98, 22);
					btHautmenue.setFont(new java.awt.Font("Arial",0,11));
					btHautmenue.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							btHautmenueActionPerformed(evt);
							
							Hauptmenue menueFenster = new Hauptmenue();
							menueFenster.setVisible(true);
							
							Spiel.this.dispose();
						}
					});

				}
				{
					lbScore = new JLabel();
					pLeiste.add(lbScore);
					lbScore.setText("Score:");
					lbScore.setBounds(6, 3, 49, 15);
					lbScore.setFont(new java.awt.Font("Arial",0,11));
				}
			}
			{
				lbHintergrund = new JLabel();
				getContentPane().add(lbHintergrund);
				lbHintergrund.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Bilder/Alabaster_sand.jpg")));
				lbHintergrund.setBounds(0, 0, 464, 259);
				
				
				
			}
			
			pack();
			setSize(460, 314);
			setTitle("Snake");
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void btHautmenueActionPerformed(ActionEvent evt) {
		System.out.println("btHautmenue.actionPerformed, event="+evt);
		//TODO add your code for btHautmenue.actionPerformed
	}

}
```


----------



## Quaxli (15. Apr 2011)

Ja, ich habe Deine Frage nicht richtig beantwortet, werde ich auch nicht tun, weil Du selbst etwas tun sollst, z. B. mal ein Tutorial lesen und abgleichen, was anders gemacht ist 

Der Code den Du da gepostet hast ist nicht wirklich brauchbar (mehrere repaints(), mehrere sleep(), laden von Objekten in der paint-Methode, etc.) und vermutlich auch gar nicht von Dir oder?
Sonst solltest Du nämlich zumindest keine Probleme haben, den von Applet auf Anwendung umzustellen?

Falls es zuviel Mühe macht, durch die Tutorial-Abteilung zu lesen, kannst Du auch auf den Link in meiner Signatur klicken....


----------



## Joeline (15. Apr 2011)

Doch der ist von mir sonst hätte er ja nicht so viele Fehler, das Problem ist das ich immer wenn ich um einen Teil erweitert habe dien oben teil, der ja funktioniert hat, einfach kopiert habe ohne nachzudenken, dass ich repaint oder sleep ja nur einmal brauche. Die verschieden Bilder bräuchte ich ja, wenn ich meine Schlange in verschiede Richtungen schauen lassen will. Da dies aber vorerst zu kompiziert wäre werde ich das noch umändern bwz. bin ich gerade dabei. Und mit dem Applet auf Anwendung umzustellen habe ich ja auch keine probleme.

Ja das Tutorial hatte ich mir ja auch schon runtergeladen, nur fällt es mir schwer mich da durchzuarbeiten, da manche Dinge die ich noch nicht kenne mich verwirren. Aber na gut, dann werd ich mir das Tutorial noch einmal genauer anschauen.


----------



## Joeline (20. Apr 2011)

So also ich habe jetzt noch mal neu angefangen....aber jetzt komm ich einfach nicht mehr weiter. Ich habe mein programm jetzt schon mehrmals angeschaut, aber ich komm einfach nicht drauf warum die KeyEvents bei mir nicht funktionieren. Könnt ihr mir hier vllt weiterhelfen??


Das hier ist mein Spielfeld:


```
package snake;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;


public class Spielfeld extends javax.swing.JFrame {
	private JPanel pLeiste;
	private JPanel pSpielfeld;
	private JButton btHauptmenue;
	private JLabel lbZeit;
	private JLabel lbScore;
	

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Spielfeld  inst = new Spielfeld();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public Spielfeld () {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			BorderLayout thisLayout = new BorderLayout();
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(thisLayout);
			{
				
				pLeiste = new JPanel();
				GridLayout pLeisteLayout = new GridLayout(1, 1);
				pLeisteLayout.setColumns(1);
				pLeisteLayout.setHgap(5);
				pLeisteLayout.setVgap(5);
				pLeiste.setLayout(pLeisteLayout);
				getContentPane().add(pLeiste, BorderLayout.NORTH);
				pLeiste.setBackground(new java.awt.Color(120,228,239));
				pLeiste.setPreferredSize(new java.awt.Dimension(400, 26));
				{
					lbScore = new JLabel();
					pLeiste.add(lbScore);
					lbScore.setText("Score:");
				}
				{
					lbZeit = new JLabel();
					pLeiste.add(lbZeit);
					lbZeit.setText("Zeit:");
				}
				{
					btHauptmenue = new JButton();
					pLeiste.add(btHauptmenue);
					btHauptmenue.setText("Hauptmenü");
					btHauptmenue.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							btHauptmenueActionPerformed(evt);
							
							//Hauptmenue menueFenster = new Hauptmenue();
							//menueFenster.setVisible(true);
							
							Spielfeld.this.dispose();
						}
					});
				}
				
			}
			{
				pSpielfeld = new JPanel();
				getContentPane().add(BorderLayout.CENTER,new Schlange());
			}
			pack();
			setSize(400, 340);
			setTitle("Snake");
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void btHauptmenueActionPerformed(ActionEvent evt) {
		System.out.println("btHauptmenue.actionPerformed, event="+evt);
		//TODO add your code for btHauptmenue.actionPerformed
	}

}
```

Und hier ist der Code für die Aktionen, darunter die KeyEvents


```
package snake;

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


public class Schlange extends JPanel implements ActionListener 
{	
	    // x- und y-Koordinaten der einzelnen Körperteile Schlange
	    private int x[] = new int[500]; 
	    private int y[] = new int[500]; 
	 
	    //private int score = 0; 
	    private int bodys = 0; 
	    private int apfel_x; 
	    private int apfel_y; 
	    private int leben = 0;
	    private Timer timer;
  
	 
	    private boolean left = false; 
	    private boolean right = true; 
	    private boolean up = false; 
	    private boolean down = false; 
	    private boolean game = true; 
	  
	    private Image body; 
	    private Image apple; 
	    private Image head; 
	     
	  
	    public Schlange() 
	    { 
	                 
	        addKeyListener(new TAdapter()); 
	          
	        setBackground(Color.white); 
	          
	        ImageIcon bild1 = new ImageIcon(this.getClass().getResource("snake_body_r.png")); 
	        body = bild1.getImage(); 
	 
	        ImageIcon bild2 = new ImageIcon(this.getClass().getResource("the_almighty_apple.png")); 
	        apple = bild2.getImage(); 
	 
	        ImageIcon bild3 = new ImageIcon(this.getClass().getResource("snake_head_r.png")); 
	        head = bild3.getImage(); 
	        
	        timer = new Timer(100, this); 
	        timer.start();
	 
	      
	        setFocusable(true); 
	        begGame(); // ruft die Methode begGame auf 
	    } 
	    
	    public void moveSnake() 
	    { 
	         
	        // Die einzelnen Körperteile rücken immer um eins weiter in Richtung Kopf 
	        for (int z = bodys; z > 0; z--) 
	        { 
	            x[z] = x[(z - 1)]; 
	            y[z] = y[(z - 1)]; 
	        } 
	         
	        // Wenn Kopf nach links bewegt wird, 
	        if (left) 
	        { 
	            x[0] -= 10;
	        } 
	         
	        // Wenn Kopf nach rechts bewegt wird 
	        if (right) 
	        { 
	            x[0] += 10; 
	        } 
	         
	        // Wenn Kopf nach oben bewegt wird 
	        if (up) 
	        { 
	            y[0] -= 10; 
	        } 
	         
	        // Wenn Kopf nach unten bewegt wird 
	        if (down) 
	        { 
	            y[0] += 10; 
	        } 
	    } 
	    
	    private void beginn() {
	        
	        left = false;
	        right = true;
	        up = false;
	        down = false;
	 
	        // Anfangslänge der Schlange
	        bodys = 4;
	 

	        for (int z = 0; z < bodys; z++) 
	          { 
	              x[z] = 50 - z * 10; 
	              y[z] = 50; 
	          } 

	        legeApfel(); 
	 
	        game = true;
	    }
	 
	    
	    public void begGame() {
	       // score = 0;
	    	leben = 3;
	       
	        beginn();
	    } 
	    
	 
	    public void paint(Graphics g) 
	    { 
	        super.paint(g); 
	 
	        if (game) 
	        { 
	            g.drawImage(apple, apfel_x, apfel_y, this); 
	 
	            for (int z = 0; z < bodys; z++) 
	            { 
	                if (z == 0) 
	                    g.drawImage(head, x[z], y[z], this); 
	                else 
	                    g.drawImage(body, x[z], y[z], this); 
	            } 
	 
	            Toolkit.getDefaultToolkit().sync(); 
	            g.dispose(); }

	    } 
	 
	    public void prüfeApfel() 
	    { 
	 
	        if ((x[0] == apfel_x) && (y[0] == apfel_y)) 
	        { 
	            bodys++; 
	            //score += 10; 
	            legeApfel(); 
	        } 
	    } 
	     
	   
	    public void prüfeKollision() 
	    { 
	        boolean tot = false;
	  
	        
	        for (int z = bodys; z > 0; z--) 
	        { 
	 
	            if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z]))
	            { 
	                tot = true;
	               
	            } 
	        } 

	        if (y[0] > 320) 
	        { 
	            tot = true;

	        } 
	 
	        if (y[0] < 0) 
	        { 
	            tot = true;

	        }     

	        if (x[0] > 380) 
	        { 
	            tot = true; 
	        } 
	 
	        if (x[0] < 0) 
	        { 
	            tot = true; 
	        } 
	        
	        if (tot) 
	        {
	           leben--;
	            if (leben > 0) 
	            {
	                begGame();
	            } 
	            else 
	            {
	                game = false;
	                
	            }
	        }
	        
	    } 
	 
	    public void legeApfel() 
	    { 
	        int r = (int) (Math.random() * 30); 
	        apfel_x = ((r * 10)); 
	        r = (int) (Math.random() * 30); 
	        apfel_y = ((r * 10)); 
	    } 
	    
	    public void actionPerformed(ActionEvent e) 
	    { 
	 
	        if (game) 
	        {  
	            prüfeApfel(); 
	            prüfeKollision(); 
	            moveSnake(); 
	           
	        } 
	        repaint(); 
	    } 
	     
	     
	    private class TAdapter extends KeyAdapter 
	    { 
	 
	        public void keyPressed(KeyEvent e) 
	        { 
	 
	            int key = e.getKeyCode(); 
	 
	            if ((key == KeyEvent.VK_LEFT) && (!right)) 
	            { 
	                left = true; 
	                up = false; 
	                down = false; 
	            } 
	             
	  
	            if ((key == KeyEvent.VK_RIGHT) && (!left)) 
	            { 
	                right = true; 
	                up = false; 
	                down = false; 
	            } 
	             
	            if ((key == KeyEvent.VK_UP) && (!down)) 
	            { 
	                up = true; 
	                right = false; 
	                left = false; 
	            } 
	            
	            if ((key == KeyEvent.VK_DOWN) && (!up)) 
	            { 
	                down = true; 
	                right = false; 
	                left = false; 
	            } 
	        } 
	    } 

}
```


----------



## Marco13 (20. Apr 2011)

Das ist so eine Sache mit den KeyEvents. Die landen immer nur bei der Component, die den Focus hat. D.h. wenn man z.B. eine TextArea hat, und darin der Cursor blinkt, landen natürlich alle Tastendrücke dort (und nicht beim Panel).

setFocusable(true) hast du schon aufgerufen. Das ändert aber nichts daran, dass der Focus am Anfang auf dem Button ist (sieht man wenn man nach dem Start die Leertaste drückt: Das betätigt den Button!). Kann man sowas mit KeyBindings How to Use Key Bindings (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features) lösen.

Alternativ dazu kann man schauen, ob man mit einem FocusListener und requestFocus() was machen kann. Der ... unschöne Workaround wäre, in der actionPerformed-Methode vom Schlangen-Panel immer
requestFocus();
aufzurufen - eigentlich ein no-go, aber damit kriegt man es zumindest schnell zum Laufen, und kann sich um das Testen und weiter-ausarbeiten der eigentlichen Spiellogik kümmern...


----------



## Joeline (26. Apr 2011)

Vielen vielen herzlichen Dank! Man da wär ich nie drauf gekommen...Ich hab es jetzt erst einmal die no-go-Methode angewendet und versuche das jetzt das anderst hinzubekommen.


----------



## Joeline (28. Apr 2011)

So ich hab jetzt eine Zeitanzeige mit System.currentTimeMillis(); in mein SnakeSpiel eingebaut. Die funktionert am Anfang so weit so gut, aber wenn ich das Spiel jetzt neu starte, dann spinnt diese Anzeige. Es sieht so aus als könnte es sich nicht entscheiden welche zeit es anzeigen soll.
An was könnte das liegen und wie kann ich es beheben?


In der Klasse wird die Zeit gemessen:


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


public class Schlange extends JPanel implements ActionListener 
{	
	
	    // x- und y-Koordinaten der einzelnen Körperteile Schlange
	    private int x[] = new int[900]; 
	    private int y[] = new int[900]; 
	    
	    public static int sleep = 100; //Klassenbezogen
	    public static int score = 0; 
	    public static int punkte = 5;
	    private int bodys = 0; 
	    private int apfel_x; 
	    private int apfel_y; 
	    private int cake_x; 
	    private int cake_y; 
	    private int erdbeere_x; 
	    private int erdbeere_y;
	    private Timer timer;
	    
	   
	    public static long zeit = 0;
	    private long zeit1;
	    private long zeit2;
	 
	    
	    private boolean left = false; 
	    private boolean right = true; 
	    private boolean up = false; 
	    private boolean down = false; 
	    private boolean game = true; 
	    private boolean gameover = false;
	  
	    private Image body; 
	    private Image apple; 
	    private Image cake;
	    private Image strawberry;
	    private Image rhead;
	    private Image lhead;
	    private Image uhead;
	    private Image dhead;
	    
	    private Status meldung = new Status();
	     
	    
	    public Schlange() 
	    { 
	                 
	        addKeyListener(new TAdapter()); 
	          
	        setBackground(Color.white); 
	          
	        //statische Bilder-> Icons haben eine beliebige, aber feste Größe 
	        ImageIcon bild1 = new ImageIcon(this.getClass().getResource("snake_body_r_2.png")); 
	        body = bild1.getImage(); 
	 
	        ImageIcon bild2 = new ImageIcon(this.getClass().getResource("red_apple.png")); 
	        apple = bild2.getImage(); 
	 
	        ImageIcon bild3 = new ImageIcon(this.getClass().getResource("snake_head_r_2.png")); 
	        rhead = bild3.getImage(); 
	        
	        ImageIcon bild4 = new ImageIcon(this.getClass().getResource("snake_head_l_2.png")); 
	        lhead = bild4.getImage();
	        
	        ImageIcon bild5 = new ImageIcon(this.getClass().getResource("snake_head_u_2.png")); 
	        uhead = bild5.getImage();
	        
	        ImageIcon bild6 = new ImageIcon(this.getClass().getResource("snake_head_d_2.png")); 
	        dhead = bild6.getImage();
	        
	        ImageIcon bild7 = new ImageIcon(this.getClass().getResource("cupcake.png")); 
	        cake = bild7.getImage();
	        
	        ImageIcon bild8 = new ImageIcon(this.getClass().getResource("strawberry.png")); 
	        strawberry = bild8.getImage();
	        
	        timer = new Timer(sleep, this); 
	        timer.start();
	 
	      
	        setFocusable(true); 
	        runGame(); // ruft die Methode runGame auf 
	    } 
	    
	    
	    public void moveSnake() 
	    { 
	    	if(game)
	    	{
	         
	        // Die einzelnen Körperteile rücken immer um eins weiter in Richtung Kopf 
	        for (int z = bodys; z > 0; z--) 
	        { 
	            x[z] = x[(z - 1)]; 
	            y[z] = y[(z - 1)]; 
	        } 
	         
	        // Wenn Kopf nach links bewegt wird, 
	        if (left) 
	        { 
	            x[0] -= 10;
	        } 
	         
	        // Wenn Kopf nach rechts bewegt wird 
	        if (right) 
	        { 
	            x[0] += 10; 
	        } 
	         
	        // Wenn Kopf nach oben bewegt wird 
	        if (up) 
	        { 
	            y[0] -= 10; 
	        } 
	         
	        // Wenn Kopf nach unten bewegt wird 
	        if (down) 
	        { 
	            y[0] += 10; 
	        } 
	        
	      }
	    } 
	    
	    public void runGame() {
	    	
	        //Richtung wird zurükgesetzt
	        left = false;
	        right = true;
	        up = false;
	        down = false;
	 
	        // Anfangslänge der Schlange
	        bodys = 4;
	        score =0;
	        zeit1 = System.currentTimeMillis();

	        for (int z = 0; z < bodys; z++) 
	          { 
	              x[z] = 50 - z * 10; 
	              y[z] = 50; 
	          } 

	        legeApfel(); 
	        legeCake();
	        legeErdbeere();
	 
	        game = true;
	        gameover = false;
	    }
	 
	 
	    public void paint(Graphics g) 
	    { 
	        super.paint(g); 
	  
	            g.drawImage(apple, apfel_x, apfel_y, this); 
	            g.drawImage(cake, cake_x, cake_y, this);
	            g.drawImage(strawberry, erdbeere_x, erdbeere_y, this);
	 
	            for (int z = 0; z < bodys; z++) 
	            { 
	                if (z == 0) 
	                {	
	                	if(right)
	                	{
	                		g.drawImage(rhead, x[z], y[z], this);
	                	}
	                	
	                	if(left)
	                	{
	                		g.drawImage(lhead, x[z], y[z], this);
	                	}
	                	
	                	if(up)
	                	{
	                		g.drawImage(uhead, x[z], y[z], this);
	                	}
	                	
	                	if(down)
	                	{
	                		g.drawImage(dhead, x[z], y[z], this);
	                	}
	                } 	
	                	
	                else 
	                    {
	                		g.drawImage(body, x[z], y[z], this); 
	                    }
	                
	                if (gameover)
		            {
	                	
	                	String s= "Game Over";  
	        	        Font schrift = new Font("Helvetica", Font.BOLD, 26); 
	        	 
	        	        g.setColor(Color.black);
	        	        g.setFont(schrift); 
	        	        g.drawString(s, 130, 150);
		            }
		 
	            } 
	            
	            Toolkit.getDefaultToolkit().sync(); 
	            g.dispose(); 

	    } 
	 
	    public void prüfeApfel() 
	    { 
	 
	        if ((x[0] == apfel_x) && (y[0] == apfel_y)) 
	        { 
	            bodys++; 
	            score += punkte; 
	            legeApfel(); 
	            
	            Spielfeld.ausgabeScore();
	            
	            meldung.status("Apfel gegessen, Schlange wird länger...");
	        } 
	    } 
	    
	    public void prüfeCake() 
	    { 
	 
	        if ((x[0] == cake_x) && (y[0] == cake_y)) 
	        { 
	            bodys++; 
	            score += punkte; 
	            legeCake(); 
	           
	            Spielfeld.ausgabeScore();
	            
	            meldung.status("Kuchen gegessen, Schlange wird länger...");
	        } 
	    } 
	    
	    public void prüfeErdbeere() 
	    { 
	 
	        if ((x[0] == erdbeere_x) && (y[0] == erdbeere_y)) 
	        { 
	            bodys++; 
	            score += punkte; 
	            legeErdbeere(); 
	           
	            Spielfeld.ausgabeScore();
	            
	            meldung.status("Erdbeere gegessen, Schlange wird länger...");
	        } 
	    } 
	     
	   // Es wird geprüft, ob die Schlange gegen die Spielfeldbegrenzung oder gegen sich selber stößt. 
	    public void prüfeKollision() 
	    { 
	        boolean tot = false;
	  
	        
	        for (int z = bodys; z > 0; z--) 
	        { 
	        
	            if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z]))
	            { 
	                tot = true;
	               
	            } 
	        } 

	        // Wenn die Schlange oben oder unten, rechts oder links gegen die Spielfeldbegrenzung stoeßt, 
	        //dann ist das Spiel vorbei.
	        if (y[0] > 280) 
	        { 
	            tot = true;

	        } 
	 
	        if (y[0] <0) 
	        { 
	            tot = true;

	        } 
	         
	        if (x[0] > 390) 
	        { 
	            tot = true; 
	        } 
	 
	        if (x[0] < 0) 
	        { 
	            tot = true; 
	        } 
	        
	        if (tot) 
	        {
	        	game = false;
	        	gameover = true;
	        	meldung.status("GameOver");
	        }
	        
	    } 
	 
	    public void legeApfel() 
	    {   
	        int r = (int) ((Math.random() * 29)); 
	        apfel_x = ((r * 10)); 
	        r = (int) ((Math.random() * 29)); 
	        apfel_y = ((r * 10)); 
	    } 
	    
	    public void legeCake() 
	    {   
	        int r = (int) ((Math.random() * 29)); 
	        cake_x = ((r * 10)); 
	        r = (int) ((Math.random() * 29)); 
	        cake_y = ((r * 10)); 
	    } 
	    
	    public void legeErdbeere() 
	    {   
	        int r = (int) ((Math.random() * 29)); 
	        erdbeere_x = ((r * 10)); 
	        r = (int) ((Math.random() * 29)); 
	        erdbeere_y = ((r * 10)); 
	    } 
	    
	    public void actionPerformed(ActionEvent e) 
	    { 
	 
	        if (game) 
	        {  
	            prüfeApfel(); 
	            prüfeCake();
	            prüfeErdbeere();
	            prüfeKollision(); 
	            moveSnake(); 
	            requestFocus();
	            
	        } 
	        repaint(); 
	        zeit2 = System.currentTimeMillis();
	        zeit = zeit2-zeit1;
	        Spielfeld.ausgabeZeit();
	    } 
	     
	     
	    private class TAdapter extends KeyAdapter 
	    { 
	 
	        public void keyPressed(KeyEvent e) 
	        { 
	 
	            int key = e.getKeyCode(); //Gibt den Keycode (int Zahl) der gedrückten Taste zurück
	            
	            
	            if ((key == KeyEvent.VK_LEFT) && (!right)) 
	            { 
	                left = true; 
	                up = false; 
	                down = false;

	            } 
	             
	  
	            if ((key == KeyEvent.VK_RIGHT) && (!left)) 
	            { 
	                right = true; 
	                up = false; 
	                down = false; 
	                
	            } 
	             
	            if ((key == KeyEvent.VK_UP) && (!down)) 
	            { 
	                up = true; 
	                right = false; 
	                left = false; 
	                
	            } 
	            
	            if ((key == KeyEvent.VK_DOWN) && (!up)) 
	            { 
	                down = true; 
	                right = false; 
	                left = false; 
	                
	            } 
	        } 
	    } 

}
```

Und hier wird sie ausgegeben:

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;


public class Spielfeld extends javax.swing.JFrame {
	private JPanel pLeiste;
	private JPanel pSpielfeld;
	private JButton btHauptmenue;
	private JButton btNewGame;
	private static JLabel lbZeit;
	private static JLabel lbScore;
	
	private Schlange eineSchlange = new Schlange();
	
	
	
	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Spielfeld  inst = new Spielfeld();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public Spielfeld () {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			BorderLayout thisLayout = new BorderLayout();
			setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
			getContentPane().setLayout(thisLayout);
			{
				
				pLeiste = new JPanel();
				GridLayout pLeisteLayout = new GridLayout(1, 1);
				pLeisteLayout.setColumns(1);
				pLeisteLayout.setHgap(5);
				pLeisteLayout.setVgap(5);
				pLeiste.setLayout(pLeisteLayout);
				getContentPane().add(pLeiste, BorderLayout.NORTH);
				pLeiste.setBackground(new java.awt.Color(120,228,239));
				pLeiste.setPreferredSize(new java.awt.Dimension(400, 26));
				{
					lbScore = new JLabel();
					pLeiste.add(lbScore);
					lbScore.setText("Score: " + Integer.toString(Schlange.score));
					
				}
				{
					lbZeit = new JLabel();
					pLeiste.add(lbZeit);
					lbZeit.setText("Zeit:");
				}
				
				{
					btNewGame = new JButton();
					pLeiste.add(btNewGame);
					btNewGame.setText("NewGame");
					btNewGame.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							btNewGameActionPerformed(evt);
							
							eineSchlange.runGame();
							
						}
					});

				}
				{
					btHauptmenue = new JButton();
					pLeiste.add(btHauptmenue);
					btHauptmenue.setText("Menü");
					btHauptmenue.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							btHauptmenueActionPerformed(evt);
							
							Hauptmenue menueFenster = new Hauptmenue();
							menueFenster.setVisible(true);
							
							Spielfeld.this.dispose();
							
						}
					});
				}
				
			}
			{
				pSpielfeld = new JPanel();
				getContentPane().add(BorderLayout.CENTER, new Schlange());
			}
			pack();
			setSize(400, 340);
			setTitle("Snake");
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void btHauptmenueActionPerformed(ActionEvent evt) {
		System.out.println("btHauptmenue wurde angeklickt...");
		//TODO add your code for btHauptmenue.actionPerformed
	}
	
	private void btNewGameActionPerformed(ActionEvent evt) {
		System.out.println("btNewGame wurde angeklickt...");
		//TODO add your code for btNewGame.actionPerformed
	}

	
	public static void ausgabeScore()
	{
		lbScore.setText("Score: " + Integer.toString(Schlange.score));
	}
	
	public static void ausgabeZeit()
	{
		lbZeit.setText("Zeit: " + Long.toString(Schlange.zeit/1000));
	}
	
	
}
```

Wäre schön wenn ihr mir weiterhelfen könntet!


----------



## Marco13 (28. Apr 2011)

Springt die Zeit zwischen irgendwelchen Werten hin und her, oder ist sie einfach nur falsch?


----------



## Joeline (28. Apr 2011)

Die Zeit springt zwischen irgendwelchen Werten hin und her!


----------



## Marco13 (28. Apr 2011)

Wie startest du das den neu? (Kann man den Code compilieren, hab's grad nicht getestet..). Kann es sein, dass du zwei "Schlange"-Objekte erstellst, die sich dann drum kloppen, wer "seine" Zeit in das Label schreiben darf?


----------



## Joeline (28. Apr 2011)

Aso ok jetzt versteh ich was nicht stimmt. Bin selbst drauf gekommen. Mein Zähler zählt weiter auch wenn, dass Spiel eig beendet ist. 
Wenn man jetzt nämlich 

```
if(game)
	        {
	        	zeit2 = System.currentTimeMillis();
	        	zeit = zeit2-zeit1;
	        	Spielfeld.ausgabeZeit();
	        }
```

einfügt, dann funktioniert es.


----------



## Marco13 (28. Apr 2011)

"Funktionieren" ist ein dehnbarer Begriff. Wenn man es definiert als "Es scheint auf dem Bildschirm das zu erscheinen, was man erwartet" mag das zutreffen. Aber nochmal: Kann es sein, dass du zwei "Schlange"-Objekte erstellst? Zumindest scheint ja der Timer nicht gestoppt und/oder neu gestartet zu werden...


----------



## Joeline (28. Apr 2011)

Aber dafür habe ich jetzt noch eine andere Frage. Warum wird das Spiel nicht neu gestartet, wenn ich auf NewGame klicke....das versteh ich einfach nicht. Was mache ich falsch?

Code siehe vorherige Frage.


----------



## Joeline (28. Apr 2011)

Ja also neu starten kann man das nicht wirklich nennen. Ich geh zurück zum Hauptmenü und klicke dann wieder auf spielen. Vllt hast du recht. Meinst ich sollte den timer erst in run Game starten und bei Game over stoppen oder wie sonst??


----------



## Marco13 (28. Apr 2011)

Marco13 hat gesagt.:


> Kann es sein, dass du zwei "Schlange"-Objekte erstellst, die sich dann drum kloppen, wer "seine" Zeit in das Label schreiben darf?





Marco13 hat gesagt.:


> Aber nochmal: Kann es sein, dass du zwei "Schlange"-Objekte erstellst?



*seufz*

//getContentPane().add(BorderLayout.CENTER, new Schlange()); // WEG
getContentPane().add(BorderLayout.CENTER, eineSchlange); // HIN


----------



## Joeline (28. Apr 2011)

Oh man.... sry. Bin manchmal schwer von Begriff. Natürlich hast du recht. Vielen Dank das du es mir nochmal genau gesagt hast!!


----------



## Marco13 (28. Apr 2011)

Die ersten beiden waren auch nur Vermutungen, die ich auf Basis der beschriebenen Symptome geäußert hatte... wenn das so versteckt ist, fällt es eben nicht sofort auf :bahnhof:


----------

