Conway's Game Of Life



  • Guten Tag Community,

    ich habe in C# .NET Conway's Spiel des Lebens programmiert. Es ist nicht viel Code, aber ich wollte euch mal drüber schauen lassen und mir eure Meinung dazu anhören.
    http://uploaded.to/file/jolgw4gv
    Bei diesem Download ist der kommentierte Source Code und die ausführbare Exe (Vorraussetzung .NET 3.5) enthalten.
    Positive als auch negative Kritik ist erwünscht.

    Mit freundlichen Grüßen,
    Freaky



  • Hi.

    Ist ja wirklich nicht viel Code.
    So ein paar Sachen auf den ersten Blick:

    Das Cells Property würde ich vielleicht nicht public machen.

    Stattdessen:

    public class Field : IEnumerable<Cell>
    {
    	private Cell[,] Cells;
    
    	public IEnumerator<Cell> GetEnumerator()
    	{
    		return Cells.OfType<Cell>().GetEnumerator();
    	}
    }
    

    Dann in main:

    foreach (Cell c in f){}
    

    Weiter würde mir ein Timer besser als Thread.Sleep gefallen.
    Und natürlich eine kleine Winforms-Oberfläche. Das Neuzeichnen in der Console dauert schon sehr lange und sieht nicht ansprechend aus.

    Das größte Problem ist aber imho die ganze Verwaltung der Daten. Jede Zelle kenn ihre Position (X,Y) und
    die Anzahl ihrer Nachbarn. Letzteres wird aber von außen in jedem Frame neu gesetzt (nicht schön). Nun steckt genau die gleiche Information
    aber auch in Cell[,]. Bin mir sicher hier findet sich eine elegantere Lösung.



  • Hallo µ,
    danke erstmal für deine Rückmeldung.

    Cells private zu setzen und einen Enumerator zu implementieren, hatte ich auch schon. Nur hatte ich eine neue Klasse FieldEnumerator geschrieben, die den kompletten Enumerator implementiert. Das hatte aber mehr Probleme mit sich gebracht, als es geholfen hat und es hat das Programm spürbar langsamer gemacht. Deine Variante klappt aber gut. Danke dafür.
    Der Code in der Main() dient nur zu Testzwecken, ob das Spiel läuft. Natürlich wäre eine bessere Visualisierung angebracht, aber es ging mir hauptsächlich darum, dass Spiel selbst zu programmieren. Auf das Äußere habe ich nicht viel Wert gelegt, darunter auch das Sleep. Hätte ich es richtig veröffentlichen wollen, hätte ich natürlich geschaut, dass ich etwas schönes mit WPF oder sonstigem hinbekomme.
    Was du aber mit deiner letzten Aussage meinst, weiß ich noch nicht so genau. Die Nachbarn werden doch nur innerhalb der Klasse geändert. Könntest du bitte ein bisschen näher beschreiben, was du meinst?

    Mit freundlichen Grüßen



  • Sorry, vergessen.
    Ist das hier noch aktuell?

    Mich hat gestört, dass die Position in Cell.X/Cell.Y aber auch in dem Cells-Array gespeichert wurde. Die Speicherredundanz ist mir egal, die Fehleranfälligkeit was die Logik bei solchen Entwürfen betrifft aber nicht.
    Das betrifft, wenn ich mich richtig erinnere, auch die Nachbarschaftsbeziehung. Wenn auch indirekter. Die Nachbarn sind im dem Array kodiert, trotzdem gibt es in dder Cell-Klasse ein Feld für die Anzahl der Nachbarn. Der Wert kommt dann in jedem Frame von außen. Mir gefällt das alles nicht so richtig.

    Soweit ich das in Erinnerung habe (hab den Code jetzt nicht hier und keine Lust ihn nochmal runterzuladen ;)), gab es nur ein relevantes Datenfeld in Cell.
    Und da Cell als reine Datensammlung aufgebaut ohne eigene Logik ist, könntest Du auf die Klasse auch verzichten.




Log in to reply