# Snake Alphaversion



## GagamehlO (23. Jun 2005)

So ich habe da mal nen kleine Applet geschrieben.
Achtung dies ist noch die Alpha-Version.

Ich erhoffe mir von euch weitere Vorschläge.

Meine Vorschläge sind:

-Double Buffering -> Flackern reduzieren.
-Bilder einbringen -> Schöneres Gesamtlayout
-Kollisonsabfrage muss exakter funktionieren. -> Im moment kann man den Stein auch noch leicht seitlich aufnehmen.

Hier der Link:


*SNAKE-ALPHAVERSION*



mfg GagamehlO


----------



## Illuvatar (23. Jun 2005)

Also die Steuerung find ich net so tol, da wär ich eher für oben unten rechts links.


----------



## EgonOlsen (23. Jun 2005)

Illuvatar hat gesagt.:
			
		

> Also die Steuerung find ich net so tol, da wär ich eher für oben unten rechts links.


Sehe ich auch so.


----------



## Nova (23. Jun 2005)

Hallo,

Ich würde die Steuerung auch anders machen, ist einfach intuitiver mit 4 Tasten.

Ich habe vor ein paar Monaten auch mal Snake als Applet programmiert, hier meine Version:
http://people.freenet.de/ChristianPetry/SnakeV1/Snake.html



mfg
Christian


----------



## bambi (24. Jun 2005)

Also ich find's auf jeden Fall schon mal ganz gut  :applaus: 

Ein wenig (noch mehr) schneller koennt's nach einiger Zeit schon werden und da ist irgendwo ein Bug drin -
kann das sein? Die Schlange war ploetzlich in der Wand und ist aber auch net mehr rausgekommen... 
Als ich dann auf einen Button geklickt hab' ging's aber wieder weiter...


----------



## GagamehlO (24. Jun 2005)

mhm ok das mit den 4 tasten werde ich berücksichtigen.
Bug? Die Schlange kann durch die Wand gehen.

Meine frühere Snake Version sah so aus.


Thread.sleep(100-score);


Nur funktioniert die sleep-Methode irgendwie nicht genau.
Ich habe mir das auch mal in Frames umrechnen lassen...
Es ändert sich z.B. nix bei 98 ms zu 100 ms.
Aber wenn man auf einmal bei 50 ms angekommen war fing das Ding total an zu rasen und man hatte keinen
Überblick mehr.

Ich denke mal ich werde das auf 70 ms setzen.


Aber 1. mal danke für die Kritik.
Hinzu sei gesagt das ich 1. seit ca. einem halbem Jahr Java programmiere und mir das Snake aus keinem
Tutorial gezogen habe, daher kann es sein das es meinem Programm auh z.T. ein bischen an performance fehlt.


mfg GagamehlO


----------



## GagamehlO (24. Jun 2005)

Nova hat gesagt.:
			
		

> Hallo,
> 
> Ich würde die Steuerung auch anders machen, ist einfach intuitiver mit 4 Tasten.
> 
> ...



Ich habe in deiner Version irgendwie nen Bug entdeckt manchmal wächst die Schlange sehr stark weiter.
Oder soll das so sein?


----------



## Nova (24. Jun 2005)

Hallo,

Jedes mal wenn man eine Zahl frisst wächst die Schlange ein Stück, das soll so sein.
Ich habs so eingestellt das die Schlange schon ein gutes Stück länger wird damit es auch wirklich schwierig wird.


mfg
Christian


----------



## GagamehlO (24. Jun 2005)

Und wie hasst du das gemacht.
Speicherst du dann z.B. die letzten 10 coords zwischen und fügst sie dann hinten dran?
Wie hast du das denn gemacht?
Ich nehme mal an auch mit nem Vektor oder ner anderen Collection?

Ich habe einen Vektor benutzt wo sich Point-Objekte drinnen befinden.
Das schwanz-Ende wird immer noch mal zusätzl. abgespecihert damit ich wenn ich einen Punkt mache das hinten dran
hängen kann.


So ich kann ja jetzt mal den Code reinwerfern...




