Seite 1 von 1

nochn Game of Life

Verfasst: Sonntag 30. August 2009, 11:06
von Mr. Q
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

Verfasst: Sonntag 30. August 2009, 11:17
von 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".

Verfasst: Sonntag 30. August 2009, 12:42
von hendrikS
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)

Verfasst: Samstag 19. September 2009, 07:48
von Mr. Q
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.

Verfasst: Samstag 19. September 2009, 08:15
von Pekh
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 ;) )

Verfasst: Samstag 19. September 2009, 09:42
von Dav1d
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]

Verfasst: Samstag 19. September 2009, 11:37
von hendrikS
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.