Hilfe bei snake

  • Themenstarter Themenstarter Nils ait
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
N

Nils ait

Gast
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
 
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.
 
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.
 
Code:
[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]
 
: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äß
Code:
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());
    }
}
 
Frucht und Rechteck kannst Du sehr viel kleiner halten, z. b. so:

Code:
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>
 
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:

Code:
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:

Code:
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....
 
ersma danke aber was muss ich hier machen:

Code:
 private void checkKeys(){
      //hier booleans der Keys abfragen
      if(up){
         System.out.println("steuere Hoch...");
         //....
      }
      
      //undsoweiter...
   }
 
Die Steuerung realiseieren, z. B.

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

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

 //und so weiter und so fort.
 
irgend etwas stimmt da nicht ich habe noch 2 fehler meine codes sehen grade so aus :

Steuerung

Code:
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:

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

}
 
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
 
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. 🙁
 
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?
 
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
 
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.
 
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

Code:
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 :'(
 
okay hab des mit der kollision mal gemacht klappt aber nicht

Code:
 public void check()
   {
       if (obj[0].intersects(obst))
       {
       obst.setX(Zufall.Frucht());
       obst.sety(Zufall.Frucht());}
       
       }
 
Code:
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.:
Code:
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
Code:
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
 
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 !
 
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 ?
 
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?
 
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
 
okay ich weiss jetz wies geht aber da kommt immer eine fehlermeldung : failed to load mainfest attribute from C😀okumente und einstellungen\Desktop\Snake
 
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.
 
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
 
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:
 
nein... ich will nicht das ihr meine hausaufgeben macht ich bin ja fertig damit... ich will des nur vom desktop aus starten!
 
Siassei hat gesagt.:
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:

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:
 
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. :?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben