nochn Game of Life

Code-Stücke können hier veröffentlicht werden.
Antworten
Mr. Q
User
Beiträge: 10
Registriert: Freitag 5. Oktober 2007, 19:48

Guten Tag,
ich habe mich an Conways 'Game of Life' versucht und ehrliche und grundliche Fehlersuche betrieben. Aber komme nicht mehr weiter, Es werden zellen geboren wo keine hingeboren werden sollen ...

hier der Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
Liste0 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]     #Feld das angezeigt wird( 1=lebende Zelle, 0=tote Zelle)
Liste1 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
Liste2 = [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0]
Liste3 = [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0]
Liste4 = [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0]
Liste5 = [0,0,0,0,0,0,0,0,0,0,1,0,1,0,0]
Liste6 = [0,0,0,0,0,1,0,0,0,0,1,1,0,0,0]
Liste7 = [0,0,0,0,0,1,0,0,0,0,0,1,0,0,0]
Liste8 = [0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]
Liste9 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

Oberliste = [Liste0, Liste1, Liste2, Liste3, Liste4, Liste5, Liste6, Liste7, Liste8, Liste9]


HgListe0 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]     #Feld das die nächste Generation vormerkt
HgListe1 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe2 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe3 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe4 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe5 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe6 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe7 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
HgListe9 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

HgOberListe = [HgListe0, HgListe1, HgListe2, HgListe3, HgListe4, HgListe5, HgListe6, HgListe7, HgListe8, HgListe9]


for a in range(0, 3):   # Zahl der Generationen(hängt schon bei 3)             
     for i in range(0,10):   #für jede Zeile
        print Oberliste[i]     #Feld ausgeben
     	for j in range(0,15):#für jede Spalte
     		s=Oberliste[(i-1)%10][(j-1)%15]+Oberliste[(i-1)%10][j]+Oberliste[(i-1)%10][(j+1)%15]+Oberliste[i][(j-1)%15]+Oberliste[i][(j+1)%15]+Oberliste[(i+1)%10][(j-1)%15]+Oberliste[(i+1)%10][j]+Oberliste[(i+1)%10][(j+1)%15]   #Anzahl der belebten Nachbarzellen zählen
                if Oberliste[i][j]==1:                                 #Entscheiden ob Zelle überlebt
                	if s < 2: HgOberListe[i][j]=0
                	elif s > 3: HgOberListe[i][j]=0
               	        else: HgOberListe[i][j]=1
	        if Oberliste[i][j]==0:                                  #Entscheiden ob Zelle geboren wird
	        	if s ==3: HgOberListe[i][j]=1
                        else: HgOberListe[i][j]=0
     for g in range(0,10): Oberliste[g]=HgOberListe[g]    #vorgemerkte Generation wird akruelle Generation
     os.system ( "clear") Bildschirm löschen
BlackJack

@Mr. Q: Ein Problem ist auf jeden Fall in Zeile 45. Ab da enthalten `Oberliste` und `HgOberliste` die selben Listen, d.h. die Zuweisungen in den Zeilen 39 bis 41 wirken sich auf den Inhalt von `HgOberliste` *und* `Oberliste` aus.

Ansonsten ist die Namensgebung und die Formatierung des Quelltextes nicht PEP8-Konform.

Die durchnummerierten Listennamen sind überflüssig und der Code enthält zuviele "magische Zahlen".
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hier ein kleines Beispiel, wie man über die 3x3 Felder iterieren kann:

Code: Alles auswählen

for J in zip(field,field[1:],field[2:]):
  K=zip(*J)
  for M in zip(K,K[1:],K[2:]):
    midcell=M[1][1]; cellsalive=M.count(1)
    ...
Außerdem gibts hier http://codegolf.com/conways-game-of-life noch ne kleine Challenge mit erhöhtem Schwierigkeitsgrad. Das Feld ist hier nach allen Seiten offen und im Prinzip unendlich. Viel Glück.

Edit:
Was mir noch eingefallen ist: Das M.count(1) könnte evtl. nicht klappen, da für tuple nicht verfügbar. Also evtl. so: cellsalive=list(M).count(1)
Mr. Q
User
Beiträge: 10
Registriert: Freitag 5. Oktober 2007, 19:48

Danke für eure Designvorschläge, kann mir jetzt noch jemand sagen warum es nicht funktioniert bzw. wie es funktionieren würde?

@BlackJack
Es ist durchaus gewollt, dass HgOberListe und Oberliste ab Zeile 45 den gleichen Inhalt haben. Ich zähle die Nachbarn in Oberliste und schreibe die nächste Generation in HgOberListe. Würde ich Oberliste sofort umschreiben, würden die Zellen der nächsten Generation schon drinstehen wenn bei anderen Zellen noch gezählt wird. Falsche Nachbarn-Anzahlen wären dann vorprogrammiert. In Zeile 45 wird die neue Generation dann in Oberliste geschrieben.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Das Problem ist aber, das sie nicht nur den gleichen Inhalt haben, sondern tatsächlich die selben Listen (oder vielmehr die Referenzen auf die selben Listenobjekte) enthalten. Und dann passiert sowas hier:

Code: Alles auswählen

In [1]: a = [1,2,3,4,5]

In [2]: b = a

In [3]: b[2] = 9

In [4]: a
Out[4]: [1, 2, 9, 4, 5]


Edit: Sprachfehler korrigiert; gleiches != selbes (oder so ähnlich, ihr wißt schon ;) )
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Pekh hat geschrieben:Das Problem ist aber, das sie nicht nur den gleichen Inhalt haben, sondern tatsächlich die selben Listen (oder vielmehr die Referenzen auf die selben Listenobjekte) enthalten. Und dann passiert sowas hier:

Code: Alles auswählen

In [1]: a = [1,2,3,4,5]

In [2]: b = a

In [3]: b[2] = 9

In [4]: a
Out[4]: [1, 2, 9, 4, 5]


Edit: Sprachfehler korrigiert; gleiches != selbes (oder so ähnlich, ihr wißt schon ;) )
um das zu verhindern:

Code: Alles auswählen

>>> a = [1,2,3,4,5]
>>> a
[1, 2, 3, 4, 5]
>>> b = a[:]
>>> b
[1, 2, 3, 4, 5]
>>> b[2] = 9
>>> a
[1, 2, 3, 4, 5]
>>> b
[1, 2, 9, 4, 5]
the more they change the more they stay the same
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Mr. Q hat geschrieben:Danke für eure Designvorschläge, kann mir jetzt noch jemand sagen warum es nicht funktioniert bzw. wie es funktionieren würde?
Also Dein Code ist ziemlich eigenartig und würde mir keinen besonderen Spaß machen zu debuggen. Wenn ich Du wäre, würde ich mir eher überlegen, ob das der richtige Ansatz ist, das Problem zu lösen. Klar es gibt die Macht des Faktischen - soll heißen man ist oft nur ungern bereit einen eingeschlagen Weg zu verlassen. Aber in diesem Fall würde ich Dir es wirklich empfehlen.
Antworten