Ich habe mich mal an dem (alten) Game of Life probiert ... aber einige Probleme damit. Im Grunde bin ich (als Anfänger) schon ganz zufrieden damit, nur möchte ich einige Probleme beheben bzw. Dinge optimieren:
1.
Es gibt noch ein Problem mit der Grafik: Bei Start sehe ich kurz das Spielfeld, das wird aber gleich wieder gelöscht? Ich hatte erst probiert, das Problem mit paint() zu lösen ... das Ergebnis war identisch. Bei jedem Aufruf der paintComponent wird das Graphics gesucht; das ist hier zwar relativ unwichtig, aber ist es nicht besser (möglich) das Ding nur einmal zu bestimmen?
2.
Auch wenn dieses Forum dafür falsch ist (wills nur nicht doppelt einstellen): im Moment komme ich durch Anklicken eines Buttons in das nächste Leben - ein Timer wäre schön, nur habe ich das nicht hinbekommen (Hier wieder komplett entfernt.)
3.
(Da bin ich nch dran ...) Irgendwie gibt es ein Problem bei der Berechnung / Anzeige des nächsten Lebens ... kein Java-Problem ... da suche ich noch, aber evtl. sieht ja jemand sofort, wo der Fehler ist.
... und hier der Quelltext:
... und die MyCanvas ...
1.
Es gibt noch ein Problem mit der Grafik: Bei Start sehe ich kurz das Spielfeld, das wird aber gleich wieder gelöscht? Ich hatte erst probiert, das Problem mit paint() zu lösen ... das Ergebnis war identisch. Bei jedem Aufruf der paintComponent wird das Graphics gesucht; das ist hier zwar relativ unwichtig, aber ist es nicht besser (möglich) das Ding nur einmal zu bestimmen?
2.
Auch wenn dieses Forum dafür falsch ist (wills nur nicht doppelt einstellen): im Moment komme ich durch Anklicken eines Buttons in das nächste Leben - ein Timer wäre schön, nur habe ich das nicht hinbekommen (Hier wieder komplett entfernt.)
3.
(Da bin ich nch dran ...) Irgendwie gibt es ein Problem bei der Berechnung / Anzeige des nächsten Lebens ... kein Java-Problem ... da suche ich noch, aber evtl. sieht ja jemand sofort, wo der Fehler ist.
... und hier der Quelltext:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GoL extends JFrame implements MouseListener, MouseMotionListener {
// Anfang Attribute
private MyCanvas Spielfeld = new MyCanvas();
private JButton btnClear = new JButton();
private JLabel lStatuszeile = new JLabel();
private JButton btnNext = new JButton();
public boolean[][] Life = new boolean[52][52];
// Ende Attribute
public GoL(String title) {
// Frame-Initialisierung
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 520;
int frameHeight = 600;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
Spielfeld.setBounds(7, 2, 500, 500);
Spielfeld.setBackground(Color.WHITE);
Spielfeld.addMouseMotionListener(this);
Spielfeld.addMouseListener(this);
cp.add(Spielfeld);
btnClear.setBounds(8, 536, 100, 25);
btnClear.setText("Reset");
btnClear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnClear_ActionPerformed(evt);
}
});
cp.add(btnClear);
lStatuszeile.setBounds(8, 512, 496, 16);
lStatuszeile.setText("Mausposition");
lStatuszeile.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
cp.add(lStatuszeile);
btnNext.setBounds(112, 536, 100, 25);
btnNext.setText("Weiter");
btnNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnNext_ActionPerformed(evt);
}
});
cp.add(btnNext);
// Ende Komponenten
setResizable(false);
setVisible(true);
reset();
}
// Anfang Methoden
/*
* MouseListener - Ereignisroutinen
*/
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
int ex = e.getX()/10;
int ey = e.getY()/10;
// Polygon zeichnen
if (!e.isMetaDown()) { // wurde linke Maustaste gedrückt?
Life[ey][ex] = true;
}
else {
Life[ey][ex] = false;
}
// Graphics g = Spielfeld.getGraphics();
Spielfeld.paintComponent(Life);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
/*
* MouseMotionListener - Ereignisroutinen
*/
public void mouseMoved(MouseEvent e) {
int ex = e.getX()/10;
int ey = e.getY()/10;
if (e.getSource() == Spielfeld)
{
lStatuszeile.setText("Mouseposition("+ex+"|"+ey+")");
}
}
public void mouseDragged(MouseEvent e) {
}
// Rücksetzen der Spielfeldes
public void reset() {
for (int x=0; x<52; x++) {
for (int y=0; y<52; y++) {
Life[y][x] = false;
}
}
// Graphics g = Spielfeld.getGraphics();
Spielfeld.paintComponent(Life);
}
// Button Reset
public void btnClear_ActionPerformed(ActionEvent evt) {
reset();
}
// Button Beenden
public void btnEnd_ActionPerformed(ActionEvent evt) {
}
// Start des Spiels
public void btnNext_ActionPerformed(ActionEvent evt) {
nextGeneration();
// Graphics g = Spielfeld.getGraphics();
Spielfeld.paintComponent(Life);
}
// Anzahl der Nachbarn bestimmen
private int anzahlNachbarn(int x, int y) {
int n = 0;
if (Life[y][x]) { // Ist die Mitte besetzt?
n = -1;
}
for (int i=x-1; i<x+2; i++) {
for (int j=y-1; j<y+2; j++) {
if (Life[j][i]) {
n++;
}
}
}
return n;
}
public void nextGeneration() {
boolean[][] NextLife = new boolean[52][52];
NextLife = Life;
// einzelne Felder neu berechnen
for (int x=1; x<51; x++) {
for (int y=1; y<51; y++) {
switch (anzahlNachbarn(x,y)) {
case 0: case 1 :
NextLife[y][x] = false; // stirbt aus Vereinsamung
break;
case 2 :
NextLife[y][x] = Life[y][x]; // bleibt erhalten
break;
case 3 :
NextLife[y][x] = true; // Geburt bzw. Erhaltung
break;
default :
NextLife[y][x] = false; // stirbt wegen Überbevölkerung
}
}
}
Life = NextLife; // nächste Generation als aktuelle Generation setzen
}
// Ende Methoden
public static void main(String[] args) {
new GoL("Game of Life");
}
}
... und die MyCanvas ...
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class MyCanvas extends Canvas {
public void paintComponent(boolean[][] Feld) {
Graphics g = getGraphics();
for (int x=1; x<51; x++) {
for (int y=1; y<51; y++) {
if (Feld[y][x]) {
g.setColor(new Color(255,140,0)); // aktiv -> grün
}
else {
g.setColor(new Color(0,0,0)); // nicht aktiv -> schwarz
}
g.fillRect(x*10,y*10,9,9);
}
}
}
}