Probleme bei GameofLife

Java xyrse123

Bekanntes Mitglied
Hallo,
Ich wollte ein GameofLife programmieren. Die zufällig erzeugte Welt flackert einmal kurz auf und das Panel bleibt dann grau, aber der Generationen Zähler zählt weiter hoch. Könnte mir jemand einen Tipp geben woran das liegt?
Schon mal Danke im Vorraus.
Java:
import java.awt.*;
import java.util.Random;
import javax.swing.*;

public class GameofLife extends JPanel {
    static Thread m = new Thread(new MyThread());
    private int[][] Welt = new int[200][200];
    private int GenerationenZähler;
    final static GameofLife Feld = new GameofLife(600, 600);

    public GameofLife(int Breite, int Höhe) {
        setName("Conways Game of Life");
        Welterzeugen();

    }

    private void Welterzeugen() { // Welt wird zufällig gefüllt
        for (int a = 0; a < 200; a++) {
            for (int b = 0; b < 200; b++) {
                if (Math.random() > 0.8)
                    Welt[a][b] = 1; // lebendig
                else
                    Welt[a][b] = 0; // tot

            }
        }
    }

    public void updateWelt() { // regelen werden angewendet
        for (int a = 0; a < 200; a++) {
            for (int b = 0; b < 200; b++) {
                wendeRegelnAn(a, b);
            }
        }
    }

    public Dimension getPreferredSize() {
        return new Dimension(600, 600);
    }