```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;



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,start,bonuscounter;
    private boolean end=false,paused=false,bonus=false;
    private Point direction = new Point(10,0);//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;
    

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");
    bilderladen.addImage(startimage,0);
    bilderladen.addImage(explosion,1);
    try
    {
			bilderladen.waitForAll();
    }
    catch(Exception e)
    {
			//nothing
    }
    start=0;
    end=false;
    score=0;
}
    

public void start() 
{
	repaint();
     if(start!=0)  move.start();
}

public void stop() {

    move.stop();

}

//public void destroy() { }

public void run()
{
    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);
            

            int kopfx = (int)((Point)coords.get(0)).getX(), kopfy = (int)((Point)coords.get(0)).getY();
            int 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;       
            bonus=false;
            }                
            else score++;
            }
            
            if((score%10==0)&&(!bonus)&&(score!=0)&&(!bonusexist))
            {
                bonus=true;
                bonusexist=true;
                bonuscounter=70;    
            }
            
            if(bonus)
            {       

                bonuscounter--;
                if(bonuscounter==0){
                    bonus=false;
                    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();
                stop();
                        
		}
		
	    }
            
            
            
            
            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 paint (Graphics g)
{
    g.setColor(Color.red);
    if(start==1)
    {
         
        
        for(int x=0;x<coords.size();x++)
        {
            if(x==0)
            {
                g.setColor(Color.BLACK);
                g.fillOval((int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),WIDTH,HEIGHT);
                g.setColor(Color.RED);
    
                
            }
            else
            g.fillRect((int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),WIDTH,HEIGHT);
            
        }
        
        if(end) g.drawImage(explosion,(int)((Point)coords.get(0)).getX()-20,(int)((Point)coords.get(0)).getY()-20,this);
        
        if(bonus) g.setColor(Color.blue);
        else g.setColor(Color.green);
        g.fillRect((int) food.getX(),(int) food.getY(),10,10);
        g.setColor(Color.black);
        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);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(-10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(10,0);
        }            
        else if(key==Event.RIGHT)
        {
            if((((int) direction.getX()==10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,-10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(-10,0);
        }
	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
```


----------



## Illuvatar (24. Jun 2005)

Ach ja: Kannst dir natürlich auch mal das anschauen: http://www.java-forum.org/de/viewtopic.php?t=19195


----------



## Nova (24. Jun 2005)

Hallo,

Ich hab gerade wenig Zeit sodass ich deinen Code nur ganz kurz überfliegen konnten.
Wie es aussieht hast du einen ganz anderen Ansatz als ich.


Bei mir ist die Spielfläche ein Array, wenn ein bestimmtes Kästchen den Wert 0 hat ist es leer, bei -2 befindet sich ein teil von Wurm 1 auf diesem Feld, bei -3 ein Teil von Wurm 2 und bei -4 beide Würmer (ich hab es so gemacht das bei 2 Würmern die Würmer übereinanderlaufen können, da es sonst kaum noch spielbar ist), -1 ist eine Wand.
Anfangs konnten bei mir die Würmer auch durch die Außenwände laufen, das hab ich aber später wieder verworfen.

Normalerweise wird der Wurm in jedem Zyklus vorne um eins verlängert und hinten eins entfernt, wenn der Wurm aber z.B. um 10 Kästchen wachsen soll weil er gerade eine Zahl gefressen hat lösche ich 10 Zyklen lang das Ende nicht. Die Positionen des Wurmes sind in einer LinkedList gespeichert.

Dieses Spiel war mein erster Versuch in Applets, Graphik allgemein und Spielprogrammierung, im Klartext: 
Ich hatte keine Ahnung wie sowas funktioniert und hab einfach solange rumprobiert bis es funktionierte. 
Das sieht man dem Programm auch an, da ich noch nix von DoubleBuffering wusste habe ich z.B.immer von Hand das Ende des Wurmes übermalt und auch die Punkte erst weiß übermalt und dann schwarz neugemalt usw. Es ist auch viel hardcodiert und von objektorientiert ist nicht viel zu sehen...
Heute würde ich sicher vieles anders machen...


Hier der Code (mit 638 Zeilen ein ganz schöner Brocken  ):

