Swing Button soll Spiel zurücksetzen

Zeppi

Aktives Mitglied
Moin,
ich habe Minesweeper "gebaut" und habe jetzt ein Button eingefügt, der das Spiel zurück setzen soll. Ich weiß aber nicht, wie ich am Besten das Spielfeld Resette.
[CODE lang="java" title="JPanel"]public class MinePanel extends JPanel implements MouseListener {
private int x, y;
int breite;
int hoehe;
int spalteX, spalteY;
int offset = 30;
private KlickBrettSpiel spiel = new MinesweeperSpiel();

public MinePanel() {
this.addMouseListener(this);

}

@Override
public void paintComponent(Graphics gr) {
super.paintComponent(gr);
if (spiel.verloren()) {
spiel.aufdecken();
gr.setColor(Color.red);
gr.fillRect(0, 0, this.getWidth(), this.getHeight());
} else if (spiel.gewonnen()) {
gr.setColor(Color.yellow);
gr.fillRect(0, 0, this.getWidth(), this.getHeight());
}
breite = this.getHeight();
hoehe = this.getWidth();
int hoeheNeu = this.getHeight() * 3 / 4;
int breitetNeu = this.getWidth() * 3 / 4;

if (breite < hoehe) {

breite = hoeheNeu;
hoehe = hoeheNeu;
} else if (breite > hoehe) {

breite = breitetNeu;
hoehe = breitetNeu;
} else {
breite = hoeheNeu;
hoehe = hoeheNeu;
}
spalteX = breite / spiel.getSpaltenZahl();
spalteY = hoehe / spiel.getZeilenZahl();

gr.setColor(Color.black);
for (int i = 0; i < spiel.getZeilenZahl() + 1; i++) {
gr.drawLine(offset, offset + i * hoehe / spiel.getZeilenZahl(), breite + offset,
offset + i * hoehe / spiel.getZeilenZahl());

}
for (int j = 0; j < spiel.getSpaltenZahl() + 1; j++) {
gr.drawLine(offset + j * breite / spiel.getSpaltenZahl(), offset,
offset + j * breite / spiel.getSpaltenZahl(), hoehe + offset);
}
for (int i = 0; i < spiel.getZeilenZahl(); i++) {
for (int j = 0; j < spiel.getSpaltenZahl(); j++) {

gr.drawString(" " + spiel.get(j, i), offset + j * breite / spiel.getSpaltenZahl(),
offset + (i + 1) * hoehe / spiel.getZeilenZahl());

}

}

}

@Override
public void mouseClicked(MouseEvent e) {

x = ((e.getX() - offset) / spalteX);
y = ((e.getY() - offset) / spalteY);
if (SwingUtilities.isLeftMouseButton(e)) {
spiel.set(x, y);
spiel.revealZero(x, y);
}

} else if (SwingUtilities.isRightMouseButton(e)) {
spiel.markiere(x, y);
}
repaint();

}[/CODE]
[CODE lang="java" title="JFrame"]public class MineFrame extends JFrame implements ActionListener {
private MinePanel panel;
private JButton button;

public MineFrame() {
panel = new MinePanel();
this.add(panel);
this.setSize(600, 600);
button = new JButton("Neustart");
this.add(button, BorderLayout.SOUTH);
button.addActionListener(this);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
new MineFrame();

}

@Override
public void actionPerformed(ActionEvent e) {

}[/CODE]

Vielleicht hat jemand ja ein Tipp.
Danke Zeppi
 
Java:
  private KlickBrettSpiel spiel;

  public MinePanel() {
    this.addMouseListener(this);
    reset();
  }

   public void reset() {
       this.spiel = new MinesweeperSpiel();
   }


Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        this.panel.reset();
    }
 
Java:
  private KlickBrettSpiel spiel;

  public MinePanel() {
    this.addMouseListener(this);
    reset();
  }

   public void reset() {
       this.spiel = new MinesweeperSpiel();
   }


Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        this.panel.reset();
    }
Danke.
Ich habe noch zwei Fragen.
1. Wieso brauch ich reset() auch im Konstruktor? Denn es funktioniert auch, wenn ich es da weglasse.
2. Jetzt resettet sich das Spiel immer erst, wenn ich erneut auf ein Feld klicke, kann man es auch schaffen, dass das Spielfeld zurückgesetzt wird, bevor man erneut auf das Feld klickt?
 
Einfach noch ein repaint() aufrufen.

Und es funktioniert auch ohne den Aufruf im Konstruktor, da du die Initialisierung der Variable auch direkt bei der Deklaration hast. (Damit hast du doppelten Code)
 

Zurück
Oben