    private void wendeRegelnAn(int a, int b) { // Populationregeln
        int nachbarn = 0;
        if (a >= 1 && b >= 1 && a <= 198 && b <= 198) {
            for (int i = a - 1; i <= a + 1; ++i) {
                for (int j = b - 1; j <= b + 1; ++j) {
                    if (Welt[i][j] == 1) // Nachbar werden gezählt
                        nachbarn += 1;

                    if (Welt[i][j] == 0) {
                        nachbarn -= 1;
                    }
                }
            }
        }

        if (Welt[a][b] == 1) { // zur Zeit t lebendig
            if ((nachbarn < 2) || (nachbarn > 3)) {
                Welt[a][b] = 0; // Zelle tot
            }
        }

        if ((nachbarn == 2) || (nachbarn == 3)) {
            Welt[a][b] = 1;
        }

        if (Welt[a][b] == 0 && nachbarn == 3) {
            Welt[a][b] = 1;
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("Generation: " + GenerationenZähler++, 0, 10);
        for (int a = 1; a < 199; a++) {
            for (int b = 1; b < 199; b++) {
                if (Welt[a][b] == 1) {
                    g.setColor(Color.red);
                    g.fillRect(a * 3, b * 3, 3, 3);
                }
            }
        }
    }

    static class MyThread extends Thread {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(100);
                    Feld.updateWelt();
                    Feld.repaint();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.getContentPane().add(Feld);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        m.start();
    }
}
[/code=Java]
 

X5-599

Top Contributor
Hab schon länger nichts mehr mit GameOfLife gemacht. Aber warum veringerst du die Nachbar Anzahl wenn eine Nachbar Zelle == 0? Sollte man nicht einfach nur die Anzahl der lebendigen nachbarn zählen?
 

Java xyrse123

Bekanntes Mitglied
Danke dir, das war der Fehler. Was ich nur nicht verstehe warum fast alle Zellen am Anfang lebendig sind. Wegen dem
Math.random() >0.8 müssten doch theoretisch rund 20% der Zellen am Anfang lebendig sein.
 

X5-599

Top Contributor
Ich hätte noch was einzubringen. Nochmal: ich bin mit den Regeln nicht mehr ganz so vertraut. Aber, beim Zählen der lebendigen Nachbarn einer Zelle. Sollte man es dann nicht aktiv vermeiden die Zelle (für die man die Nachbarn zählt) selber "mitzuzählen" sollte sie lebendig sein?
Ansonsten hätte doch z.B. eine lebendige Zelle an Koordinate 1/1, die sonst keine lebendigen Nachbarn hat, fehlerhafterweise einen Nachbar-Count von 1.
 

Java xyrse123

Bekanntes Mitglied
Wie bekomme ich es den hin das erst von allen Zellen die Nachbar gezählt werden und dann erst die Zellen gesetzt werden? Ich habe jetzt folgendes verändert, aber es ist immer noch das selbe Problem:
Java:
private int Nachbarn(int Welt[][], int a, int b) { // Zählt die Nachbarnzellen
  int nachbarn = 0;
  for (int i = a - 1; i <= a + 1; ++i) // ohne den Rand
   for (int j = b - 1; j <= b + 1; ++j)
    if (Welt[i][j] == 1 &&( a!=i || b!=j)) // Damit lebende Zelle nicht mit gezählt wird, ist das so richtig?
     nachbarn += 1;
  return nachbarn;
 }
 
private void wendeRegelnAn(int Welt[][]) { // Populationregeln
  int nachbarn = 0;
  for (int a = 1; a < 199; a++) {
   for (int b = 1; b < 199; b++) {
    nachbarn = Nachbarn(Welt, a, b);
    if (Welt[a][b] == 1) { // zur Zeit t lebendig
     if ((nachbarn < 2) || (nachbarn > 3)) {
      Welt[a][b] = 0; // Zelle tot
     }
    }
    if ((nachbarn == 2) || (nachbarn == 3)) {
     Welt[a][b] = 1;
    }
    if (Welt[a][b] == 0 && nachbarn == 3) {
     Welt[a][b] = 1;
    }
   }
  }
 }
[Code]
 

Meniskusschaden

Top Contributor
Einerseits darfst du den Zustand der alten Generation nicht verändern, bevor du mit deren Auswertung fertig bist. Andererseits musst du die dabei gewonnenen Informationen über die neue Generation natürlich auch irgendwo unterbringen. Du musst dir also etwas überlegen, um zwei Generationen speichern zu können.
 

Java xyrse123

Bekanntes Mitglied
Es funktioniert jetzt, aber wenn ich z.B den Gleiter initialiesiere ist der nach 3 Generationen weg,obwohl er sich eigentlich immer weiter über das Feld bewegen müsste (und dann irgendwann vom Feld verschwindet). Habe ich noch was bei den Spielregeln falsch oder liegt es an der etwas umständlichen Bedingung für die lebende Zelle damit sie nicht als ihre Nachbarzelle gezählt wird?
Java:
for (int i = a - 1; i <= a + 1; ++i) // ohne den Rand
            for (int j = b - 1; j <= b + 1; ++j)
                if (Welt[i][j] == 1 &&( (a<=i &&b<j) ||(a<i&& b<=j))) //die lebende Zelle soll nicht als ihr Nachbar
                    nachbarn += 1;                                                         //gezählt werden
        return nachbarn;
[code]
 

Java xyrse123

Bekanntes Mitglied
Ich habe die Bedingung jetzt so verändert:
Java:
if (Welt[i][j] == 1  && Welt[i][j]!=Welt[a][b]) {         
     nachbarn += 1;       
    }
Damit müsste doch die Adresse verglichen werden und nicht der Inhalt.
Aber die Nachfolgegenerationen sind immer noch nicht richtig.
 

Java xyrse123

Bekanntes Mitglied
Post #15 bitte einfach ignorieren, ich konnte ihn nicht mehr bearbeiten:confused:. Folgendes habe ich verändert damit die lebende Zelle nicht mitgezählt wird:
Java:
for (int i = a - 1; i <= a + 1; ++i) // ohne den Rand
            for (int j = b - 1; j <= b + 1; ++j)
                if (Welt[i][j] == 1 ) {                                                                             
                    nachbarn += 1;                                                                     
                }
                if(Welt[a][b]==1)    {
                    nachbarn--;
                }
Aber die Nachfolgegenerationen sind immer noch nicht richtig.
 

Meniskusschaden

Top Contributor
Angenommen, die Zelle an Position a,b ist lebendig. Wie oft wird nachbarn-- in der Schleife denn dann ausgeführt?

In #10 sah deine Abfrage noch so aus:
Java:
if (Welt[i][j] == 1 && (a!=i || b!=j)) 
     nachbarn += 1;
Ist dir bewusst, was das Problem damit war?
 

Java xyrse123

Bekanntes Mitglied
Ja ich habe es getestet und funktioniert nicht.
Hier nochmal der aktuelle Stand:
Java:
mport java.awt.*;
import java.util.Random;
import javax.swing.*;

public class GameofLife extends JPanel {
    static Thread m = new Thread(new MyThread());
    private static int[][] Welt;
    private static int[][] Welt_neu;
    private int GenerationenZähler;
    static GameofLife Feld = new GameofLife(600, 600);

