Game of Life

kappacell

Mitglied
Ich habe angefangen das "Game of Life" nachzuprogrammieren, allerdings komme ich mit meinem letzigen code nicht weiter bzw es klappt nicht, kann mir jemand sagen,was ich falsch gemacht habe?
Code:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GameOfLifeGui extends JFrame {
    boolean isFirstPress = true;
    boolean isSecondPress = false;
    private JButton start;

    private JButton[] knopf = new JButton[100];
    int anzNachbarn = 0;

    public GameOfLifeGui() {
        super("Game of Life");
        createFelderButtons();
        createStartButton();

    }

    private void createStartButton() {
        JPanel startPanel = new JPanel();
        startPanel.setLayout(new FlowLayout());
        start = new JButton("Los!");
        startPanel.add(start);
        add(startPanel);
        startPanel.setVisible(true);
        start.addActionListener(getStartListener());
    }

    private void nachbarn(int i) {
       
        if (anzNachbarn < 2 && knopf[i].getBackground()==Color.GREEN) {
            knopf[i].setBackground(Color.LIGHT_GRAY);
        } else if (anzNachbarn > 3 && knopf[i].getBackground()==Color.GREEN) {
            knopf[i].setBackground(Color.LIGHT_GRAY);
        } else if (knopf[i].getBackground() == Color.LIGHT_GRAY && anzNachbarn == 3) {
            knopf[i].setBackground(Color.GREEN);
        }
        anzNachbarn = 0;
    }

    void createFelderButtons() {
        setLayout(new GridLayout(11, 10));

        for (int i = 0; i <= 99; i++) {
            JPanel felderPanel = new JPanel();
            felderPanel.setLayout(new GridLayout(10, 10));
            knopf[i] = new JButton(String.valueOf(i));
            start = new JButton("Los!");
            add(knopf[i]);
            knopf[i].addActionListener(getGridListener());
            knopf[i].setText(String.valueOf(i));
            felderPanel.setVisible(true);
            knopf[i].setText(i + " ");
            knopf[i].setBackground(Color.GRAY);

        }
    }

    private ActionListener getGridListener() {
        return (event) -> {
            JButton clickedButton = (JButton) event.getSource();
            if (isFirstPress) {
                clickedButton.setBackground(Color.GREEN);
                isFirstPress = false;
                isSecondPress = true;
            } else if (isSecondPress) {
                clickedButton.setBackground(Color.GRAY);
                isSecondPress = false;
                isFirstPress = true;
            }

        };
    }

    private ActionListener getStartListener() {
        return (event) -> {
            for (int i = 0; i <= knopf.length; i++) {
            if (knopf[0].getBackground() == Color.GREEN) {
                        if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }else {
                           anzNachbarn=0;
                    } nachbarn(i);
            }else if (knopf[90].getBackground() == Color.GREEN) {
                     if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }else {
                           anzNachbarn=0;
                    } nachbarn(i);
            }else if (knopf[9].getBackground() == Color.GREEN) {
                    if (knopf[i - 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i + 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }else {
                       anzNachbarn=0;
                   } nachbarn(i);
            }else if (knopf[99].getBackground() == Color.GREEN) {
                    if (knopf[i - 1].getBackground() == Color.GREEN) {
                    anzNachbarn += 1;
                   }if (knopf[i - 10].getBackground() == Color.GREEN) {
                    anzNachbarn += 1;
                   }if (knopf[i - 11].getBackground() == Color.GREEN) {
                    anzNachbarn += 1;
                   }else {
                       anzNachbarn=0;
                   } nachbarn(i);
            }else if (knopf[1].getBackground() == Color.GREEN || knopf[2].getBackground() == Color.GREEN
                        || knopf[3].getBackground() == Color.GREEN || knopf[4].getBackground() == Color.GREEN
                        || knopf[5].getBackground() == Color.GREEN || knopf[6].getBackground() == Color.GREEN
                        || knopf[7].getBackground() == Color.GREEN || knopf[8].getBackground() == Color.GREEN) {
                    if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i + 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i + 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }if (knopf[i - 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                   }else {
                       anzNachbarn=0;
                   } nachbarn(i);
            }else if (knopf[10].getBackground() == Color.GREEN || knopf[20].getBackground() == Color.GREEN
                        || knopf[30].getBackground() == Color.GREEN || knopf[40].getBackground() == Color.GREEN
                        || knopf[50].getBackground() == Color.GREEN || knopf[60].getBackground() == Color.GREEN
                        || knopf[70].getBackground() == Color.GREEN || knopf[80].getBackground() == Color.GREEN) {
                     if (knopf[i - 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }else {
                        anzNachbarn=0;
                    } nachbarn(i);
            }else if (knopf[91].getBackground() == Color.GREEN || knopf[92].getBackground() == Color.GREEN
                        || knopf[93].getBackground() == Color.GREEN || knopf[94].getBackground() == Color.GREEN
                        || knopf[95].getBackground() == Color.GREEN || knopf[96].getBackground() == Color.GREEN
                        || knopf[97].getBackground() == Color.GREEN || knopf[98].getBackground() == Color.GREEN) {
                     if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }else {
                        anzNachbarn=0;
                    } nachbarn(i);
            }else if (knopf[19].getBackground() == Color.GREEN || knopf[29].getBackground() == Color.GREEN
                        || knopf[39].getBackground() == Color.GREEN || knopf[49].getBackground() == Color.GREEN
                        || knopf[59].getBackground() == Color.GREEN || knopf[69].getBackground() == Color.GREEN
                        || knopf[79].getBackground() == Color.GREEN || knopf[89].getBackground() == Color.GREEN) {
                     if (knopf[i - 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                     }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }else {
                        anzNachbarn=0;
                    } nachbarn(i);
            }else if    (  knopf[11].getBackground() == Color.GREEN || knopf[12].getBackground() == Color.GREEN
                        || knopf[13].getBackground() == Color.GREEN || knopf[14].getBackground() == Color.GREEN
                        || knopf[15].getBackground() == Color.GREEN || knopf[16].getBackground() == Color.GREEN
                        || knopf[17].getBackground() == Color.GREEN || knopf[18].getBackground() == Color.GREEN
                        || knopf[21].getBackground() == Color.GREEN || knopf[22].getBackground() == Color.GREEN
                        || knopf[23].getBackground() == Color.GREEN || knopf[24].getBackground() == Color.GREEN
                        || knopf[25].getBackground() == Color.GREEN || knopf[26].getBackground() == Color.GREEN
                        || knopf[27].getBackground() == Color.GREEN || knopf[28].getBackground() == Color.GREEN
                        || knopf[31].getBackground() == Color.GREEN || knopf[32].getBackground() == Color.GREEN
                        || knopf[33].getBackground() == Color.GREEN || knopf[34].getBackground() == Color.GREEN
                        || knopf[35].getBackground() == Color.GREEN || knopf[36].getBackground() == Color.GREEN
                        || knopf[37].getBackground() == Color.GREEN || knopf[38].getBackground() == Color.GREEN
                        || knopf[41].getBackground() == Color.GREEN || knopf[42].getBackground() == Color.GREEN
                        || knopf[43].getBackground() == Color.GREEN || knopf[44].getBackground() == Color.GREEN
                        || knopf[45].getBackground() == Color.GREEN || knopf[46].getBackground() == Color.GREEN
                        || knopf[47].getBackground() == Color.GREEN || knopf[48].getBackground() == Color.GREEN
                        || knopf[51].getBackground() == Color.GREEN || knopf[52].getBackground() == Color.GREEN
                        || knopf[53].getBackground() == Color.GREEN || knopf[54].getBackground() == Color.GREEN
                        || knopf[55].getBackground() == Color.GREEN || knopf[56].getBackground() == Color.GREEN
                        || knopf[57].getBackground() == Color.GREEN || knopf[58].getBackground() == Color.GREEN
                        || knopf[61].getBackground() == Color.GREEN || knopf[62].getBackground() == Color.GREEN
                        || knopf[63].getBackground() == Color.GREEN || knopf[64].getBackground() == Color.GREEN
                        || knopf[65].getBackground() == Color.GREEN || knopf[66].getBackground() == Color.GREEN
                        || knopf[67].getBackground() == Color.GREEN || knopf[68].getBackground() == Color.GREEN
                        || knopf[71].getBackground() == Color.GREEN || knopf[72].getBackground() == Color.GREEN
                        || knopf[73].getBackground() == Color.GREEN || knopf[74].getBackground() == Color.GREEN
                        || knopf[75].getBackground() == Color.GREEN || knopf[76].getBackground() == Color.GREEN
                        || knopf[77].getBackground() == Color.GREEN || knopf[78].getBackground() == Color.GREEN
                        || knopf[81].getBackground() == Color.GREEN || knopf[82].getBackground() == Color.GREEN
                        || knopf[83].getBackground() == Color.GREEN || knopf[84].getBackground() == Color.GREEN
                        || knopf[85].getBackground() == Color.GREEN || knopf[86].getBackground() == Color.GREEN
                        || knopf[87].getBackground() == Color.GREEN || knopf[88].getBackground() == Color.GREEN) {
                     if (knopf[i + 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i + 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 1].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 9].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 10].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;
                    }if (knopf[i - 11].getBackground() == Color.GREEN) {
                        anzNachbarn += 1;

                    }else {
                        anzNachbarn=0;
                    }
                    nachbarn(i);

                }

            }
            ;

        };
    }
}
 

