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