# Hilfe bei snake



## Nils ait (29. Jul 2008)

hallo erstmal ich bin seit einem jahr auf einem informationstechnischen Gymnasium und habe einige probleme mit java 

wir arbeiten mit dem programm eclipse.

wir haben gerade die aufgabe ein spiel zu programmieren ich habe mich für snake entschieden und habe einige kleine logik fehler die ich nicht lösen kann 

zuerst einmal bewegt sich die schlange nicht so wie sie sich bewegen soll 
desweiteren funktioniert das mit dem einsammeln nicht so wie gedacht denn die schlange muss genau die selben x und y werte haben wie die frucht gibt es keine methode oder ähnliches welche bewirkt dass wenn die schlange auf das rechteck kommt egal an welcher stelle dieses verschwindet? ich habe die frucht so programmiert dass wenn die x und y werte übereinstimmen eine neue frucht erstellt wird doch das funktioniert nicht weil ich nich genau diese werte bekomme (die frucht soll willkürlich irgendwo im applet erscheinen (math.random) brauche hilfe meine e-mail addrese ist nils90@web.de 

hier das programm (codes):

http://rapidshare.de/files/40108612/snake_1_5.rar.html


----------



## Soulfly (29. Jul 2008)

Für beide Probleme!!

Nutze Rechtecke für Frucht,Kugel und Snake Kopf, am besten mit der Rectangle-Klasse benutzen und dann man kann die Rechtecke auf Schnitt prüfen und fertig. Dann ist es nicht mehr pixelgenau, was aber bei snake nicht weiter stören sollte.


----------



## Nils ait (29. Jul 2008)

okay und wie kann ich dies prüfen ? 
und wieso bewegt sich meine schlange so komisch ?


----------



## Quaxli (29. Jul 2008)

Poste doch mal ein bißchen Code hier im Forum. Dein Link oben ist für mich nicht erlaubt. Interssant wären die Methode mit der Du die Schlange bewegst und Deine Spielschleife (neudeutsch: GameLoop).

Die Kollision überprüfst Du mit intersects(..) einfach mal bei der Klasse Rectangle in die API gucken. Oder wenn's genauer sein soll, dann bei Rectangle2D.Double.


----------



## Nils ait (29. Jul 2008)

```
[u][b]also hier ist meine klasse Rechteck:[/b][/u]

package snake_1_5;

import java.applet.Applet;
import java.awt.*;
import java.applet.Applet;

public class Rechteck extends Applet {

	private int x1;
	private int y1;
	
	private  Color farbe= Color.blue;

	
	public Rechteck (int pX1, int pY1, Color f){
		
		this.x1=pX1;
		this.y1=pY1;
	
		
		
		farbe = f;
	}
	
	public void zeichne (Graphics g){
		g.setColor(farbe);
		
		g.drawRect(this.x1, this.y1, 10,10);
		g.fillRect(this.x1, this.y1, 10,10);
		

		
	}
	public int getX(){
		return x1;
	}
	public void setX (int x){
	this.x1 =x1;	
	}
	public int getY(){
		return y1;
	}
	public void setY(int y){
		this.y1=y1;
	}

}



[u][b]Nun meine Steuerung:[/b][/u]

 package snake_1_5;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import snake_1_0.Rechteck;
import util.Zufall;

public class Steuerung extends Applet implements KeyListener {
	
	private Rechteck obj []= new Rechteck [5];
	private final int MAX =5;
	private Frucht obst;
	private final int Punkte=100;

	
	public void init(){
		this.setBackground(Color.RED);
		this.setSize(800,800);
		
		obst =new Frucht(Zufall.hundert(),Zufall.hundert(),Color.cyan);
		obj[0] =new Rechteck(20,10,Color.GREEN);
		for (int i=1; i<MAX;i++)
			obj[i] =new Rechteck(obj[i-1].getX()+10,obj[i-1].getY()+10,Color.BLACK);
		
		
		this.addKeyListener(this);
		
	}
	
	public void paint (Graphics g){
		obst.zeichne(g);
		if (obj[1].getY()==obst.getfY())
		{
			if (obj[1].getX()==obst.getfX())
			{
				obst.zeichne(g);
			}
			
		}
		
		for (int i=0; i<MAX;i++)
		obj[i].zeichne(g);
	
	}

	public void keyTyped(KeyEvent arg0) {

		
	}

	public void keyPressed(KeyEvent ev) {

		
		if (ev.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			obj[0].setX(obj[0].getX()+10);
		}
		
		if (ev.getKeyCode()==KeyEvent.VK_LEFT)
		{
			obj[0].setX(obj[0].getX()-10);
		}
		
		if (ev.getKeyCode()==KeyEvent.VK_UP)
		{
			obj[0].setY(obj[0].getY()-10);
		}
		
		if (ev.getKeyCode()==KeyEvent.VK_DOWN)
		{
			obj[0].setY(obj[0].getY()+10);
		}
		
		for (int i=1; i<MAX;i++)
		{
			if (ev.getKeyCode()==KeyEvent.VK_RIGHT)
			{
			obj[i].setX(obj[i-1].getX()+10);	
			}
			
			if (ev.getKeyCode()==KeyEvent.VK_LEFT)
			{
			obj[i].setX(obj[i-1].getX()-10);	
			}
			
			if (ev.getKeyCode()==KeyEvent.VK_UP)
			{
			obj[i].setY(obj[i-1].getY()-10);	
			}
			
			if (ev.getKeyCode()==KeyEvent.VK_DOWN)
			{
			obj[i].setY(obj[i-1].getY()+10);	
			}
		}
			
		this.repaint();
	}

	public void keyReleased(KeyEvent arg0) {
		// TODO Automatisch erstellter Methoden-Stub
		
	}
}

[u][b]und zuletzt meine klasse Frucht:[/b][/u]

package snake_1_5;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Frucht extends Applet {
	private int Fx1;
	private int Fy1;
	
	private  Color farbe= Color.CYAN;

	
	public Frucht (int oX1, int oY1, Color f){
		
		this.Fx1=oX1;
		this.Fy1=oY1;
	
		
		
		farbe = f;
	}
	
	public void zeichne (Graphics g){
		g.setColor(farbe);
		g.drawRect(this.Fx1, this.Fy1, 10,10);
		g.fillRect(this.Fx1, this.Fy1, 10,10);
		

		
	}
	public int getfX(){
		return Fx1;
	}
	public void setfX (int gx){
	this.Fx1 =Fx1;	
	}
	public int getfY(){
		return Fy1;
	}
	public void setY(int gy){
		this.Fy1=Fy1;
	}

}
```
[/u]


----------



## Marco13 (29. Jul 2008)

:shock: Warum extenden die alle Applet?!? Mach das mal weg - NUR die "Haupklasse" sollte ein Applet sein.

Und sonst - die Frucht und das Rechteck könnten eben ein http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Rectangle.html enthalten (oder ggf. Rectangle extenden). Dann bräuchten sie auch nicht mehr selbst ihre x1 und y1 zu speichern. Sinngemäß

```
class Frucht
{
    Rectangle bounds = new Rectangle(0,0,10,10); // private machen, ggf. mit get-Methode

    public void setX (int x)
    {
         bounds.x = x;
    } 
    ...
}


class Rechteck
{
    Rectangle bounds = new Rectangle(); // private machen, ggf. mit get-Methode

    public void setX (int x)
    {
         bounds.x = x;
    } 
    ...

    public boolean hits(Frucht frucht)
    {
        return this.bounds.intersects(frucht.getBounds());
    }
}
```


----------



## Quaxli (29. Jul 2008)

Frucht und Rechteck kannst Du sehr viel kleiner halten, z. b. so:


```
import java.awt.*;
import java.awt.geom.Rectangle2D;

public class Rechteck extends Rectangle2D.Double {

	private  Color farbe= Color.blue;

   
   public Rechteck (int pX1, int pY1, int breite, int hoehe, Color f){
     super(pX1,pY1,breite,hoehe);  
   }
   
   public void zeichne (Graphics g){
      g.setColor(farbe);
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight()); //der hier ist unnötig wenn Du sonst nix machst
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight());
   }

}
```

Zum Applet sag ich später was, da  fehlt mir jetzt die Zeit. Oder vielleicht macht ja sonst jemand ein paar Anmerkungen.

<edit>
  Marco13 war schon schneller... 
</edit>


----------



## Marco13 (29. Jul 2008)

Schau übrigens auch mal hier 
http://www.java-forum.org/de/viewtopic.php?t=71821
das könnte helfen.... :wink:


----------



## Quaxli (29. Jul 2008)

So, ich hab' mal dran rumgefrickelt. Es ist aber erstmal ein Rechteck und keine Schlange. Die ist nämlich nicht ganz so einfach zu realisieren, wie du noch merken wirst... 

Die Klasse Steuerung ist lauffähig, aber ich habe nur das notwendigste umgesetzt. Du sollst ja schließlich auch was lernen.... 

Zuerst hab' ich die Klasse Rechteck nochmal aufgebohrt:


```
import java.awt.*;
import java.awt.geom.Rectangle2D;

public class Rechteck extends Rectangle2D.Double {

	private  Color farbe= Color.blue;
	int dx = 0;
	int dy = 0;
	
   
   public Rechteck (int pX1, int pY1, int breite, int hoehe, Color f){
     super(pX1,pY1,breite,hoehe);  
     farbe = f;
     dx = 20;  //<<< nur mal als Beispiel
     dy = 20;
   }
   
   public void zeichne (Graphics g){
      g.setColor(farbe);
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight()); //der hier ist unnötig wenn Du sonst nix machst
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight());
   }
   
   //Bewegung in Abhängigkeit der Zeit, die der letze Durchlauf benötigt hat.
   public void move(long delta){
  	
  	 if(dx!=0){
  		 x += (dx*delta/1e9);
  	 }
  	 
  	 if(dy!=0){
  		 y += (dy*delta/1e9);
  	 }
  	 
   }
   
   public void setHorizontalSpeed(int i){
  	 dx = i;
   }
   
   public void setVerticalSpeed(int i){
  	 dy = i;
   }

}
```


Und dann die Klasse Steuerung:


```
import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.*;


//Auf JApplet umgestellt, damit eine doppelgebufferte KOmponente reingepackt werden kann
public class Steuerung extends Applet implements KeyListener, Runnable {
	
	private static final long	serialVersionUID	= 1L;
	
	private Rechteck	obj[]		= new Rechteck[1]; //für den Anfang erst mal nur eines ;-)
	private Frucht		obst;
	
	boolean running = true; //boolean für GameLoop
	long delta = 0; //Zeit für Schleifendurchlauf
	long last = 0;  //Zeitmerker
	
	//Steuerung über Boolean realisieren, dann werden auch Mehrfacheingaben bemerkt!
	boolean left = false;  
	boolean right = false;
	boolean up = false;
	boolean down = false;

	//BufferedImage für Doppelbufferung
	BufferedImage buf;

	public void init() {
		setSize(800,800);
		//BufferedImage für Doppelbufferung instanziieren.
		buf = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);

		//Ojbekte
		obst = new Frucht(50,50,20,20, Color.cyan); //Zufall mal rausgenommen, Dimension eingefügt
		obj[0] = new Rechteck(20, 10,20,20,Color.GREEN); //Dimension in Konstruktor
		
		//KeyListener
    addKeyListener(this);
    
    //Zeitstempel
		last = System.nanoTime();
		
		//GameLoop in eigenem Thread laufen lassen
		Thread t = new Thread(this);
		t.start();

	}


	public void keyTyped(KeyEvent e) {

	}

	public void keyPressed(KeyEvent e) {

		//KeyEvents in booleans schreiben
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = true;
		}

		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = true;
		}

		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}

	}

	public void keyReleased(KeyEvent e){
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = false;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = false;
		}

		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = false;
		}

		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = false;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			System.exit(0);
		}

	}

	//Run-Methode aus Runnable implementiert (vgl. Interfaces)
	//Hier läuft der GameLoop
	public void run() {
	
		while(running){
			
			delta = System.nanoTime() - last; //Zeit für den letzten Loop stoppen
			last = System.nanoTime();  //Zeit merken
			
			//für Spielablauf notwendige Methoden
			checkKeys();
			moveObjects();
			doLogic();
			
			//alles malen
			repaint();
			
			//kleines Päuschen, damit auch die anderen mal dürfen
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {}
			
		}//while
		
		
	}
	
	
	//Methoden des GameLoops
	private void checkKeys(){
		//hier booleans der Keys abfragen
		if(up){
			System.out.println("steuere Hoch...");
			//....
		}
		
		//undsoweiter...
	}
	
	private void moveObjects(){
		//hierObjekte bewegen
		for (int i = 0; i < obj.length; i++){ 
			obj[i].move(delta);
		}
	}
	
	private void doLogic(){
		if(obj[0].intersects(obst)){
			System.out.println("Kollision");
		}
	}

	
	//paint-Methode zum Zeichnen überschreiben
	public void paint(Graphics g) {

		Graphics g2 = buf.createGraphics();
		
		
		g2.setColor(Color.BLACK);
		g2.fillRect(0,0,getWidth(),getHeight());
		
		obst.zeichne(g2);
		
		for (int i = 0; i < obj.length; i++){ 
			obj[i].zeichne(g2);
		}
		
		g.drawImage(buf,0,0,this);
	}

 
	//Überschreibe Update für Doppelbufferung
	public void update(Graphics g) {
		paint(g);
	}
}
```

Viel Spaß beim fetig programmieren....


----------



## Nils ait (29. Jul 2008)

ersma danke aber was muss ich hier machen:


```
private void checkKeys(){
      //hier booleans der Keys abfragen
      if(up){
         System.out.println("steuere Hoch...");
         //....
      }
      
      //undsoweiter...
   }
```


----------



## Quaxli (29. Jul 2008)

Die Steuerung realiseieren, z. B.


```
if(up){
   obj[0].setVerticalSpeed(-20); //oder so ähnlich
 }

 if(down){
  obj.[0].setVerticalSpeed(20); 
 }

 //und so weiter und so fort.
```


----------



## Nils ait (29. Jul 2008)

irgend etwas stimmt da nicht ich habe noch 2 fehler meine codes sehen grade so aus : 

*Steuerung*


```
package snake_forum;

import java.applet.Applet;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.*;


//Auf JApplet umgestellt, damit eine doppelgebufferte KOmponente reingepackt werden kann
public class Steuerung extends Applet implements KeyListener, Runnable {
   
   private static final long   serialVersionUID   = 1L;
   
   private Rechteck   obj[]      = new Rechteck[1]; //für den Anfang erst mal nur eines ;-)
   private Frucht      obst;
   
   boolean running = true; //boolean für GameLoop
   long delta = 0; //Zeit für Schleifendurchlauf
   long last = 0;  //Zeitmerker
   
   //Steuerung über Boolean realisieren, dann werden auch Mehrfacheingaben bemerkt!
   boolean left = false; 
   boolean right = false;
   boolean up = false;
   boolean down = false;

   //BufferedImage für Doppelbufferung
   BufferedImage buf;

   public void init() {
      setSize(800,800);
      //BufferedImage für Doppelbufferung instanziieren.
      buf = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);

      //Ojbekte
      obst = new Frucht(50,50,20,20, Color.cyan); //Zufall mal rausgenommen, Dimension eingefügt
      obj[0] = new Rechteck(20, 10,20,20,Color.GREEN); //Dimension in Konstruktor
      
      //KeyListener
    addKeyListener(this);
   
    //Zeitstempel
      last = System.nanoTime();
      
      //GameLoop in eigenem Thread laufen lassen
      Thread t = new Thread(this);
      t.start();

   }


   public void keyTyped(KeyEvent e) {

   }

   public void keyPressed(KeyEvent e) {

      //KeyEvents in booleans schreiben
      if(e.getKeyCode()==KeyEvent.VK_UP){
         up = true;
      }
      
      if(e.getKeyCode()==KeyEvent.VK_DOWN){
         down = true;
      }

      if(e.getKeyCode()==KeyEvent.VK_LEFT){
         left = true;
      }

      if(e.getKeyCode()==KeyEvent.VK_RIGHT){
         right = true;
      }

   }

   public void keyReleased(KeyEvent e){
      
      if(e.getKeyCode()==KeyEvent.VK_UP){
         up = false;
      }
      
      if(e.getKeyCode()==KeyEvent.VK_DOWN){
         down = false;
      }

      if(e.getKeyCode()==KeyEvent.VK_LEFT){
         left = false;
      }

      if(e.getKeyCode()==KeyEvent.VK_RIGHT){
         right = false;
      }
      
      if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
         System.exit(0);
      }

   }

   //Run-Methode aus Runnable implementiert (vgl. Interfaces)
   //Hier läuft der GameLoop
   public void run() {
   
      while(running){
         
         delta = System.nanoTime() - last; //Zeit für den letzten Loop stoppen
         last = System.nanoTime();  //Zeit merken
         
         //für Spielablauf notwendige Methoden
         checkKeys();
         moveObjects();
         doLogic();
         
         //alles malen
         repaint();
         
         //kleines Päuschen, damit auch die anderen mal dürfen
         try {
            Thread.sleep(10);
         } catch (InterruptedException e) {}
         
      }//while
      
      
   }
   
   
   //Methoden des GameLoops
   private void checkKeys(){
      //hier booleans der Keys abfragen
      if(up)
      {
         System.out.println("steuere Hoch...");
      }
      if(down)
      {
          System.out.println("Steure runter"); 
          
        }
      if(left)
      {
    	System.out.println("Steure Links");   
      }
      
      if(right)
      {
    	  System.out.println("Steure rechts"); 
      }

      if(up){
         obj[0].setVerticalSpeed(-20); //oder so ähnlich
      }

      if(down){
        obj[0].setVerticalSpeed(20);
        
      }
      if (right){
    	  obj[0].setHorizontalSpeed(20);
    	  
      }
      if (left){
    	  obj[0].setHorizontalSpeed(-20);
      }

//      und so weiter und so fort. 
   }
   
   private void moveObjects(){
      //hierObjekte bewegen
      for (int i = 0; i < obj.length; i++){
         obj[i].move(delta);
      }
   }
   
   private void doLogic(){
      if(obj[0].intersects(obst)){
         System.out.println("Kollision");
      }
   }

   
   //paint-Methode zum Zeichnen überschreiben
   public void paint(Graphics g) {

      Graphics g2 = buf.createGraphics();
      
      
      g2.setColor(Color.BLACK);
      g2.fillRect(0,0,getWidth(),getHeight());
      
      obst.zeichne(g2);
      
      for (int i = 0; i < obj.length; i++){
         obj[i].zeichne(g2);
      }
      
      g.drawImage(buf,0,0,this);
   }


   //Überschreibe Update für Doppelbufferung
   public void update(Graphics g) {
      paint(g);
   }
}
```

*Rechteck:*


```
package snake_forum;

import java.awt.*;
import java.awt.geom.Rectangle2D;

public class Rechteck extends Rectangle2D.Double {

   private  Color farbe= Color.blue;
   int dx = 0;
   int dy = 0;
   
   
   public Rechteck (int pX1, int pY1, int breite, int hoehe, Color f){
     super(pX1,pY1,breite,hoehe); 
     farbe = f;
     dx = 20;  //<<< nur mal als Beispiel
     dy = 20;
   }
   
   public void zeichne (Graphics g){
      g.setColor(farbe);
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight()); //der hier ist unnötig wenn Du sonst nix machst
      g.drawRect((int)getX(),(int)getY(),(int)getWidth(),(int)getHeight());
   }
   
   //Bewegung in Abhängigkeit der Zeit, die der letze Durchlauf benötigt hat.
   public void move(long delta){
     
      if(dx!=0){
         x += (dx*delta/1e9);
      }
     
      if(dy!=0){
         y += (dy*delta/1e9);
      }
     
   }
   
   public void setHorizontalSpeed(int i){
      dx = i;
   }
   
   public void setVerticalSpeed(int i){
      dy = i;
   }

}
```

*Frucht:*

```
package snake_forum;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Frucht extends Applet {
	private int Fx1;
	private int Fy1;
	
	private  Color farbe= Color.CYAN;

	
	public Frucht (int oX1, int oY1, Color f){
		
		this.Fx1=oX1;
		this.Fy1=oY1;
	
		
		
		farbe = f;
	}
	
	public void zeichne (Graphics g){
		g.setColor(farbe);
		g.drawRect(this.Fx1, this.Fy1, 10,10);
		g.fillRect(this.Fx1, this.Fy1, 10,10);
		

		
	}
	public int getfX(){
		return Fx1;
	}
	public void setfX (int gx){
	this.Fx1 =Fx1;	
	}
	public int getfY(){
		return Fy1;
	}
	public void setY(int gy){
		this.Fy1=Fy1;
	}

}
```


----------



## Quaxli (29. Jul 2008)

Und die Fehler sind....?


----------



## Nils ait (29. Jul 2008)

in der steuerung z. 37 und z.179


----------



## Soulfly (30. Jul 2008)

Frucht is kein Applet!!! Es sollte nur eine Klasse geben, die startklasse, die von Applet erbt.

Frucht extends Rectangle

Hoffe du verstehst auch warum! Ansonsten frag


----------



## Quaxli (30. Jul 2008)

Nils ait hat gesagt.:
			
		

> in der steuerung z. 37 und z.179



Geht's noch ungenauer?  ???:L  Nachdem das eine Hausaufgabe ist, geben wir gerne Hilfestellungen, aber wir programmieren das Ding nicht für Dich. Nachdem Du schon einiges selbst gemacht hast, habe ich Dein Applet
etwas lauffähiger gemacht, da Du einige Prinzipien nicht beachtet hattest bzw. nicht wußtest. Und da habe ich schon ganz schön was für Dich rein gesteckt.

Den Rest mußt Du schon selbst machen!

Wenn Du ein Problem hast, helfen wir gerne, aber dann nenne die in der Konsole ausgegebene Fehlermeldung oder beschreibe das Verhalten Deines Programms genauer. 
Außerdem solltest Du Tipps schon umsetzen. Sowohl Marco13 als auch ich haben bereits ganz am Anfang geschrieben, das Rechteck und Frucht nicht von Applet erben sollen, sondern daß Rectangle geeigneter ist.


----------



## Nils ait (30. Jul 2008)

kA wie des gemeint ist könntest du mir evtl den code von Frucht geben ? weil des klappt nicht welches rectangle muss ich da nehmen? 2D?oder rectangleDemo?


----------



## Nils ait (30. Jul 2008)

ja das problem ist das ich kA hab wie ich mit rectangle verfahre ich hab des noch nie benutzt und es wurde uns auch noch nie in irgendeiner hinsicht erklärt oder gezeigt oder sons was


----------



## Marco13 (30. Jul 2008)

Dir hat bestimmt auch niemand erklärt, wie man sich hier im Forum anmeldet - du hast es einfach _gemacht_  

Das Beispielprogramm, das ich oben verlinkt hatte, verwendet ja auch Rectangles, die bewegt werden, und zwischen denen Überschneidungstests gemacht werden. Wenn's irgendwo hakt, schreib' dir eine kleine Testklasse, wo nur in der main zwei Rectangles erstellt und die dann auf Überschneidungen getestet werden. Wenn DAS auch nicht klappt, poste den Code und deine Frage.

Ob du Rectangle oder Rectangle2D verwendest, macht keinen sooo großen Unterschied. Rectangle2D bietet ein paar zusätzliche, praktische Funktionen, ist aber einen Tick komplizierter zu verwenden.


----------



## Nils ait (31. Jul 2008)

ich hab da noch en paar kleine fragen ich hab des frucht jetz programmiert ich weiss aber nicht ob des so stimmt also fehler werden keine mehr angezeigt 


```
public class Frucht extends Rectangle {
	private  Color farbe= Color.CYAN;
	Rectangle bounds = new Rectangle(200,200,10,10); // private machen, ggf. mit get-Methode
	


    public void setX (int x)
    {
         bounds.x = x;
    } 
    public void sety (int y)
    {
    	bounds.y =y;
    }
    public int getx()
    {
    	return x;
    }
    public int gety()
    {
    	return y;
    }
	public void zeichne(Graphics g2) {
		// TODO Automatisch erstellter Methoden-Stub
		g2.setColor(farbe);
		g2.drawRect(this.x, this.y, 10,10);
		g2.fillRect(this.x, this.y, 10,10);
	}

}
```

und des mit dem aufeinander treffen klappt immer noch nicht :'(


----------



## Nils ait (31. Jul 2008)

okay hab des mit der kollision mal gemacht klappt aber nicht 


```
public void check()
   {
       if (obj[0].intersects(obst))
       {
       obst.setX(Zufall.Frucht());
       obst.sety(Zufall.Frucht());}
       
       }
```


----------



## Marco13 (31. Jul 2008)

```
public class Frucht extends Rectangle {
   private  Color farbe= Color.CYAN;
   Rectangle bounds = new Rectangle(200,200,10,10); // private machen, ggf. mit get-Methode
```
Da hast du jetzt zwei Sachen vermischt: Im Moment gilt
Frucht IST ein Rectangle (wegen "extends Rectangle")
*UND*
Frucht ENTHÄLT ein Rectangle (die bounds)

Du solltest nur eins von beidem verwenden. Z.B.:

```
public class Frucht extends Rectangle 
{
   private  Color farbe= Color.CYAN;

    public Frucht()
    {
        this.width = 10; // Richtige Größe für "this" (was ja ein Rectangle ist) setzen
        this.height = 10;
    }

    public void setX (int x)
    {
         this.x = x;
    }
    public void sety (int y)
    {
       this.y =y;
    }
    public int getx()
    {
       return x;
    }
    public int gety()
    {
       return y;
    }
   public void zeichne(Graphics g2) {
      // TODO Automatisch erstellter Methoden-Stub
      g2.setColor(farbe);
      g2.drawRect(this.x, this.y, this.width, this.height); // Hier dir Größe von "this" verwenden!
      g2.fillRect(this.x, this.y, this.width, this.height);
   }

}
```

Was genau die check-Methode machen sollte, ist mir nicht ganz klar. Aber du könntest mit dem oben stehenden Code jetzt sowas machen wie

```
Frucht frucht = new Frucht();
Rectangle someRectangle = new Rectangle(10,10,10,10);

frucht.setX(5);
frucht.setY(5);
System.out.println(someRectangle.intesects(frucht)); // Gibt "true" aus

frucht.setX(333);
frucht.setY(333);
System.out.println(someRectangle.intesects(frucht)); // Gibt "false" aus
```


----------



## Nils ait (31. Jul 2008)

also die check methode soll schauen ob die schlange(Rechteck) die Frucht(obst) berührt hat und wenn es so ist soll obst woanderst wieder auftauchen !


----------



## Nils ait (31. Jul 2008)

JUUUUU ICH HABS GERAFFT   man bin ich dämlich viiiiieeeeelen dank


----------



## Nils ait (31. Jul 2008)

jetzt hab ich doch noch eine frage wie kann ich denn nun dieses applet zu einer exe macen ode eben ausführen ohne das ich eclipse starten muss ?


----------



## Soulfly (31. Jul 2008)

Das geht zwar, ist dann aber kein java mehr. Es gibt da drei Möglichenkeiten, die alle stinken (zumindest mir):

1. eigenes Programm mit der JRE, in eine Exe packen -> Resultat eine 20-30 Mb große exe-Datei (schlimm)

2. Pseudo Exe-Datei erstellen (ähnelt den Jar-Archive), es muss immernoch eine JRE auf dem System installiert sein.

3. den Java Code von den Java GNU Compiler in natives C++ umsetzen lassen und dann zur Exe formen

Wenn du richtig Java einsetzen willst, nutze obige Sachen bitte nicht!!! Lass dein Programm von Eclipse in ein ausführbares Jar-Archiv packen. Das ist dann so ähnlich wie ne Exe und mit doppelklick ausführbar. (Wenn ne JRE auf dem System installiert ist natürlich)

Und dann gibt es noch Webstart. Sehr nette Sache! Aber dass jetzt noch beschreiben fehlt mir die Muße. Google ist dein Freund.


Eins, was ich jetzt noch hoffe!

Euer Lehrer hat das selber nicht verlangt oder? War das deine Idee?


----------



## Nils ait (31. Jul 2008)

naja verlangt nich so wirklich wir haben vor den sommerferien angefangen damit also am letzten schultag und da ich tagsüber sowieso arbeiten muss in nem institut und da als hiwi bin und zum größten teil nur  pc neuaufsetzen muss und zusammenschrauben muss und des netzwerk en bissl beausichtigen is es da immer en bissl langweillig also programmier ich des nebenher


----------



## Nils ait (31. Jul 2008)

das mit dem jar archiv packen hört sich ja gut an aber wie mach ich des?


----------



## Nils ait (31. Jul 2008)

okay ich weiss jetz wies geht aber da kommt immer eine fehlermeldung : failed to load mainfest attribute from Cokumente und einstellungen\Desktop\Snake


----------



## Soulfly (31. Jul 2008)

Da scheint es einfach so zu sein, als wenn du einen Absoluten Pfad zur Ausführung angegeben hast. In Eclipse, wenn du auf die Erstellung eines Jar Archivs klickst kannst du dort auch angeben, was zB die ausführbare Klasse ist.

Oh, wobei ich gerade bemerke!! Du hast ja ein Applet. Dann funktioniert das nicht. Du musst das dann in einer HTML-Datei einbetten (google/forum) dann geht das. Ansonsten mach aus deinem Programm eine Application. Heißt soviel wie "extends JFrame" plus geringfügige Änderungen.


----------



## Nils ait (1. Aug 2008)

also gut ich bekomm den scheiss nich hin -.- kann ich einem von euch des vielleicht per e mail als rar zu senden und einer von euch könnte mir des machen wäre echt super


----------



## Siassei (1. Aug 2008)

Nils ait hat gesagt.:
			
		

> also gut ich bekomm den scheiss nich hin -.- kann ich einem von euch des vielleicht per e mail als rar zu senden und einer von euch könnte mir des machen wäre echt super


Wir sollen hier deine Hausaufgaben erledigen? Verstehe ich das richtig? Falls ja, dann möge doch jemand diesen Thread schliessen :noe:


----------



## Marco13 (1. Aug 2008)

Naja, wegen so einem Detail - er will ja keinen Code (davon hat er schon genug bekommen :roll: ). Hast du schon auf http://java.sun.com/docs/books/tutorial/deployment/jar/ geguckt?


----------



## Nils ait (1. Aug 2008)

nein... ich will nicht das ihr meine hausaufgeben macht ich bin ja fertig damit... ich will des nur vom desktop aus starten!


----------



## Nils ait (1. Aug 2008)

Siassei hat gesagt.:
			
		

> Nils ait hat gesagt.:
> 
> 
> 
> ...



und selbst wenn ich hier fragen würde ob jemand meine hausaufgaben machen kann darf ich das auch es steht nirgends das es verboten ist zu fragen ob jemand seine hausaufgeben macht ... wenn es doch steht find ich es toll dass du das so toll gewusst hast  :toll:   :applaus:


----------



## Siassei (1. Aug 2008)

Nils ait hat gesagt.:
			
		

> nein... ich will nicht das ihr meine hausaufgeben macht ich bin ja fertig damit... ich will des nur vom desktop aus starten!



Hast du schon mal die FAQ durchsucht? Oder Google gefragt?
- FAQ
- 6 Varianten Java-Programme zu starten


----------



## Quaxli (1. Aug 2008)

Marco13 hat gesagt.:
			
		

> ...er will ja keinen Code (davon hat er schon genug bekommen :roll: )....



Er hat sogar sehr viel Code bekommen - von mir. 
Nicht das es was genutzt hätte. 

Ich stimme Siassei zu, wenn er's nicht selber rauskriegt, es gut sein zu lassen. Genug Hinweise hat's gegeben und mit Google und der Forumssuche ist das rauszukriegen.  :?


----------



## Nils ait (1. Aug 2008)

was für nicht das es was genützt hätte es läuft doch! ich bin fertig !


----------