```
import java.applet.Applet;
import java.awt.*;
import java.awt.Font;
import java.awt.event.*;
import javax.swing.Timer;
import java.util.LinkedList;
import javax.swing.JOptionPane;

public class Snake extends Applet implements KeyListener{

    private int[][] matrix, matrix_alt;
    private LinkedList snake1, snake2;
    private int richtung1, richtung2;
    private int mitte_x, mitte_y;
    private int x, y;
    private int zahl, zahl_alt, wachse1, wachse2;
    private Timer timer;
    private final int MAX_X = 800, MAX_Y = 600, WACHSE = 30;
    private final int DELAY = 150, MAX_LEVEL = 7, ADD_POINTS = 100;
    private boolean wurm2;
    private int spielerAnz, nextLevelConfirm, level, punkte1, punkte1_alt, punkte2, punkte2_alt;
    private String anleitung;
    private boolean anfang;

    public void init(){
	anleitung = "-----------------------------------Anleitung:-----------------------------------\n" +
		    "---Spielprinzip:---\n" +
		    "Man steuert einen Wurm und frisst rote Kästchen " +
		    "je mehr \"Nahrung\" der Wurm zu sich nimmt desto länger wird er.\n" +
		    "Ziel ist es alle 9 Nahrungseinheiten zu fressen, dann kommt man in den nächsten\n" +
		    "Level.\n" +
		    "Vorsicht: Ihr dürft weder Hindernisse berühren noch euch selbst beißen (was anfangs\n" +
		    "sehr simpel klingt wird zunehmend schwerer je länger der Wurm ist und je schwieriger\n" +
		    "der Level wird).\n" +
		    "Für jede gefressene Nahrungseinheit gibt es Punkte, wenn ihr die Wand berührt oder\n" +
		    "euch selbst beißt gibt es hingegen Punktabzug (je länger euer Wurm ist, desto höher\n" +
		    "ist auch der Punktabzug)\n" +
		    "Richtig knifflig wird es wenn man mit 2 Spielern spielt, denn dann kommt noch der\n" +
		    "Zeitdruck hinzu.\n" +
		    "Derzeit ist es möglich \"durch\" den gegnerischen Wurm durchzulaufen, da es sonst zu\n" +
		    "schwierig wird.\n\n" +
		    "---Steuerung:---\n" +
		    "Wurm 1:\nPfeil links: links\nPfeil rechts: rechts\nPfeil hoch: oben\nPfeil runter: "+
		    "unten\n\n" +
		    "Wurm 2:\nA: links\nD: rechts\nE: oben\nS: unten\n";
        JOptionPane.showMessageDialog(null, anleitung);
        JOptionPane.showMessageDialog(null, "ACHTUNG:\nBei einigen Browsern ist es nötig am Anfang des " +
	"Levels einmal\nins Applet zu klicken und die Maus innerhalb des Spielfeldes zu halten\n" +
	"um die Würmer steuern zu können!");
        spielerAnz = Integer.parseInt(JOptionPane.showInputDialog("Bitte auswählen:\n(1) 1-Spieler\n(2) 2-Spieler"));
	level = Integer.parseInt(JOptionPane.showInputDialog("Level: "));
	if (spielerAnz == 2){
	    wurm2 = true;
	} else {
	    wurm2 = false;
	}
        addKeyListener(this);
        snake1 = new LinkedList();
        snake2 = new LinkedList();
	timer = new Timer(DELAY, new TimerListener());
        matrix= new int[80][60];
        matrix_alt= new int[80][60];
	punkte1 = 0;
	punkte2 = 0;
	punkte1_alt = 0;
	punkte2_alt = 0;
        nextLevel();
    }

    public void paint(Graphics g){
        // Löschen der nun leeren Felder
	g.setColor(Color.white);
	g.setFont(new Font("Arial", 0, 14));
	if (punkte1 != punkte1_alt){
	    g.drawString("Wurm1: " + punkte1_alt, 650, 30);
	    punkte1_alt = punkte1;
	}
	if (punkte2 != punkte2_alt){
	    g.drawString("Wurm2: " + punkte2_alt, 650, 45);
	    punkte2_alt = punkte2;
	}
	setBackground(Color.white);
	for (int i = 1; i <= 79 ; i++){
	    for (int k = 1; k <= 59; k++){
	        if (matrix[i][k] == 0 && matrix_alt[i][k] != 0){
		    g.setColor(Color.white);
		    g.fillRect(i*10, k*10, 10, 10);
		}
     }
	}

        for (int i = 0; i <= 79; i++){
	    for (int k = 0; k <= 59; k++){
	        if (matrix[i][k] == -1){
		    g.setColor(Color.black);
		    g.fillRect(i*10, k*10, 10, 10);
		}
		if (matrix[i][k] == -2){
		    g.setColor(Color.green);
		    g.fillRect(i*10, k*10, 10, 10);
		}
		if (matrix[i][k] == -3){
		    g.setColor(Color.blue);
		    g.fillRect(i*10, k*10, 10, 10);
		}
		if (matrix[i][k] == -4){
		    g.setColor(Color.pink);
		    g.fillRect(i*10, k*10, 10, 10);
		}
		if (matrix[i][k] == zahl  && zahl_alt != zahl){
		    g.setColor(Color.red);
		    g.fillRect(i*10, k*10, 10, 10);
		    g.setColor(Color.white);
		    g.setFont(new Font("Arial Bold", 1, 10));
		    g.drawString("" + zahl,i*10+1,(k*10)+10-1);
		    g.setColor(Color.black);
		    g.drawRect(i*10, k*10, 9, 9);
		    zahl_alt = zahl;
		}
	    }
	}
	g.setFont(new Font("Arial", 0, 14));
	g.drawString("Wurm1: " + punkte1, 650, 30);
	g.drawString("Wurm2: " + punkte2, 650, 45);
    }

    public void nextLevel(){
        snake1.clear();
        snake2.clear();
	wachse1 = 0;
	wachse2 = 0;
	for (int i = 1; i <= 78 ; i++){
	    for (int k = 1; k <= 58; k++){
	         matrix[i][k] = 0;
	    }
	}

	mitte_x = MAX_X/10/2;
	mitte_y = MAX_Y/10/2;
	snake1.add(new PointElem(mitte_x-5,mitte_y+6));
	snake1.add(new PointElem(mitte_x-5,mitte_y+5));
	snake1.add(new PointElem(mitte_x-5,mitte_y+4));
	snake1.add(new PointElem(mitte_x-5,mitte_y+3));
	snake1.add(new PointElem(mitte_x-5,mitte_y+2));
	snake1.add(new PointElem(mitte_x-5,mitte_y+1));
	snake1.add(new PointElem(mitte_x-5,mitte_y));
	if (wurm2){
	    snake2.add(new PointElem(mitte_x+5,mitte_y+6));
	    snake2.add(new PointElem(mitte_x+5,mitte_y+5));
	    snake2.add(new PointElem(mitte_x+5,mitte_y+4));
	    snake2.add(new PointElem(mitte_x+5,mitte_y+3));
	    snake2.add(new PointElem(mitte_x+5,mitte_y+2));
	    snake2.add(new PointElem(mitte_x+5,mitte_y+1));
	    snake2.add(new PointElem(mitte_x+5,mitte_y));
	}

        switch (level){
	    case 1: Level1(); break;
	    case 2: Level2(); break;
	    case 3: Level3(); break;
	    case 4: Level4(); break;
	    case 5: Level5(); break;
	    case 6: Level6(); break;
	    case 7: Level7(); break;
	    default: timer.stop();
	}

	nextLevelConfirm = JOptionPane.showConfirmDialog(null, "Level " + level + " starten?");
	if (nextLevelConfirm == JOptionPane.YES_OPTION) {
	    timer.start();
	} else {
	    timer.stop();
	}
	anfang = true;
    }

    public void Level1(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level2(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;
	for (int i = 15; i <= 45; i++){ // Balken
	    matrix[55][i] = -1;
	    matrix[25][i] = -1;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level3(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 0; i <= 59; i++){ // Balken
	    matrix[55][i] = -1;
	    matrix[25][i] = -1;
	}
	for (int i = 25; i <= 35; i++){ // Loecher
	    matrix[55][i] = 0;
	    matrix[25][i] = 0;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level4(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 0; i <= 15; i++){ // Balken
	    matrix[20][i] = -1;
	    matrix[60][i] = -1;
	}
	for (int i = 45; i <= 59; i++){ // Balken
	    matrix[20][i] = -1;
	    matrix[60][i] = -1;
	}
	for (int i = 20; i <= 60; i++){ // Balken
	    matrix[i][15] = -1;
	    matrix[i][45] = -1;
	}
	for (int i = 37; i <= 43; i++){ // Löcher
	    matrix[i][15] = 0;
	    matrix[i][45] = 0;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level5(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 0; i <= 59; i++){ // Balken
	    matrix[70][i] = -1;
	    matrix[50][i] = -1;
	    matrix[30][i] = -1;
	    matrix[10][i] = -1;
	}
	for (int i = 25; i <= 35; i++){ // Loecher
	    matrix[70][i] = 0;
	    matrix[50][i] = 0;
	    matrix[30][i] = 0;
	    matrix[10][i] = 0;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level6(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 14; i <= 46; i++){ // Balken
	    matrix[16][i] = -1;
	    matrix[64][i] = -1;
	}
	for (int i = 18; i <= 62; i++){ // Balken
	    matrix[i][12] = -1;
	    matrix[i][48] = -1;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void Level7(){
        for (int i = 0; i <= 79; i++){ // Rand links+rechts
	    matrix[i][0] = -1;
	    matrix[i][59] = -1;
	}
	for (int i = 0; i <= 59; i++){ // Rand oben+unten
	    matrix[0][i] = -1;
	    matrix[79][i] = -1;
	}

	richtung1 = 2;
	richtung2 = 2;

	for (int i = 0; i <= 59; i+=2){ // Balken mit Löchern
	    matrix[30][i] = -1;
	}
	for (int i = 1; i <= 59; i+=2){ // Balken mit Löchern
	    matrix[50][i] = -1;
	}
	for (int i = 0; i < snake1.size(); i++){
	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
	}
	if (wurm2){
	    for (int i = 0; i < snake2.size(); i++){
	        matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
	    }
	}
    }

    public void keyPressed(KeyEvent e){
	if (e.getKeyCode() == KeyEvent.VK_RIGHT && richtung1 != 3){
	    richtung1 = 1;
	}
	if (e.getKeyCode() == KeyEvent.VK_UP && richtung1 != 4){
	    richtung1 = 2;
	}
	if (e.getKeyCode() == KeyEvent.VK_LEFT && richtung1 != 1){
	    richtung1 = 3;
	}
	if (e.getKeyCode() == KeyEvent.VK_DOWN && richtung1 != 2){
	    richtung1 = 4;
	}

	if (e.getKeyCode() == KeyEvent.VK_D && richtung2 != 3){
	    richtung2 = 1;
	}
	if (e.getKeyCode() == KeyEvent.VK_W && richtung2 != 4){
	    richtung2 = 2;
	}
	if (e.getKeyCode() == KeyEvent.VK_A && richtung2 != 1){
	    richtung2 = 3;
	}
	if (e.getKeyCode() == KeyEvent.VK_S && richtung2 != 2){
	    richtung2 = 4;
	}
    }
    public void keyTyped(KeyEvent e){}
    public void keyReleased(KeyEvent e){}


    private class TimerListener implements ActionListener{
        public void actionPerformed(ActionEvent event){
	    if (anfang){
	        zahl = 1;
		do {
	 	   x = (int)(Math.random() * MAX_X/10);
		    y = (int)(Math.random() * MAX_Y/10);
		} while(matrix[x][y] != 0);
		matrix[x][y] = zahl;
		anfang = false;
	    }
	    for (int i = 0; i <= 79; i++){
	        matrix_alt[i] = (int[])matrix[i].clone();
	    }
	    if (richtung1 == 1){
		x = ((PointElem)snake1.get(snake1.size()-1)).getX()+1;
		y = ((PointElem)snake1.get(snake1.size()-1)).getY();
		wachse1();
	    }
	    if (richtung1 == 2){
		x = ((PointElem)snake1.get(snake1.size()-1)).getX();
		y = ((PointElem)snake1.get(snake1.size()-1)).getY() - 1;
		wachse1();
	    }
	    if (richtung1 == 3){
		x = ((PointElem)snake1.get(snake1.size()-1)).getX()-1;
		y = ((PointElem)snake1.get(snake1.size()-1)).getY();
		wachse1();
	    }
	    if (richtung1 == 4){
	        x = ((PointElem)snake1.get(snake1.size()-1)).getX();
	        y = ((PointElem)snake1.get(snake1.size()-1)).getY() + 1;
		wachse1();
	    }

	    if(wurm2){
	        if (richtung2 == 1){
		    x = ((PointElem)snake2.get(snake2.size()-1)).getX()+1;
		    y = ((PointElem)snake2.get(snake2.size()-1)).getY();
		    wachse2();
	        }
	        if (richtung2 == 2){
		    x = ((PointElem)snake2.get(snake2.size()-1)).getX();
		    y = ((PointElem)snake2.get(snake2.size()-1)).getY()-1;
		    wachse2();
	        }
	        if (richtung2 == 3){
		    x = ((PointElem)snake2.get(snake2.size()-1)).getX()-1;
		    y = ((PointElem)snake2.get(snake2.size()-1)).getY();
		    wachse2();
	        }
	        if (richtung2 == 4){
	            x = ((PointElem)snake2.get(snake2.size()-1)).getX();
	            y = ((PointElem)snake2.get(snake2.size()-1)).getY()+1;
		    wachse2();
	        }
	    }
	    paint(getGraphics());
	}

	public void wachse1(){
	    PointElem p = new PointElem(x,y);
	    if(wachse1 == 0){
	        if (matrix[((PointElem)snake1.get(0)).getX()][((PointElem)snake1.get(0)).getY()] == -2){
	            matrix[((PointElem)snake1.get(0)).getX()][((PointElem)snake1.get(0)).getY()] = 0;
		}
	        if (matrix[((PointElem)snake1.get(0)).getX()][((PointElem)snake1.get(0)).getY()] == -4){
	            matrix[((PointElem)snake1.get(0)).getX()][((PointElem)snake1.get(0)).getY()] = -3;
		}
		snake1.remove(0);
	    } else {
		wachse1--;
	    }
	    if(matrix[x][y] == zahl){
		if (zahl == 9){
	            punkte1 += ADD_POINTS*2;
		    timer.stop();
		    level++;
		    if (level > MAX_LEVEL){
		        level = 1;
		    }
		    nextLevel();
		    return;
		} else {
	            punkte1 += ADD_POINTS;
		    wachse1 += WACHSE;
		    zahl_alt = zahl;
		    zahl++;
	            do {
	                x = (int)(Math.random() * MAX_X/10);
	    	        y = (int)(Math.random() * MAX_Y/10);
		    } while(matrix[x][y] != 0);
		    matrix[x][y] = zahl;
		}
	    }
	    if(matrix[x][y] == -1 || matrix[x][y] == -2 || matrix[x][y] == -4){
	        punkte1 -= (int)(snake1.size() * 5.0);
	        timer.stop();
		JOptionPane.showMessageDialog(null, "Wurm 1 ist tod!");
		for (int i = 0; i < snake1.size(); i++){
		    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = 0;
		}
		snake1.clear();
		snake1.add(new PointElem(mitte_x-5,mitte_y+6));
		snake1.add(new PointElem(mitte_x-5,mitte_y+5));
		snake1.add(new PointElem(mitte_x-5,mitte_y+4));
		snake1.add(new PointElem(mitte_x-5,mitte_y+3));
		snake1.add(new PointElem(mitte_x-5,mitte_y+2));
		snake1.add(new PointElem(mitte_x-5,mitte_y+1));
		snake1.add(new PointElem(mitte_x-5,mitte_y));
	        richtung1 = 2;
		wachse1 = 0;
	        timer.start();
		return;
	    }
	    snake1.add(p);
	    for (int i = 0; i < snake1.size(); i++){
	        if (matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] == -3){
	    	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -4;
		}
		if (matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] == 0) {
	    	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
		}
		if (matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] == zahl-1) {
	    	    matrix[((PointElem)snake1.get(i)).getX()][((PointElem)snake1.get(i)).getY()] = -2;
		}
	    }
	}

	public void wachse2(){
	    PointElem p = new PointElem(x,y);
	    if(wachse2 == 0){
	        if (matrix[((PointElem)snake2.get(0)).getX()][((PointElem)snake2.get(0)).getY()] == -3){
	            matrix[((PointElem)snake2.get(0)).getX()][((PointElem)snake2.get(0)).getY()] = 0;
		}
	        if (matrix[((PointElem)snake2.get(0)).getX()][((PointElem)snake2.get(0)).getY()] == -4){
	            matrix[((PointElem)snake2.get(0)).getX()][((PointElem)snake2.get(0)).getY()] = -2;
		}
		snake2.remove(0);
	    } else {
		wachse2--;
	    }
	    if(matrix[x][y] == zahl){
		if (zahl == 9){
	            punkte2 += ADD_POINTS*2;
		    timer.stop();
		    level++;
		    if (level > MAX_LEVEL){
		        level = 1;
		    }
		    nextLevel();
		    return;
		} else {
	            punkte2 += ADD_POINTS;
		    wachse2 += WACHSE;
		    zahl_alt = zahl;
		    zahl++;
	            do {
	                x = (int)(Math.random() * MAX_X/10);
	    	        y = (int)(Math.random() * MAX_Y/10);
		    } while(matrix[x][y] != 0);
		    matrix[x][y] = zahl;
		}
	    }
	    if(matrix[x][y] == -1 || matrix[x][y] == -3 || matrix[x][y] == -4){
	        punkte2 -= (int)(snake2.size() * 5.0);
	        timer.stop();
		JOptionPane.showMessageDialog(null, "Wurm 2 ist tod!");
	        for (int i = 0; i < snake2.size(); i++){
	            matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = 0;
	        }
		snake2.clear();
	        snake2.add(new PointElem(mitte_x+5,mitte_y+6));
	        snake2.add(new PointElem(mitte_x+5,mitte_y+5));
	        snake2.add(new PointElem(mitte_x+5,mitte_y+4));
	        snake2.add(new PointElem(mitte_x+5,mitte_y+3));
	        snake2.add(new PointElem(mitte_x+5,mitte_y+2));
	        snake2.add(new PointElem(mitte_x+5,mitte_y+1));
	        snake2.add(new PointElem(mitte_x+5,mitte_y));
	        richtung2 = 2;
		wachse2 = 0;
	        timer.start();
		return;
	    }
	    snake2.add(p);
	    for (int i = 0; i < snake2.size(); i++){
	        if (matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] == -2){
	    	    matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -4;
		}
		if (matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] == 0){
	    	    matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
		}
		if (matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] == zahl-1){
	    	    matrix[((PointElem)snake2.get(i)).getX()][((PointElem)snake2.get(i)).getY()] = -3;
		}
	    }
	}
    }

    private class PointElem{
        private int x, y;

        PointElem(int xVal, int yVal){
	    x = xVal;
	    y = yVal;
	}

	public int getX(){
	    return x;
	}

	public int getY(){
	    return y;
	}
    }
}
```