Java xyrse123

Bekanntes Mitglied
Was klappt den nicht?
Du solltest vielleicht ein 2 dimensionales Array verwenden dann wird es übersichtlicher. Und davon musst du dir dann auch immer eine Kopie anlegen und es dann alles auf einmal aktualisieren.
 

Java xyrse123

Bekanntes Mitglied
Ich würde das Programm erstmal auf der Konsole zum laufen bringen, den diese ganzen if else abfragen mit den Knöpfen sind nicht wirklich zu durchblicken.

So könntest du z.B vorgehen:
1. Ein Zweidimensionales int Array erstellen und zufällig füllen, 0 tot 1, lebendig
2. Eine Methode die die Nachbarn zählt, wobei du mit dem Rand aufpassen musst.
3. Eine Methode "RegelnAnwenden" in der das Array kopiert wird und auf die Kopie dann die Regeln für die Zellen angewendet werden.
4. Eine Methode zum Ausgeben des Feldes.
Und wenn du es auf der Konsole hinbekommen hast wird es auch viel leichter sein, es grafisch zu machen
 

MoxxiManagarm

Top Contributor
Eine Liste von Anmerkungen:
1. Bitte verwende doch code=java Tags, das macht es um Einiges leslicher
2. Du solltest definitiv ein 2D-Array nehmen, also
Java:
private JButton[][] knopf = new JButton[10][10];
Sonst blickst du beim Nachbarn zählen sicher garnicht durch und bekommst Schwierigkeiten wenn sich die Größe mal ändert
3.
Java:
            if (isFirstPress) {
                clickedButton.setBackground(Color.GREEN);
                isFirstPress = false;
                isSecondPress = true;
            } else if (isSecondPress) {
                clickedButton.setBackground(Color.GRAY);
                isSecondPress = false;
                isFirstPress = true;
            }
Willst du damit die Farbe umschalten?
Java:
clickedButton.setBackground(clickedButton.getBackground().equals(Color.GRAY) ? Color.GREEN : Color.GRAY);
4.
Java:
knopf[91].getBackground() == Color.GREEN
Obekte solltest du mit equals vergleichen
5.
Java:
for (int i = 0; i <= knopf.length; i++) {
Der Fall = knopf.length ist 100 und ein Array der Länge 100 hat kein Index 100.
6. Du hast viele harte Indizes im Code, die solltest du entfernen. Das Zählen der Nachbarn ist semantisch für jedes Feld gleich, egal wie groß dein Array ist und egal welches Feld du betrachtest.
7. Du wirst noch ein weiteres Problem haben. Du veränderst nämlich die Farbe eines Buttons nachdem du es überprüft hast und das nächste Feld arbeitet auf dem bereits veränderten Zustand. Das nächste Feld muss aber auch nach dem alten Zustand ausgewertet werden. Du musst also zwischen alter und neuer Welt unterscheiden und im Anschluss die alte Welt durch die neue Welt ersetzen.
 

Ähnliche Java Themen

Neue Themen


Oben