Hallo!
Ich habe ein für mich unerklärliches Problem:
Ich bin gerade dabei ein Spiel zu programmieren, dass im Prizip so ist wie Snake. Der Spieler soll 3 Leben zu Beginn des Spiels haben. Wenn er gegen eine Wand läuft, soll ein Leben abgezogen werden... Dies passiert aber nicht. Das Spiel startet neu, ohne das ein Leben abgezogen wurde. Zudem wird der score wieder auf 0 gesetzt. Was mache ich falsch???
Danke schonmal für eure Hilfe!!!
Grüße
Meine bisherige Klasse:
Ich habe ein für mich unerklärliches Problem:
Ich bin gerade dabei ein Spiel zu programmieren, dass im Prizip so ist wie Snake. Der Spieler soll 3 Leben zu Beginn des Spiels haben. Wenn er gegen eine Wand läuft, soll ein Leben abgezogen werden... Dies passiert aber nicht. Das Spiel startet neu, ohne das ein Leben abgezogen wurde. Zudem wird der score wieder auf 0 gesetzt. Was mache ich falsch???
Danke schonmal für eure Hilfe!!!
Grüße
Meine bisherige Klasse:
Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*
* @author ADAC
*/
public class Spiel extends JPanel implements ActionListener
{
// Attribute festlegen; Spielbereich
private final int WIDTH = 300;
private final int HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 100;
// Array, in dem x-/y-Koordinaten der einzelnen "Teile" von Willie gespeichert werden
private int x[] = new int[ALL_DOTS];
private int y[] = new int[ALL_DOTS];
private int score = 0;
private int dots = 0;
private int lives = 0;
private int apfel_x;
private int apfel_y;
private int birne_x;
private int birne_y;
private int kirsche_x;
private int kirsche_y;
private int zeit = 0;
private int sek = 1;
//public long time = 0;
private boolean left = false;
private boolean right = true;
private boolean up = false;
private boolean down = false;
private boolean inGame = true;
private Timer timer;
private Image body;
private Image apfel;
private Image birne;
private Image kirsche;
private Image head;
/**
*
* @param z
*/
public Spiel()
{
addKeyListener(new TAdapter());
// Hintergrundfarbe des Spielfelds
setBackground(Color.white);
// Bilder einbinden, sodass später Äpfel, Birnen und der Wurm auf dem Spielfeld erscheinen
ImageIcon iid = new ImageIcon(this.getClass().getResource("koerper.png"));
body = iid.getImage();
ImageIcon iia = new ImageIcon(this.getClass().getResource("apfel.png"));
apfel = iia.getImage();
ImageIcon iib = new ImageIcon(this.getClass().getResource("birne.png"));
birne = iib.getImage();
ImageIcon iik = new ImageIcon(this.getClass().getResource("kirsche.png"));
kirsche = iik.getImage();
ImageIcon iih = new ImageIcon(this.getClass().getResource("kopf_hoch.png"));
head = iih.getImage();
timer = new Timer(DELAY, this);
timer.start();
setFocusable(true);
iniGame(); // ruft die Methode iniGame auf
}
public void move()
{
// Die einzelnen Körperteile rücken immer um eins weiter in Richtung Kopf
for (int z = dots; z > 0; z--)
{
x[z] = x[(z - 1)];
y[z] = y[(z - 1)];
}
// Wenn Kopf nach links bewegt wird,
if (left)
{
x[0] -= DOT_SIZE;
}
// Wenn Kopf nach rechts bewegt wird,
if (right)
{
x[0] += DOT_SIZE;
}
// Wenn Kopf nach oben bewegt wird,
if (up)
{
y[0] -= DOT_SIZE;
}
// Wenn Kopf nach unten bewegt wird,
if (down)
{
y[0] += DOT_SIZE;
}
}
private void iniLive() {
// Set direction
left = false;
right = true;
up = false;
down = false;
// Set worm length
dots = 3;
// Set worm body
for (int z = 0; z < dots; z++)
{
x[z] = 50 - z * 10;
y[z] = 50;
}
// Locate food
locateApple();
locateBirne();
locateKirsche();
inGame = true;
}
//
// Public Methods
//
/**
* Initialize new game
*/
public void iniGame() {
score = 0;
zeit = 0;
lives = 3;
iniLive();
}
public void paint(Graphics g)
{
super.paint(g);
if (inGame)
{
g.drawImage(birne, birne_x, birne_y, this);
g.drawImage(apfel, apfel_x, apfel_y, this);
g.drawImage(kirsche,kirsche_x, kirsche_y, this);
for (int z = 0; z < dots; z++)
{
if (z == 0)
g.drawImage(head, x[z], y[z], this);
else
g.drawImage(body, x[z], y[z], this);
}
Toolkit.getDefaultToolkit().sync();
g.dispose(); }
// } else
// {
// gameOver(g);
// }
}
public void gameOver(Graphics g)
{
String msg = "Game Over";
Font small = new Font("Helvetica", Font.BOLD, 20);
FontMetrics metr = this.getFontMetrics(small);
g.setColor(Color.black); // Farbe der Schrift
g.setFont(small);
g.drawString(msg, (WIDTH - metr.stringWidth(msg)) / 2, HEIGHT / 2);
}
public void checkApple()
{
if ((x[0] == apfel_x) && (y[0] == apfel_y))
{
dots++;
score += 10;
locateApple();
}
}
public void checkBirne()
{
if ((x[0] == birne_x) && (y[0] == birne_y))
{
dots++;
score+= 15;
locateBirne();
}
}
public void checkKirsche()
{
if ((x[0] == kirsche_x) && (y[0] == kirsche_y))
{
dots++;
score+= 20;
locateKirsche();
}
}
/**
* Es wird geprüft, ob Willie gegen die Spielfeldbegrenzung oder gegen sich selber stößt.
*/
public void checkCollision()
{
boolean tot = false;
for (int z = dots; z > 0; z--)
{
if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z]))
{
tot = true;
// inGame = false;
}
}
// Wenn Willie oben oder unten gegen die Spielfeldbegrenzung stößt, ist das Spiel vorbei.
if (y[0] > HEIGHT)
{
tot = true;
//inGame = false;
}
if (y[0] < 0)
{
tot = true;
//inGame = false;
}
// Wenn Willie rechts oder links gegen die Spielfeldbegrenzung stößt, ist das Spiel vorbei.
if (x[0] > WIDTH)
{
tot = true;
}
if (x[0] < 0)
{
tot = true;
}
if (tot)
{
lives--;
if (lives > 0)
{
iniGame();
}
else
{
inGame = false;
gameOver(null);
}
}
}
public void locateApple()
{
int r = (int) (Math.random() * RAND_POS);
apfel_x = ((r * DOT_SIZE));
r = (int) (Math.random() * RAND_POS);
apfel_y = ((r * DOT_SIZE));
}
public void locateBirne()
{
int r = (int) (Math.random() * RAND_POS);
birne_x = ((r * DOT_SIZE));
r = (int) (Math.random() * RAND_POS);
birne_y = ((r * DOT_SIZE));
}
public void locateKirsche()
{
int r = (int) (Math.random() * RAND_POS);
kirsche_x = ((r * DOT_SIZE));
r = (int) (Math.random() * RAND_POS);
kirsche_y = ((r * DOT_SIZE));
}
public void actionPerformed(ActionEvent e)
{
if (inGame)
{
checkApple();
checkBirne();
checkKirsche();
checkCollision();
move();
Snake.punkte(score);
Snake.leben(lives);
if(sek%10 == 0)
{
zeit += 1;
Snake.zeitAktualisieren(zeit);
sek += 1;
}
else
{
sek += 1;
}
}
repaint();
}
//public void zeitAktualisieren(int zeit)
//{
//zeit = DELAY / 1000;
//System.out.println(zeit);
//}
private class TAdapter extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
// Wenn auf Tastatur Pfeil nach links gedrueckt wird und nicht nach rechts,
//laeuft Willi auch nur nach links und nicht nach oben oder nach unten;
//und nach rechts schon gar nicht.
if ((key == KeyEvent.VK_LEFT) && (!right))
{
left = true;
up = false;
down = false;
}
// Wenn auf Tastatur Pfeil nach rechts gedrueckt wird und nicht nach links,
//laeuft Willi auch nur nach rechts und nicht nach oben oder nach unten;
//und nach links schon gar nicht.
if ((key == KeyEvent.VK_RIGHT) && (!left))
{
right = true;
up = false;
down = false;
}
// Wenn auf Tastatur Pfeil nach oben gedrueckt wird und nicht nach unten,
//laeuft Willi auch nur nach oben und nicht nach links oder nach rechts;
//und nach unten schon gar nicht.
if ((key == KeyEvent.VK_UP) && (!down))
{
up = true;
right = false;
left = false;
}
// Wenn auf Tastatur Pfeil nach unten gedrueckt wird und nicht nach
// oben, laeuft Willi auch nur nach unten und nicht nach links oder nach
// rechts; und nach oben schon gar nicht.
if ((key == KeyEvent.VK_DOWN) && (!up))
{
down = true;
right = false;
left = false;
}
}
}
}