Hallo,
Ich hab vor kurzem mein Game of Life in GUI umgesetzt und mir jetzt gedacht, das ich ein snake spiel machen könnte...
Teilweise funktioniert es auch schon, ich hab nur ein Problem, das ich gerne gelößt hätte, befor ich weitermache...
und zwar hab ich mir überlegt, das ich immer im Hintergrund ein 2D Stringarray habe, in dem ich
mein Spielfeld aufbaue, und die random Punkte spawne, befor ich das dann in GUI umsetzte.
Das was nicht funktioniert ist aber, das ich, wenn ich mich in der GUI an den Punkt bewege, wo das "Futter" angezeigt wird, man sich im Array nicht mit dem Kopf der Schlange an dem "Futterpunkt" befindet.
Ich hab mal eine Konsolenausgabe eingefügt, bei der man sieht, das sich das Futter auf einem Ganz anderen Punkt befindet als in der GUI angezeigt wird. Woran liegt das, und wie kann ich das ändern?
Klasse 1: (zum Erstellen vom Array)
Klasse 2 (für die Anzeige)
Und meine dritte Klasse
Ich hab vor kurzem mein Game of Life in GUI umgesetzt und mir jetzt gedacht, das ich ein snake spiel machen könnte...
Teilweise funktioniert es auch schon, ich hab nur ein Problem, das ich gerne gelößt hätte, befor ich weitermache...
und zwar hab ich mir überlegt, das ich immer im Hintergrund ein 2D Stringarray habe, in dem ich
mein Spielfeld aufbaue, und die random Punkte spawne, befor ich das dann in GUI umsetzte.
Das was nicht funktioniert ist aber, das ich, wenn ich mich in der GUI an den Punkt bewege, wo das "Futter" angezeigt wird, man sich im Array nicht mit dem Kopf der Schlange an dem "Futterpunkt" befindet.
Ich hab mal eine Konsolenausgabe eingefügt, bei der man sieht, das sich das Futter auf einem Ganz anderen Punkt befindet als in der GUI angezeigt wird. Woran liegt das, und wie kann ich das ändern?
Klasse 1: (zum Erstellen vom Array)
Java:
package snake;
public class SpielfeldAufbau {
int x = 20;
int y = 20;
private boolean starterfolgt = false;
private boolean punktGegessen = true;
String[][] spielfeld;
public int anzahlPunkte = 0;
public static int yKoordinate = 10;
public static int xKoordinate = 10;
public String[][] spielfeld() {
if (!starterfolgt) {
spielfeld = new String[x][y];
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
spielfeld[i][j] = " ";
}
}
spielfeld[xKoordinate][yKoordinate] = ">";
starterfolgt = true;
}
String[][] uebergangsspielfeld = new String[x][y];
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
uebergangsspielfeld[i][j] = spielfeld[i][j];
}
}
spielfeld[xKoordinate][yKoordinate] = ">";
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if(spielfeld[i][j].equals(">") && uebergangsspielfeld[i][j].equals("O")) {
spielfeld[i][j]=">";
punktGegessen = true;
anzahlPunkte++;
}
if(uebergangsspielfeld[i][j].equals(">")) {
uebergangsspielfeld[i][j]=" ";
}
}
}
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
spielfeld[i][j] = uebergangsspielfeld[i][j];
}
}
spielfeld[xKoordinate][yKoordinate] = ">";
if (punktGegessen) {
spielfeld[(int) (Math.random() * x)][(int) (Math.random() * y)] = "O";
punktGegessen = false;
}
for (int i=0; i<x; i++) {
for (int j=0; j<y; j++) {
System.out.print(spielfeld[i][j] + " ");
if (j == (x-1)) {
System.out.println("");
}
}
}
return spielfeld;
}
}
Java:
package snake;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class View extends JFrame {
private static final long serialVersionUID = 1L;
public static View instance = null;
private JPanel gamePanel = new JPanel();
private BufferedImage img;
public BufferedImage getImg() {
return img;
}
public void setImg(BufferedImage img) {
this.img = img;
repaint();
}
public static View getInstance() {
if (instance == null)
instance = new View();
return instance;
}
private View() {
super("Snake");
instance = this;
setDefaultCloseOperation(EXIT_ON_CLOSE);
JButton stopButton = new JButton("Stop");
stopButton.setBounds(0, 400, 50, 50);
setContentPane(gamePanel);
setSize(428, 469);
setLocation(300, 300);
setVisible(true);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
SpielfeldAufbau.xKoordinate --;
}
if (key == KeyEvent.VK_RIGHT) {
SpielfeldAufbau.xKoordinate ++;
}
if (key == KeyEvent.VK_UP) {
SpielfeldAufbau.yKoordinate --;
}
if (key == KeyEvent.VK_DOWN) {
SpielfeldAufbau.yKoordinate ++;
}
}
@Override
public void keyReleased(KeyEvent e) {
// int key = e.getKeyCode();
// if (key == KeyEvent.VK_LEFT) {
// }
// if (key == KeyEvent.VK_RIGHT) {
// }
// if (key == KeyEvent.VK_UP) {
// }
// if (key == KeyEvent.VK_DOWN) {
// }
}
});
Thread t = new Thread(new Logic());
t.start();
}
public void paint(Graphics g) {
g.drawImage(img, 9, 30, 409, 430, new ImageObserver() {
@Override
public boolean imageUpdate(Image arg0, int arg1, int arg2,
int arg3, int arg4, int arg5) {
// TODO Auto-generated method stub
return true;
}
});
}
public static void main(String[] args) {
View.getInstance();
}
}
Java:
package snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
public class Logic implements Runnable {
String[][] logicSpielfeld = null;
private BufferedImage img = new BufferedImage(400, 400,
BufferedImage.TYPE_INT_ARGB);
@Override
public void run() {
SpielfeldAufbau game = new SpielfeldAufbau();
while (true) {
try {
logicSpielfeld = game.spielfeld();
} catch (NumberFormatException e2) {
e2.printStackTrace();
}
Graphics g = img.getGraphics();
g.setColor(Color.CYAN);
g.fillRect(0, 0, 400, 400);
try {
for (int i = 0; i < game.y; i++) {
for (int j = 0; j < game.x; j++) {
if (logicSpielfeld[i][j].equals(">")) {
g.setColor(Color.blue);
g.fillOval(i * 20, j * 20, 15, 15);
}
if (logicSpielfeld[j][i].equals("O")) {
g.setColor(Color.RED);
g.fillOval(i * 20, j * 20, 10, 10);
}
}
}
g.setColor(Color.BLACK);
g.drawString(game.anzahlPunkte + "", 0, 400);
} catch (NumberFormatException e1) {
e1.printStackTrace();
}
View.getInstance().setImg(img);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Zuletzt bearbeitet: