//Snake
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
import java.util.*;
import javax.swing.*;
public class Snake extends JApplet, extends Applet implements Runnable, MouseListener
{
// Initialisierung der Variablen
int appletsize_x = 600; // Größe des Applets in x - Richtung
int appletsize_y = 600; // Größe des Applets in y - Richtung
//
int x_pos = appletsize_x / 2; // x - Position des Balles
int y_pos = appletsize_y / 2; // y - Position des Balles
int x_speed = 0; // Geschwindigkeit des Balles in x - Richtung
int y_speed = 0; // Geschwindigkeit des Balles in y - Richtung
public int getX_speed()
{
return x_speed;
}
public void setX_speed(int x_speed)
{
this.x_speed = x_speed;
}
public int getY_speed()
{
return y_speed;
}
public void setY_speed(int y_speed)
{
this.y_speed = y_speed;
}
int speed = 2;
int radius = 15; // Radius des Balles
int pause = 10;
//
int x_beweg;
int y_beweg;
int x_be_speed = 0;
int y_be_speed = 0;
int be_speed = 1;
int b_beweg = 38;
int h_beweg = 32;
int[] x_be;
int[] y_be;
int anzahl_be_punkte = 6;
//
//Zufallszahl
Random zufallspos = new Random();
Punkte punkte = new Punkte();
Futter futter = new Futter();
// Variablen für die Doppelpufferung
private Image dbImage;
private Graphics dbg;
JButton button = new JButton("Mausereignisse");
JLabel l = new JLabel();
// Konstruktor des Applets
public Snake()
{
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
//Komponenten hinzufuegen
cp.add(button,BorderLayout.NORTH);
cp.add(l,BorderLayout.SOUTH);
button.addMouseListener(this);
}
public void init()
{
setBackground (Color.blue);
}
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel läuft
Thread th = new Thread (this);
// Starten des Threads
th.start ();
//System.out.println("start : Start");
}
public void stop()
{
}
public void destroy()
{
}
/* Diese Methode fängt das Ereigniss auf, das beim Drücken einer Keyboardtaste entsteht.
Die Tasten Cursor links, rechts und die Space Taste haben dabei eine bestimmte Bedeutung.
Wird eine andere Taste gedrückt, so wird ihr Integerwert in die Standardausgabe geschrieben. */
public boolean keyDown (Event e, int key)
{
//System.out.println("start : keyDown");
// linke Cursortaste
if (key == Event.LEFT)
{
// Ball bewegt sich dann nach links
x_speed = -speed;
y_speed = 0;
}
// rechte Cursortaste
else if (key == Event.RIGHT)
{
// Ball bewegt sich dann nach rechts
x_speed = speed;
y_speed = 0;
}
// hoch
else if (key == 1004)//1004 = hoch
{
// Ball bewegt sich dann nach links
y_speed = -speed;
x_speed = 0;
}
// runter
else if (key == 1005)//1005 = runter
{
// Ball bewegt sich dann nach rechts
y_speed = speed;
x_speed = 0;
}
// SpaceBar hat Wert 32
else if (key == 32)
{
x_speed = 0;
y_speed = 0;
}
else
{
// Ausgabe von gedrüktem Key und Zahlenwert an die Standardausgabe
System.out.println ("Charakter: " + (char)key + " Integer Value: " + key);
}
//System.out.println("nach Cursor : " + x_speed + " , " + y_speed);
//System.out.println("finish : keyDown");
return true;
}
public void mouseClicked(MouseEvent e)
{
l.setText("Maustaste gedrückt");
}
public void mousePressed(MouseEvent e)
{
l.setText("Schaltfläche gedrückt");
}
public void mouseReleased(MouseEvent e)
{
l.setText("Schaltfläche gedrückt");
}
public void mouseEntered(MouseEvent e)
{
l.setText("Maustaste gedrückt halten");
}
public void mouseExited(MouseEvent e)
{
l.setText("Maustaste losgelassen");
}
/*System.out.println("mouseDown start");
// Wenn Spiel noch nicht gestartet ist, oder wieder gestartet wird
//if (e.getClickCount () == 2)
//{
// Alle wichtigen Werte zurücksetzen
punkte.setEnd(0);
init ();*/
public void run ()
{
//System.out.println("start : run");
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
System.out.println("run : " + x_speed + " , " + y_speed);
// Zufallsort des Futters
futter.Zufallspos_X(appletsize_x, appletsize_y);
futter.Zufallspos_Y(appletsize_x, appletsize_y);
// Zufallsort der Punkte
punkte.Zufallspos_X(appletsize_x, appletsize_y);
punkte.Zufallspos_Y(appletsize_x, appletsize_y);
// Zufallsort der beweglichen Punkte
x_be = new int[anzahl_be_punkte];
//while(true)
//{
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
x_be[i] = zufallspos.nextInt(appletsize_x - punkte.getBreite());
System.out.println("bewegliche Punkte x: " + x_be[i]);
}
y_be = new int[anzahl_be_punkte];
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
y_be[i] = zufallspos.nextInt(appletsize_x - punkte.getHöhe());
System.out.println("bewegliche Punkte y: " + y_be[i]);
//return false;
}
//for(int i=0; i<=anzahl_be_punkte -1; i++)
//{
// if((appletsize_y / 2) + radius <=y_be[i]<= (appletsize_y / 2) - h_beweg && (appletsize_x / 2) - b_beweg<= x_be[i]<= (appletsize_x / 2) + radius)
// {
// return true;
// }
//}
//}
// Zufallsrichtung der beweglichen Punkte
final int N = 0;
final int NO = 1;
final int O = 2;
final int SO = 3;
final int S = 4;
final int SW = 5;
final int W = 6;
final int NW = 7;
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
//x_futter = zufallspos.nextInt(7);
}
x_be_speed = be_speed;
// Solange 0 ist läuft der Thread weiter
while (punkte.getEnd() == 0)
{
int loop =0;
loop++;
//System.out.println("while start " + loop);
// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (x_pos > appletsize_x - radius)
{
// Ändern der Richtung des Balles
x_speed = -speed;
}
// Ball brührt linken Rand und prallt ab
else if (x_pos < radius)
{
// Ändern der Richtung des Balles
x_speed = +speed;
}
// Verändern der x- Koordinate
x_pos += x_speed;
// Wenn der Ball den unteren Rand berührt, dann prallt er ab
if (y_pos > appletsize_y - radius)
{
// Ändern der Richtung des Balles
y_speed = -speed;
}
// Ball brührt oberen Rand und prallt ab
else if (y_pos < radius)
{
// Ändern der Richtung des Balles
y_speed = +speed;
}
// Verändern der y- Koordinate
y_pos += y_speed;
x_speed = punkte.Punkte_erkennen1(x_pos, y_pos, radius, x_speed, y_speed);
y_speed = punkte.Punkte_erkennen2(x_pos, y_pos, radius, x_speed, y_speed);
// Futter erkennen
futter.Futter_erkennen(x_pos, y_pos, radius, x_speed, y_speed, appletsize_x, appletsize_y);
// Bewegliche Punkte Erkennen
for (int i=0; i<=anzahl_be_punkte -1; i++)
{
x_beweg = x_be[i];
y_beweg = y_be[i];
if ( (x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_beweg && x_pos + radius <= x_beweg + b_beweg && y_pos >= y_beweg && y_pos <= y_beweg + b_beweg ||
x_pos >= x_beweg && x_pos <= x_beweg + b_beweg && y_pos - radius >= y_beweg && y_pos - radius <= y_beweg + b_beweg ||
x_pos - radius >= x_beweg && x_pos - radius <= x_beweg + b_beweg && y_pos >= y_beweg && y_pos <= y_beweg + b_beweg ||
x_pos >= x_beweg && x_pos <= x_beweg + b_beweg && y_pos + radius >= y_beweg && y_pos + radius <= y_beweg + b_beweg )
{
//System.out.println("start : punkteerkennen1 if anweisung");
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -3;
}
if (x_speed > 0)
{
x_pos = x_pos +3;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -3;
}
if (y_speed > 0)
{
y_pos = y_pos +3;
}
}
System.out.println("Dead! beweg");
}
}
// x_be_speed = be_speed;
for(int i=0;i <= anzahl_be_punkte -1; i++)
{
// Wenn der bewegliche Punkt den rechten Rand berührt, dann prallt er ab
if (x_be[i] > appletsize_x - b_beweg)
{
// Ändern der Richtung des Balles
x_be_speed = -be_speed;
}
// bewegliche Punkt brührt linken Rand und prallt ab
else if (x_be[i] < 0)
{
// Ändern der Richtung des Balles
x_be_speed = +be_speed;
}
// Verändern der x- Koordinate
//for(int i=0;i <= anzahl_be_punkte -1; i++)
//{
x_be[i] += x_be_speed;
//}
// Wenn der Ball den unteren Rand berührt, dann prallt er ab
if (y_be[i] > appletsize_y - h_beweg)
{
// Ändern der Richtung des Balles
y_be_speed = -be_speed;
}
// Ball brührt oberen Rand und prallt ab
else if (y_be[i] < 0)
{
// Ändern der Richtung des Balles
y_be_speed = +be_speed;
}
// Verändern der y- Koordinate
//for(int i=0;i <= anzahl_be_punkte -1; i++)
//{
y_beweg += y_be_speed;
//}
}
// Neuzeichnen des Applets
repaint();
try
{
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep (pause);
}
catch (InterruptedException ex)
{
// do nothing
}
//System.out.println("while end " + loop);
// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
//System.out.println("start : update");
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund löschen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
//System.out.println("finish : update");
}
public void paint (Graphics g)
{
if (punkte.getEnd() == 0)
{
//System.out.println("start : paint");
System.out.println("futter : " + futter.getFressen());
System.out.println("punkte : " + punkte.getCount());
// Kugel
g.setColor (Color.red);
g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
// Punkte
for(int i=0; i<= punkte.getAnzahl_punkte() -1; i++)
{
g.setColor (Color.black);
g.fillRect (punkte.getX_p(i),punkte.getY_p(i),punkte.getBreite(),punkte.getHöhe());
}
// Beweglichen Punkte
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
g.setColor (Color.pink);
g.fillRect (x_be[i], y_be[i],b_beweg,h_beweg);
}
//Futter
g.setColor (Color.yellow);
g.fillRect (futter.getX_futter(), futter.getY_futter(),futter.getB_futter(),futter.getH_futter());
g.setColor (Color.yellow);
g.drawString ("Score: " + futter.getFressen(), 10, 40);
g.drawString ("Lives: " + punkte.getCount(), 300, 40);
}
else
{
setBackground (Color.black);
g.setColor (Color.yellow);
// Erreichte Punkte und game over
g.drawString ("Game over!", 130, 100);
g.drawString ("You scored " + futter.getFressen() + " Points!", 90, 140);
// Bewertung der Punkte
if (futter.getFressen() < 3) g.drawString ("Well, it could be better!", 100, 190);
else if (futter.getFressen() < 6 && futter.getFressen() >= 3) g.drawString ("That was not so bad", 100, 190);
else if (futter.getFressen() < 9 && futter.getFressen() >= 6) g.drawString ("That was really good", 100, 190);
else if (futter.getFressen() < 12 && futter.getFressen() >= 9) g.drawString ("You seem to be very good!", 90, 190);
else if (futter.getFressen() < 15 && futter.getFressen() >= 12) g.drawString ("That was nearly perfect!", 90, 190);
else if (futter.getFressen() >= 15) g.drawString ("You are the Champingon!",100, 190);
//g.drawString ("Doubleclick on the Applet, to play again!", 20, 220);
//isStoped = true; // Zurücksetzen der isStoped Variablen, um wieder neu beginnen zu können
}
}
}
class Punkte
{
private int x_punkt; // Punkte
private int y_punkt;
private int breite; // breite der Punkte
private int höhe; // Höhe der Punkte
private int[] x_p;
private int[] y_p;
private int anzahl_punkte = 20;
private int count;
private int end;
//Zufallszahl
Random zufallsort = new Random();
//Konstruktor
public Punkte()
{
//System.out.println("start : Punkte.konstruktor");
x_punkt = 0; // Punkte
y_punkt = 0;
breite = 48; // breite der Punkte
höhe = 48; // Höhe der Punkte
anzahl_punkte = 10;
count = 10;
end = 0;
//System.out.println("finish : Punkte.konstruktor");
}
//get_set methoden
public int getX_punkt()
{
return x_punkt;
}
public void setX_punkt(int x_punkt)
{
this.x_punkt = x_punkt;
}
public int getY_punkt()
{
return y_punkt;
}
public void setY_punkt(int y_punkt)
{
this.y_punkt = y_punkt;
}
public int getBreite()
{
return breite;
}
public void setBreite(int breite)
{
this.breite = breite;
}
public int getHöhe()
{
return höhe;
}
public void setHöhe(int höhe)
{
this.höhe = höhe;
}
public int getX_p(int i)
{
return x_p[i];
}
public void setX_p(int[] x_p)
{
this.x_p = x_p;
}
public int getY_p(int i)
{
return y_p[i];
}
public void setY_p(int[] y_p)
{
this.y_p = y_p;
}
public int getAnzahl_punkte()
{
return anzahl_punkte;
}
public void setAnzahl_punkte(int anzahl_punkte)
{
this.anzahl_punkte= anzahl_punkte;
}
public int getCount()
{
return count;
}
public void setCount(int count)
{
this.count = count;
}
public int getEnd()
{
return end;
}
public void setEnd(int end)
{
this.end = end;
}
public int[] Zufallspos_X(int appletsize_x, int appletsize_y)
{
//System.out.println("start : zufallspos_X");
x_p = new int[anzahl_punkte];
for(int i=0; i<=anzahl_punkte -1; i++)
{
x_p[i] = zufallsort.nextInt(appletsize_x - breite);
System.out.println("Punkte x: " + x_p[i]);
}
//System.out.println("finish : Zufallspos_X");
return x_p;
}
public int[] Zufallspos_Y(int appletsize_x, int appletsize_y)
{
//System.out.println("start : zufallspos_Y");
y_p = new int[anzahl_punkte];
for(int i=0; i<=anzahl_punkte -1; i++)
{
y_p[i] = zufallsort.nextInt(appletsize_x - höhe);
System.out.println("Punkte y: " + y_p[i]);
}
//System.out.println("finish : Zufallspos_Y");
return y_p;
}
public int Punkte_erkennen1(int x_pos, int y_pos, int radius, int x_speed, int y_speed)
{
//System.out.println("start : punkteerkennen1");
// Punkte erkennen
for (int i=0; i<=anzahl_punkte -1; i++)
{
x_punkt = getX_p(i);
y_punkt = getY_p(i);
if ( (x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_punkt && x_pos + radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos - radius >= y_punkt && y_pos - radius <= y_punkt + breite ||
x_pos - radius >= x_punkt && x_pos - radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos + radius >= y_punkt && y_pos + radius <= y_punkt + breite )
{
//System.out.println("start : punkteerkennen1 if anweisung");
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -2;
}
if (x_speed > 0)
{
x_pos = x_pos +2;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -2;
}
if (y_speed > 0)
{
y_pos = y_pos +2;
}
}
//System.out.println("Dead!");
police();
}
}
//System.out.println("finish : punkteerkennen1");
return x_speed;
}
public int Punkte_erkennen2(int x_pos, int y_pos, int radius, int x_speed, int y_speed)
{
//System.out.println("start : punkteerkennen2");
// Punkte erkennen
for (int i=0; i<=anzahl_punkte -1; i++)
{
x_punkt = x_p[i];
y_punkt = y_p[i];
if ( (x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_punkt && x_pos + radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos - radius >= y_punkt && y_pos - radius <= y_punkt + breite ||
x_pos - radius >= x_punkt && x_pos - radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos + radius >= y_punkt && y_pos + radius <= y_punkt + breite )
{
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -2;
}
if (x_speed > 0)
{
x_pos = x_pos +2;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -2;
}
if (y_speed > 0)
{
y_pos = y_pos +2;
}
}
//System.out.println("Dead!");
}
}
//System.out.println("finish : punkteerkennen21");
return y_speed;
}
public void police()
{
count--;
System.out.println("Police");
if(count == 0)
{
end();
}
setCount(count);
}
public void end()
{
System.out.println("end");
end = 1;
setEnd(end);
}
}