mfg
Christian


----------



## GagamehlO (24. Jun 2005)

Das ist echt mal ganz anders  :shock: 
Nur glaueb ich das bei deiner Variante das Double Buffering schwieriger oder
Performance aufwendiger wäre.

Aber nicht schlecht.....

> 600 Zeilen OmG  :shock: 


achja.... Double Buffering folgt demnächst.



mfg GagamehlO


----------



## SebiB90 (24. Jun 2005)

GagamehlO hat gesagt.:
			
		

> > 600 Zeilen OmG  :shock:


das ist ja noch klein, bei größeren projekten kannst du dich auf mehrere tausend zeilen code einstellen oder noch mehr.
und jetzt zu snake, bei mir wird das applet gar nicht geladen, da gibts immer ein fehler


----------



## Illuvatar (24. Jun 2005)

Um der Frage zuvorzukommen: Was für einer, SebiB90


----------



## Guest (26. Jun 2005)

mhm, bei mir klappt das eigentlich wunderbar und auch bei den anderen Leuten denen ich das scon gezeigt habe


----------



## Guest (1. Jul 2005)

So.... es ist jetzt doppel gepuffert
und besitzt jetzt ein paar Grafiken, wer es sich noch einmal anschauen möchte


<----SNAKE-BETA-VERSION---->