    public GameofLife(int Breite, int Höhe) {
        setName("Conways Game of Life");
        this.Welt = new int[100][100];
        Welterzeugen();

    }

    private void Welterzeugen() { // Gleiter wird initialisiert

        Welt[20][10] = 1;
        Welt[21][10] = 1;
        Welt[22][10] = 1;

        Welt[21][8] = 1;
        Welt[22][9] = 1;
        
    }

    public int[][] updateWelt() { // regelen werden angewendet
        Welt = wendeRegelnAn(Welt);

        return Welt;
    }

    public Dimension getPreferredSize() {
        return new Dimension(600, 600);
    }

    private int Nachbarn(int Welt[][], int a, int b) { // x,y
        int nachbarn = 0;
        for (int i = a - 1; i <= a + 1; ++i) // ohne den Rand
            for (int j = b - 1; j <= b + 1; ++j)
                if (Welt[i][j] == 1 && (a != i || b != j))
                    nachbarn += 1;
        return nachbarn;
    }

    private int[][] wendeRegelnAn(int Welt[][]) { // Populationregeln

        int Welt_neu[][] = new int[100][100];

        for (int a = 1; a < 99; a++) {
            for (int b = 1; b < 99; b++) {

                int nachbarn = Nachbarn(Welt, a, b);
                System.out.println(nachbarn);
                if (Welt[a][b] == 1) { // zur Zeit t lebendig
                    if ((nachbarn < 2) || (nachbarn > 3)) {
                        Welt_neu[a][b] = 0; // Zelle tot
                    }

                }
                if (Welt[a][b] == 0 && nachbarn == 3) {
                    Welt_neu[a][b] = 1;
                }

            }
        }
        return Welt_neu;

    }   
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("Generation: " + GenerationenZähler++, 0, 10);
        for (int a = 1; a < 99; a++) {
            for (int b = 1; b < 99; b++) {
                if (Welt[a][b] == 1) {
                    g.setColor(Color.red);
                    g.fillRect(a * 6, b * 6, 6, 6);
                }
            }
        }
    }

    static class MyThread extends Thread {
        public void run() {

            while (true) { // true
                try {

                    Thread.sleep(150);
                    Feld.updateWelt();

                    Feld.repaint();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.getContentPane().add(Feld);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        m.start();
    }
}
 

Java xyrse123

Bekanntes Mitglied
So jetzt funktioniert alles. Hier noch mal die Regeln:
Java:
if (Welt[a][b] == 1) { // zur Zeit t lebendig
                    if ((nachbarn < 2) || (nachbarn > 3)) {
                        Welt_neu[a][b] = 0; // Zelle tot
                    }
                    if (nachbarn == 2 || nachbarn == 3) {
                        Welt_neu[a][b] = 1;
                    }
                }
                if (Welt[a][b] == 0 && nachbarn == 3) { // zur Zeit t  tot
                    Welt_neu[a][b] = 1;
                }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
L Probleme mit JPanel AWT, Swing, JavaFX & SWT 8
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
G kleinere Probleme mit GUI AWT, Swing, JavaFX & SWT 2
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J GUI-Aktualisierungs-Probleme AWT, Swing, JavaFX & SWT 4
B Performance-Probleme AWT, Swing, JavaFX & SWT 17
I Probleme if-Anweisung AWT, Swing, JavaFX & SWT 26
D Swing Probleme bei transparenten Hintergrund im JTextField AWT, Swing, JavaFX & SWT 6
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben