Und hier mal der gesamte Quelltext:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import java.io.*;
public class Snake extends Applet implements Runnable
{
private final int WIDTH = 10, HEIGHT = 10;//Standard-Einstellung
private final Point[] STARTCOORDS = new Point[]{//Standard-Einstellung
new Point(50,195),
new Point(40,195),
new Point(30,195),
new Point(20,195),
new Point(10,195),
new Point(0,195)};
private int score=0,scoreold=0,start,bonuscounter,foodcounter;
private boolean end=false,paused=false,bonus=false,foodchange=false;
private Point direction = new Point(10,0),fooddirection = new Point((int)(Math.floor(Math.random()*2)),(int)(Math.floor(Math.random()*2))); //Standard-Einstellung
private Thread move = new Thread(this);
private Point food = new Point(10+10*(int)(Math.floor((Math.random()*39))),10+10*(int)(Math.floor((Math.random()*39))));
private Vector coords = new Vector();
private Image startimage,explosion,skin,headup,headright,headdown,headleft,head,dbimage,sand,maus,mausb,mausn;
private Graphics dbg;
public boolean readIt()
{
try
{
FileInputStream read = new FileInputStream("highscore");
ObjectInputStream object = new ObjectInputStream(read);
Object what = object.readObject();
scoreold = Integer.parseInt(((String)what));
object.close();
read.close();
}
catch(Exception e)
{
e.printStackTrace();
return false; //Falls die Datei nicht existiert
}
return true;
}//readIt end
public boolean writeIt()
{
try
{
FileOutputStream write = new FileOutputStream("highscore");
ObjectOutputStream object = new ObjectOutputStream(write);
String output = ""+score;
object.writeObject(output);
object.close();
write.close();
return true;
}
catch(Exception e)
{
e.printStackTrace();
return false; //Schreib-Fehler
}
}//writeIt end
public void setAll()
{
direction = new Point(10,0);
move = new Thread(this);
food = new Point(10+10*(int)(Math.floor((Math.random()*39))),10+10*(int)(Math.floor((Math.random()*39))));
coords = new Vector();
MediaTracker bilderladen = new MediaTracker(this);
startimage = getImage(getCodeBase(), "snake.jpg");
explosion = getImage(getCodeBase(), "explosion.gif");
skin = getImage(getCodeBase(), "skin.gif");
headup = getImage(getCodeBase(), "head.gif");
headright = getImage(getCodeBase(), "head_right.gif");
headdown = getImage(getCodeBase(), "head_down.gif");
headleft = getImage(getCodeBase(), "head_left.gif");
sand = getImage(getCodeBase(), "sand.gif");
mausb = getImage(getCodeBase(), "mouseup_b.gif");
mausn = getImage(getCodeBase(), "mouseup.gif");
bilderladen.addImage(startimage,0);
bilderladen.addImage(explosion,1);
bilderladen.addImage(skin,2);
bilderladen.addImage(headup,3);
bilderladen.addImage(headleft,4);
bilderladen.addImage(headdown,5);
bilderladen.addImage(headright,6);
bilderladen.addImage(sand,7);
bilderladen.addImage(mausn,8);
bilderladen.addImage(mausb,9);
try
{
bilderladen.waitForAll();
}
catch(Exception e)
{
//nothing
}
head = headright;
start=0;
end=false;
score=0;
maus = mausn;
}
public void start()
{
repaint();
if(start!=0) move.start();
}
public void stop() {
move.stop();
}
//public void destroy() { }
public void run()
{
int foodx,foody;
for(int x=0;x<STARTCOORDS.length;x++)
{
coords.add(x,STARTCOORDS[x]);
}
bonuscounter=0;
boolean bonusexist=false;
for(;;)
{
Point schwanz = (Point) coords.get((coords.size()-1));
for(int y=(coords.size()-1);y>0;y--)
{
coords.remove(y);
coords.insertElementAt(((Point)coords.get(y-1)),y);
}
Point punkt = (Point) coords.firstElement();
int horizontal,vertikal;
horizontal = (int) punkt.getX() + (int) direction.getX();
vertikal = (int) punkt.getY() + (int) direction.getY();
punkt = new Point(horizontal,vertikal);
coords.remove(0);
coords.insertElementAt(punkt,0);
foodcounter++;
if(foodcounter==40)
{
if(foodchange) foodchange=false;
else foodchange=true;
if(foodchange)
fooddirection = new Point((int)(Math.floor(Math.random()*2)),(int)(Math.floor(Math.random()*2)));
else
fooddirection = new Point((int)(Math.floor(Math.random()*-2)),(int)(Math.floor(Math.random()*-2)));
foodcounter=0;
}
foodx = (int)(food.getX() + fooddirection.getX());
foody = (int)(food.getY() + fooddirection.getY());
if((foodx>-1)&&(foody!=390)&&(foodx!=390)&&(foody!=-1))
{
food = new Point(foodx,foody);
}
int kopfx = (int)((Point)coords.get(0)).getX(), kopfy = (int)((Point)coords.get(0)).getY();
foodx = (int) food.getX();
foody = (int) food.getY();
if((kopfx >=(foodx-5) && kopfx <= (foodx+5))&&(kopfy >=(foody-5) && kopfy <= (foody+5)))
{
food = new Point(10+10*(int)(Math.floor((Math.random()*37))),10+10*(int)(Math.floor((Math.random()*37))));
coords.add(schwanz);
bonusexist=false;
if(bonus){
score+=15;
maus = mausn;
bonus=false;
fooddirection = new Point((int)(Math.floor(Math.random()*2)),(int)(Math.floor(Math.random()*2)));
foodcounter=0;
}
else score++;
}
if((score%10==0)&&(!bonus)&&(score!=0)&&(!bonusexist))
{
maus = mausb;
bonus=true;
bonusexist=true;
bonuscounter=70;
}
if(bonus)
{
bonuscounter--;
if(bonuscounter==0){
bonus=false;
maus = mausn;
food = new Point(10+10*(int)(Math.floor((Math.random()*37))),10+10*(int)(Math.floor((Math.random()*37))));
}
}
for(int x=1;x<coords.size();x++)
{
int teilx = (int)((Point)coords.get(x)).getX();
int teily = (int)((Point)coords.get(x)).getY();
if((kopfx >=(teilx-5) && kopfx <= (teilx+5))&&(kopfy >=(teily-5) && kopfy <= (teily+5)))
{
end=true;
repaint();
highscore();
}
}
if(kopfx>400) ((Point)coords.get(0)).x=0;
else if(kopfy>400) ((Point)coords.get(0)).y=0;
else if(kopfx<0) ((Point)coords.get(0)).x=390;
else if(kopfy<0) ((Point)coords.get(0)).y=390;
repaint();
if(paused) move.suspend();
try
{
Thread.sleep(70);
}
catch(Exception e)
{
//Nothing
}
}
}//run end
public void highscore()
{
if(readIt())
{
if(score>scoreold) writeIt();
}
AppletContext Context = getAppletContext();
try
{
Context.showDocument(new URL("http://www.bg.bib.de/~bbth3dbl/welcome.php"), "");
} catch (Exception ex)
{
ex.printStackTrace();
//Nothing
}
stop();
}
public void update(Graphics g)
{
if(dbimage==null)
{
dbimage = createImage(this.getSize().width, this.getSize().height);
dbg = dbimage.getGraphics ();
}
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
dbg.setColor (getForeground());
paint (dbg);
g.drawImage(dbimage,0,0,this);
}
public void paint(Graphics g)
{
g.setColor(Color.red);
if(start==1)
{
g.drawImage(sand,0,0,this);
g.drawImage(maus,(int) food.getX(),(int) food.getY(),this);
for(int x=0;x<coords.size();x++)
{
if(x==0)
{
g.setColor(Color.BLACK);
g.drawImage(head,(int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),this);
g.setColor(Color.RED);
}
else
g.drawImage(skin,(int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),this);
}
if(end) g.drawImage(explosion,(int)((Point)coords.get(0)).getX()-20,(int)((Point)coords.get(0)).getY()-20,this);
g.setColor(Color.white);
g.drawString("Sie haben " + score + " Punkte !",20,10);
if(bonus) g.drawString("Bonuscounter " + bonuscounter +"",180,10);
if(end) g.drawString("Gameover! Zum Neustarten bitte die Leertaste drücken",20,200);
if(paused) g.drawString("<----Pause---->",150,200);
}
else if(start==0)
{
//g.drawString("Start",60,60);
g.drawImage(startimage,0,0,this);
}
else{
g.drawString("Error...",20,20);
}
}
public boolean keyDown(Event e,int key)
{
if(key==Event.LEFT)
{
if((((int) direction.getX()==10))&&(((int) direction.getY()==0))){ direction = new Point(0,-10); head = headup; }
else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))){ direction = new Point(0,10); head = headdown; }
else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))){ direction = new Point(-10,0); head = headleft; }
else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))){ direction = new Point(10,0); head = headright; }
}
else if(key==Event.RIGHT)
{
if((((int) direction.getX()==10))&&(((int) direction.getY()==0))){ direction = new Point(0,10); head = headdown; }
else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))){ direction = new Point(0,-10); head = headup; }
else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))){ direction = new Point(10,0); head = headright; }
else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))){ direction = new Point(-10,0); head = headleft; }
}
else if((key==32)&&(start==0))
{
start=1;
start();
}
else if((key==32)&&(start==1)&&(end))
{
removeAll();
setAll();
start();
}
else if((key==112)&&(start==1)&&(!end))
{
if(!paused) paused=true;
else{ paused=false;
move.resume();
}
}
return true;
}
public void init()
{
setAll();
}//init end
}//class End