Array Spielfeld wird in GUI gedreht

Viktim

Bekanntes Mitglied
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)
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;
  }
}
Klasse 2 (für die Anzeige)
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();
  }

}
Und meine dritte Klasse 😀
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:
Ich habe genau das selbe Problem mit Space Invaders... 🙁
Auf der GUI kommen die Invaders von oben und "fallen", auf der Konsole aber sehe ich das die Invaders von links nach rechts wandern...
 
Hat das einen Grund, dass du in der Logic Klasse das i und j in der equals ">" bzw "O" vertauschst? Ist mir nur aufgefallen beim drüberschauen; hab's nicht ausprobiert.

Code:
            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);
            }
 
Daher wäre es ratsam für diesen Fall sprechendere Namen zu verwenden 😉
Also x/y, xKoo/yKoo, horizontal/vertical, ..... Besonders bei so ähnlichen Buchstaben wie i und j (beides dünne Striche) ist es schwer zu auf einen Blick zu erkennen.
 

Zurück
Oben