mfg GagamehlO


----------



## The_S (6. Jul 2005)

Nachdems allerweil vermutlich kult is Snake zu programmieren, will ich auch ma meinen Teil dazu Beitragen:

http://www.stefan-kiesel.gmxhome.de/temp/MiniSnake.jar

Handelst sich um ne Beta-Version!

bekannte Bugs:

- keine

to do liste:

- verschiedene Levels (Thx @ Illuvater für die Idee)
- Leveleditor
- Stufe 10

[edit] Achja, Spieler 1 wird mit den Pfeiltasten gesteuert und Spieler 2 mit wasd
In den Optionen kann man die Geschwindigkeit anpassen (Stufe), ob 1 oder 2 Spieler spiel gestartet werden soll und ob man durch die Wand kann


----------



## Guest (7. Jul 2005)

Auch sehr Nice!
MMn nur nen bisle zu langsam.
Abver das ist ja kein Thema.


----------



## The_S (7. Jul 2005)

Anonymous hat gesagt.:
			
		

> MMn nur nen bisle zu langsam.



Du kannst bei Optionen die Stufe (und somit Geschwindigkeit) einstellen. Oder ist dir die 9. Stufe auch zu langsam? Hab noch ne 10. Stufe eingebaut, ist aber noch net Online.

BTW: Danke fürs Feedback

[edit] Hab die Version geupdatet (Stufe 10 und 1 Bugfix)


----------

