Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.03.2014, 13:35

Probleme bei Conways Game of Life

Hallo liebes spieleprogrammierer.de Forum. Ich habe gestern probiert Conways Game of Life mit LibGDX umzusetzen. Ich habe dafür eine Klasse Feld erstellt und von ihr ein dickes zweidimensionales Array (40x40) gemacht. Alles funktioniert soweit gut, jedoch scheint es bei den Regeln Probleme zu geben. Irgendwie verhält sich meine Regelwelt anders, als die von Conway. Der Gleiter von Conway zum Beispiel funktioniert einfach nicht.

Ich habe die Regeln so realisiert, dass erst die Nachbarn gezählt werden und dann die entsprechenden Aktionen ausgeführt werden.

Code für die Regeln:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    private void tick() {
        int x = 0;
        int y = 0;
        
        for(int i = 0;i<1600;i++){
            
            int n = 0;
            
            
            //Conway regeln:
            
            if(y > 0 && y < 39 && x > 0 && x < 39) {
                if(!fields[x+1][y].active)n+=1;
                if(!fields[x-1][y].active)n+=1;
                if(!fields[x][y+1].active)n+=1;
                if(!fields[x][y-1].active)n+=1;
                if(!fields[x+1][y+1].active)n+=1;
                if(!fields[x+1][y-1].active)n+=1;
                if(!fields[x-1][y+1].active)n+=1;
                if(!fields[x-1][y-1].active)n+=1;
    
                if(fields[x][y].active) {
                    if(n == 3)fields[x][y].setInactive();
                }
                if(!fields[x][y].active){
                    if(n < 2)fields[x][y].setActive();
                    if(n > 3)fields[x][y].setActive();
                }
            }       
            if(x == 38 && y != 38) {
                x = 0;
                y += 1;
            }
            x += 1;
        }
    }


Die Funktion Tick wird alle 0.5 Sekunden ausgeführt
Ich wollte jetzt fragen ob mir einer von euch erklären kann was ich falsch mache.

Download als .jar (JAVA benötigt) zum testen:
MEDIAFIRE

Steuerung:
Klicken um ein Feld aktiv zu setzen.
SPACE um zwischen Pause und laufend zu wechseln.
Meine verfügbaren Spiele:


GodMode(Android)


Spiele/Apps in Planung:


PixelClicker(Android)

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

15.03.2014, 13:42

Das Problem besteht darin, dass du permanent auf dem angezeigten Feld arbeitest. Das heißt, Änderungen, die du für eine Zelle ausgeführt hast, werden direkt bei der Überprüfung aller danach bearbeiteten Zellen übernommen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

15.03.2014, 13:46

OK ich glaube ich weiß was du meinst. Meinst du ich sollte ein zweites Array erstellen was erst nach der for Schleife aktualisiert wird und auf das sich die Vergleiche beziehen?
Meine verfügbaren Spiele:


GodMode(Android)


Spiele/Apps in Planung:


PixelClicker(Android)

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

15.03.2014, 14:15

Pseudocode

Quellcode

1
2
3
4
5
6
7
8
9
Array Anzeige;
Array Berechnung;
Berechnung
    Für jedes Feld in Anzeige
        Berechne neuen Status
        Schreibe neuen Status in Berechnung
    Ende
Ende Berechnung
    Anzeige = Berechnung;
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

15.03.2014, 14:15

Zwei Arrays: fields und nextFields.
nextFields auf Basis von fields berechnen.
Danach fields und nextFields vertauschen (kein Kopieren notwendig, einfach die Variablen vertauschen).

6

15.03.2014, 14:23

Danke für die Hilfe, doch das Problem bleibt. Ich habe einfach ein zweites Feld fieldsO erstellt auf dessen Basis fields berechnet wird. Vor der For Schleife wird dann fieldsO komplett mit fields gleichgesetzt, damit sich nichts während des berechnens verschiebt. Die neue Funktion:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void tick() {
        int x = 0;
        int y = 0;
        fieldsO = fields;
        for(int i = 0;i<1600;i++){
            
            int n = 0;
            
            
            //Conway regeln:
            
            if(y > 0 && y < 39 && x > 0 && x < 39) {
                if(!fieldsO[x+1][y].active)n+=1;
                if(!fieldsO[x-1][y].active)n+=1;
                if(!fieldsO[x][y+1].active)n+=1;
                if(!fieldsO[x][y-1].active)n+=1;
                if(!fieldsO[x+1][y+1].active)n+=1;
                if(!fieldsO[x+1][y-1].active)n+=1;
                if(!fieldsO[x-1][y+1].active)n+=1;
                if(!fieldsO[x-1][y-1].active)n+=1;
    
                if(fieldsO[x][y].active) {
                    if(n == 3)fields[x][y].setInactive();
                }
                if(!fieldsO[x][y].active){
                    if(n < 2)fields[x][y].setActive();
                    if(n > 3)fields[x][y].setActive();
                }
            }       
            if(x == 38 && y != 38) {
                x = 0;
                y += 1;
            }
            x += 1;
        }
    }
Meine verfügbaren Spiele:


GodMode(Android)


Spiele/Apps in Planung:


PixelClicker(Android)

7

15.03.2014, 14:26

Achso und nicht wundern bei

Quellcode

1
if(!fieldsO.active)
ist die Variable Active immer umgekehrt deshalb das "!". Blöd gelöst ich weiß.
Meine verfügbaren Spiele:


GodMode(Android)


Spiele/Apps in Planung:


PixelClicker(Android)

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

15.03.2014, 14:27

...
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

9

15.03.2014, 14:38

...

Was meinst du jetzt genau?
Meine verfügbaren Spiele:


GodMode(Android)


Spiele/Apps in Planung:


PixelClicker(Android)

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

15.03.2014, 14:41

Das war ein Gedanke, der sich im Nachhinein (nach deinem zweiten Post) als Unsinn herausgestellt hat. Leider kann man hier keine Beiträge löschen, auch nicht innerhalb einer kurzen Zeitspanne nach der Erstellung (wäre das nicht was, David?)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige