Hallo liebes Java-forum,
ich bastel schon seit einigen Tagen an meinem Snake Programm herum, was im großen und ganzen auch funktioniert.
Nur beim neu starten hab ich Probleme. ;(
Und zwar klappt in der ersten Runde spielen alles. Dann erscheint ein neues Fenster ob man weiterspielen will. Die zweite Runde klappt auch, nur wenn ich dann zum zweiten mal weiterspielen will, dann ruft mein Programm 2x die Methode button() auf und deshalb verliert man automatisch.
ich habe keine Ahnung warum diese Methode (nur nach/ab dem 2. mal ausführen!!) doppelt ausgeführt wird
ich habe extra an ein paar stellen System.out.println aufrufe gemacht um zu sehen was schief läuft und da hab ich gesehen das beim zweiten Aufruf der button() Methode, diese doppelt aufgerufen wird.
Hier mal mein Code, zuerst das Start Fenster
und hier der eigentliche Frame:
jetzt der "Screen", auf dem gezeichnet wird
Und die Probleme machende "Neustart" Klasse
und dann noch die Apple und Snake Klassen
Ich hoffe ihr könnt mir helfen ich komme nämlich seit Tagen nicht weiter ;( ;( ;(
ich bastel schon seit einigen Tagen an meinem Snake Programm herum, was im großen und ganzen auch funktioniert.
Nur beim neu starten hab ich Probleme. ;(
Und zwar klappt in der ersten Runde spielen alles. Dann erscheint ein neues Fenster ob man weiterspielen will. Die zweite Runde klappt auch, nur wenn ich dann zum zweiten mal weiterspielen will, dann ruft mein Programm 2x die Methode button() auf und deshalb verliert man automatisch.
ich habe keine Ahnung warum diese Methode (nur nach/ab dem 2. mal ausführen!!) doppelt ausgeführt wird
ich habe extra an ein paar stellen System.out.println aufrufe gemacht um zu sehen was schief läuft und da hab ich gesehen das beim zweiten Aufruf der button() Methode, diese doppelt aufgerufen wird.
Hier mal mein Code, zuerst das Start Fenster
Java:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class StartFrame implements ActionListener {
static int schwierigkeit = 50;
static boolean running = false;
static int score = 0;
static JFrame frameStart = new JFrame();
static JPanel pnSouth = new JPanel();
static JLabel bild = new JLabel();
static JLabel lbStart = new JLabel("Snake");
static JButton btLeicht = new JButton("Leicht");
static JButton btMittel = new JButton("Mittel");
static JButton btSchwer = new JButton("Schwer");
static Font ft1 = new Font("Arial", Font.BOLD, 30);
static Frame sFrame = new Frame();
static Restart sRestart = new Restart();
public static void main(String[] args) {
StartFrame start = new StartFrame();
start.startFrame();
}
public void startFrame() {
bild = new JLabel(new ImageIcon(getClass().getResource("/h1.jpg")));
frameStart.setLayout(new BorderLayout());
frameStart.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameStart.setSize(680,600);
frameStart.setTitle("Snake");
frameStart.setLocationRelativeTo(null);
frameStart.setResizable(false);
frameStart.add(lbStart, BorderLayout.NORTH);
frameStart.add(bild);
frameStart.add(pnSouth, BorderLayout.SOUTH);
pnSouth.add(btLeicht, BorderLayout.WEST);
pnSouth.add(btMittel, BorderLayout.CENTER);
pnSouth.add(btSchwer, BorderLayout.EAST);
lbStart.setHorizontalAlignment(JLabel.CENTER);
lbStart.setFont(ft1);
btLeicht.addActionListener(this);
btMittel.addActionListener(this);
btSchwer.addActionListener(this);
frameStart.setVisible(true);
}
public void button() {
frameStart.remove(lbStart);
frameStart.remove(btLeicht);
frameStart.remove(btMittel);
frameStart.remove(btSchwer);
frameStart.remove(bild);
frameStart.setVisible(false);
frameStart.dispose();
sFrame.frame();
}
public void actionPerformed(ActionEvent e) {
Object cmd = e.getSource();
if(cmd == btLeicht) {
button();
schwierigkeit = 20;
}
if(cmd == btMittel) {
button();
schwierigkeit = 10;
}
if(cmd == btSchwer) {
button();
schwierigkeit = 7;
}
}
}
und hier der eigentliche Frame:
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class Frame implements ActionListener {
JFrame frame = new JFrame();
JMenuBar menubar = new JMenuBar();
JPanel pnStart = new JPanel();
JPanel pnBuchstaben = new JPanel();
JPanel pnCenter = new JPanel();
JPanel pnPlatzhalterSued = new JPanel();
JPanel pnPlatzhalterNord = new JPanel();
JMenu menu1 = new JMenu("Snake");
JMenu menu2 = new JMenu("Spiel");
JMenu menu3 = new JMenu("Hilfe");
JMenuItem menu1_item1 = new JMenuItem("Über Snake");
JMenuItem menu1_item2 = new JMenuItem("Credits");
JMenuItem menu1_item3 = new JMenuItem("Snake beenden");
JMenuItem menu2_item1 = new JMenuItem("Neustart");
JMenuItem menu2_item2 = new JMenuItem("Schwer");
JMenuItem menu2_item3 = new JMenuItem("Leicht");
JMenuItem menu3_item1 = new JMenuItem("How To: Snake");
JMenuItem menu3_item2 = new JMenuItem("Fehler melden");
JMenuItem menu3_item3 = new JMenuItem("String");
public void frame() {
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 844);
frame.setTitle("Snake");
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.add(menubar, BorderLayout.NORTH);
frame.add(pnCenter, BorderLayout.CENTER);
Screen sScreen = new Screen();
frame.add(sScreen);
menuBarInit();
frame.setVisible(true);
}
public void menuBarInit()
{
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
menu1.add(menu1_item1);
menu1.add(menu1_item2);
menu1.add(menu1_item3);
menu2.add(menu2_item1);
menu2.add(menu2_item2);
menu2.add(menu2_item3);
menu3.add(menu3_item1);
menu3.add(menu3_item2);
menu3.add(menu3_item3);
menu1_item1.addActionListener(this);
menu1_item2.addActionListener(this);
menu1_item3.addActionListener(this);
menu2_item1.addActionListener(this);
menu2_item2.addActionListener(this);
menu2_item3.addActionListener(this);
menu3_item1.addActionListener(this);
menu3_item2.addActionListener(this);
menu3_item3.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
Object cmd = e.getSource();
Menu start = new Menu();
if(cmd == menu1_item1) {
start.menu1_item1();
}
if(cmd == menu1_item2) {
start.menu1_item2();
}
if(cmd == menu1_item3) {
start.menu1_item3();
}
if(cmd == menu2_item1) {
start.menu2_item1();
}
if(cmd == menu2_item2) {
start.menu2_item2();
}
if(cmd == menu2_item3) {
start.menu2_item3();
}
if(cmd == menu3_item1) {
start.menu3_item1();
}
if(cmd == menu3_item2) {
start.menu3_item2();
}
if(cmd == menu3_item3) {
start.menu3_item3();
}
}
}
jetzt der "Screen", auf dem gezeichnet wird
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JPanel;
public class Screen extends JPanel implements Runnable {
private static final long serialVersionUID = 1L;
private static final int WIDTH = 800;
private static final int HEIGHT = 800;
private int xCoor = 10, yCoor = 10;
private int size = 5;
private int ticks = 0;
private boolean right = true, left = false, up = false, down = false;
private Thread thread;
private Body b;
private ArrayList<Body> snake;
private Apple apple;
private ArrayList<Apple> apples;
private Random r;
private Key key;
public Screen() {
setFocusable(true);
key = new Key();
addKeyListener(key);
r = new Random();
snake = new ArrayList<Body>();
apples = new ArrayList<Apple>();
System.out.println("Screen()");
start();
}
public void start() {
repaint();
StartFrame.running = true;
thread = new Thread(this, "Game Loop");
thread.start();
}
public void stopSnake() {
StartFrame.running = false;
StartFrame.sRestart.restart();
}
public void paintComponent(Graphics g) {
g.clearRect(0, 0, WIDTH, HEIGHT);
g.setColor(new Color(10, 50, 0));
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(Color.BLACK);
for(int i = 0; i < WIDTH / 10; i++) {
g.drawLine(i * 10, 0, i * 10, HEIGHT);
}
for(int i = 0; i < HEIGHT / 10; i++) {
g.drawLine(0, i * 10, WIDTH, i * 10);
}
for(int i = 0; i < snake.size(); i++) {
snake.get(i).draw(g);
}
for(int i = 0; i < apples.size(); i++) {
apples.get(i).draw(g);
}
}
public void run() {
while(StartFrame.running) {
tick();
repaint();
}
}
public void tick() {
try {
Thread.sleep(StartFrame.schwierigkeit);
} catch (InterruptedException e) {
System.out.println("fail to Sleep");
e.printStackTrace();
}
if(snake.size() == 0) {
b = new Body(xCoor, yCoor, 10);
snake.add(b);
}
if(apples.size() == 0) {
int xCoor = r.nextInt(79);
int yCoor = r.nextInt(79);
apple = new Apple(xCoor, yCoor, 10);
apples.add(apple);
}
for(int i = 0; i < apples.size(); i++) {
if(xCoor == apples.get(i).getxCoor() && yCoor == apples.get(i).getyCoor()) {
size++;
apples.remove(i);
i--;
}
}
for(int i = 0; i < snake.size(); i++) {
if(xCoor == snake.get(i).getxCoor() && yCoor == snake.get(i).getyCoor()) {
if(i != snake.size() - 1) {
stopSnake();
}
}
}
if(xCoor < 0 || xCoor > 79 || yCoor < 0 || yCoor > 79) {
stopSnake();
}
ticks++;
if(ticks > 1) {
if(right) xCoor++;
if(left) xCoor--;
if(up) yCoor--;
if(down) yCoor++;
ticks = 0;
b = new Body(xCoor, yCoor, 10);
snake.add(b);
if(snake.size() > size) {
snake.remove(0);
}
}
}
private class Key implements KeyListener {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_RIGHT && !left) {
up = false;
down = false;
right = true;
}
if(key == KeyEvent.VK_LEFT && !right) {
up = false;
down = false;
left = true;
}
if(key == KeyEvent.VK_UP && !down) {
left = false;
right = false;
up = true;
}
if(key == KeyEvent.VK_DOWN && !up) {
left = false;
right = false;
down = true;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
}
Und die Probleme machende "Neustart" Klasse
Java:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Restart implements ActionListener{
static JFrame frameStop = new JFrame();
static JLabel lbScore = new JLabel(""+StartFrame.score);
static JLabel lbNorth = new JLabel("Dein Score:");
static JLabel lbNeustart = new JLabel("Erneut spielen:");
static JPanel pnSouth = new JPanel();
static JButton btLeicht = new JButton("Leicht");
static JButton btMittel = new JButton("Mittel");
static JButton btSchwer = new JButton("Schwer");
static Font ft1 = new Font("Arial", Font.BOLD, 30);
static Font ft2 = new Font("Arial", Font.BOLD, 80);
static Font ft3 = new Font("Arial", Font.BOLD, 18);
public void restart() {
frameStop.setLayout(new BorderLayout());
frameStop.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frameStop.setSize(450,280);
frameStop.setTitle("Snake");
frameStop.setLocationRelativeTo(null);
frameStop.setResizable(false);
frameStop.add(lbNorth, BorderLayout.NORTH);
frameStop.add(lbScore, BorderLayout.CENTER);
frameStop.add(pnSouth, BorderLayout.SOUTH);
pnSouth.add(lbNeustart, BorderLayout.NORTH);
pnSouth.add(btLeicht, BorderLayout.WEST);
pnSouth.add(btMittel, BorderLayout.CENTER);
pnSouth.add(btSchwer, BorderLayout.EAST);
lbNorth.setHorizontalAlignment(JLabel.CENTER);
lbNorth.setFont(ft1);
lbScore.setHorizontalAlignment(JLabel.CENTER);
lbScore.setFont(ft2);
lbNeustart.setFont(ft3);
btLeicht.addActionListener(this);
btMittel.addActionListener(this);
btSchwer.addActionListener(this);
frameStop.setVisible(true);
}
public void button() {
frameStop.setVisible(false);
frameStop.dispose();
StartFrame.sFrame.frame.removeAll();
StartFrame.sFrame.frame.dispose();
StartFrame.sFrame = null;
System.out.println("k");
StartFrame.sFrame = new Frame();
StartFrame.sFrame.frame();
}
public void actionPerformed(ActionEvent e) {
Object cmd = e.getSource();
if(cmd == btLeicht) {
button();
StartFrame.schwierigkeit = 20;
}
if(cmd == btMittel) {
button();
StartFrame.schwierigkeit = 10;
}
if(cmd == btSchwer) {
button();
StartFrame.schwierigkeit = 7;
}
}
}
und dann noch die Apple und Snake Klassen
Java:
import java.awt.Color;
import java.awt.Graphics;
public class Apple {
private int xCoor, yCoor, width, height;
public Apple(int xCoor, int yCoor, int tileSize) {
this.xCoor = xCoor;
this.yCoor = yCoor;
width = tileSize;
height = tileSize;
System.out.println("Apple");
}
public void tick() {
}
public void draw(Graphics g) {
g.setColor(Color.RED);
g.fillRect(xCoor * width, yCoor * height, width, height);
}
public int getxCoor() {
return xCoor;
}
public void setxCoor(int xCoor) {
this.xCoor = xCoor;
}
public int getyCoor() {
return yCoor;
}
public void setyCoor(int yCoor) {
this.yCoor = yCoor;
}
}
Java:
import java.awt.Color;
import java.awt.Graphics;
public class Body {
private int xCoor, yCoor, width, height;
public Body(int xCoor, int yCoor, int tileSize) {
this.xCoor = xCoor;
this.yCoor = yCoor;
width = tileSize;
height = tileSize;
}
public void tick() {
}
public void draw(Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(xCoor * width, yCoor * height, width, height);
g.setColor(Color.GREEN);
g.fillRect(xCoor * width + 1, yCoor * height + 1, width - 2, height - 2);
}
public int getxCoor() {
return xCoor;
}
public void setxCoor(int xCoor) {
this.xCoor = xCoor;
}
public int getyCoor() {
return yCoor;
}
public void setyCoor(int yCoor) {
this.yCoor = yCoor;
}
}
Ich hoffe ihr könnt mir helfen ich komme nämlich seit Tagen nicht weiter ;( ;( ;(