*Logarithmusfehler
Hallo allerseits, nachdem ich nun schon nicht den ersten Tag rumgrübel, habe ich beschlossen mich hier anzumelden.
Ich habe versucht das Spiel "Conways Spiel des Lebens" (siehe https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens) zu programmieren und es läuft auch soweit - Fenster wird angezeigt, keine Kompilierungsfehler etc.
Aber irgendwas scheint in der Programmlogik durcheinander geraten zu sein - das Spiel folgt nicht mehr den Regeln, dass eine Zelle neben zwei oder drei Nachbarn überlebt und eine tote Zelle neben drei Nachbarn geboren wird.
Da alle Zellen gleichzeitig aktualisiert werden sollen, habe ich einen boolean[][] altesFeld und einen boolean[][] neuesFeld. Die Nachbarn einer Zelle auf dem alten Feld werden abgesucht, und dementsprechend wird dann die Stelle im neuen Feld auf true(lebt) oder false(lebt nicht) gesetzt und in schwarzweiß ausgegeben.
Nach einigem Durchrechnen per Hand habe ich verstanden, dass die neuen Zellen direkt in das alte Feld eingefügt werden, kann allerdings im Quellcode nicht die Stelle finden, an der das passiert.
Ich habe das Programm mit dem OpenSource-Programm BlueJ geschrieben, dass ohne Main()-Methode arbeitet, aber man könnte einfach in die Klasse Logik die Main()-Methode spielen(50,1); reinschreiben- man sieht das Problem bereits nach einem Schritt.
Es existiert noch die Methode neuZeichnen() und die Klasse Welt(), die aber nur noch die Darstellung übernehmen. Wenn sie jemandem nützlich sind, kann ich sie natürlich auch noch dranhängen.
Das Bittere ist, dass es einen Abend funktioniert hat, bis ich irgendwas daran geändert habe- aber ich weiß nicht mehr was.
Liebe Grüße und vielen Dank im Voraus für die Hilfe!
Hallo allerseits, nachdem ich nun schon nicht den ersten Tag rumgrübel, habe ich beschlossen mich hier anzumelden.
Ich habe versucht das Spiel "Conways Spiel des Lebens" (siehe https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens) zu programmieren und es läuft auch soweit - Fenster wird angezeigt, keine Kompilierungsfehler etc.
Aber irgendwas scheint in der Programmlogik durcheinander geraten zu sein - das Spiel folgt nicht mehr den Regeln, dass eine Zelle neben zwei oder drei Nachbarn überlebt und eine tote Zelle neben drei Nachbarn geboren wird.
Da alle Zellen gleichzeitig aktualisiert werden sollen, habe ich einen boolean[][] altesFeld und einen boolean[][] neuesFeld. Die Nachbarn einer Zelle auf dem alten Feld werden abgesucht, und dementsprechend wird dann die Stelle im neuen Feld auf true(lebt) oder false(lebt nicht) gesetzt und in schwarzweiß ausgegeben.
Nach einigem Durchrechnen per Hand habe ich verstanden, dass die neuen Zellen direkt in das alte Feld eingefügt werden, kann allerdings im Quellcode nicht die Stelle finden, an der das passiert.
Ich habe das Programm mit dem OpenSource-Programm BlueJ geschrieben, dass ohne Main()-Methode arbeitet, aber man könnte einfach in die Klasse Logik die Main()-Methode spielen(50,1); reinschreiben- man sieht das Problem bereits nach einem Schritt.
Java:
public class Logik
{
private JFrame frame;
private boolean[][] altesFeld;
private boolean[][] neuesFeld;
private Welt welt;
public Logik(){
frame = new JFrame("Game of Life");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(515,540);
frame.setVisible(true);
altesFeld = new boolean[100][100];
neuesFeld = new boolean[100][100];
neuZeichnen(neuesFeld);
}
public void spielen(int prozent, int anzahlSchritte){
boolean[][] altesFeld = feldZufälligInitialisieren(prozent);
neuZeichnen(altesFeld);
int n = 0;
while(n < anzahlSchritte){
try{
Thread.sleep(150);
}
catch(Exception e){
System.out.println("Error in Logik.spielen.Thread.sleep();");
}
boolean[][] neuesFeld = nächsteGeneration(altesFeld);
neuZeichnen(neuesFeld);
n++;
}
}
public boolean[][] feldZufälligInitialisieren(int p){
int prozent = p;
Random rand = new Random();
neuesFeld = new boolean[100][100];
for (int i = 0; i<100; i++){
for(int j = 0; j<100; j++){
int zufallszahl = rand.nextInt(100);
if(zufallszahl < prozent){
neuesFeld[i][j] = true;
}
else{
neuesFeld[i][j] = false;
}
}
}
return neuesFeld;
}
private boolean[][] nächsteGeneration(boolean[][] altesFeld){
boolean[][] neuesFeld = new boolean[100][100];
for (int i = 0; i<100; i++){
for (int j = 0; j < 100; j++){
int nachbarn = 0;
nachbarn = getAnzahlNachbarn(altesFeld, i, j);
if(altesFeld[i][j] == true){ //Zelle lebt
if((nachbarn == 2) || (nachbarn == 3)){
neuesFeld[i][j] = true; //Zelle bleibt am Leben
}
else {
neuesFeld[i][j] = false; //Zelle stirbt.
}
}
else { //Zelle ist tot
if(nachbarn == 3){
neuesFeld[i][j] = true; //Zelle wird geboren
}
else {
neuesFeld[i][j] = false; //Zelle bleibt tot
}
}
}
}
return neuesFeld;
}
public int getAnzahlNachbarn(boolean[][] altesFeld, int x, int y){
int anzahlNachbarn = 0;
if(x == 0 || x == 99 || y == 0 || y == 99) {
anzahlNachbarn = 0; //Die Randfelder sollen leer bleiben
}
else {
for(int i = x-1; i<= x+1; i++) {
for(int j = y-1; j<= y+1; j++) {
if(altesFeld[i][j] == true) {
anzahlNachbarn++;
}
}
}
}
if(altesFeld[x][y] == true){
anzahlNachbarn --; //Die Zelle an sich rechnen wir raus.
}
return anzahlNachbarn;
}
Es existiert noch die Methode neuZeichnen() und die Klasse Welt(), die aber nur noch die Darstellung übernehmen. Wenn sie jemandem nützlich sind, kann ich sie natürlich auch noch dranhängen.
Das Bittere ist, dass es einen Abend funktioniert hat, bis ich irgendwas daran geändert habe- aber ich weiß nicht mehr was.
Liebe Grüße und vielen Dank im Voraus für die Hilfe!