Wie kann es nur sein, dass der Klassiker vergessen wurde
Eingereicht von Tarantoga
Es gibt ein Spielfeld, auf dem Zellen "leben". Nach einiger Zeit ist der Lebenszyklus der Zellen vorbei und die Zeit der nächsten Generation bricht an (simpel gesagt: nächste Runde). Dann wird die neue Zellgeneration so berechnet:
- eine Zelle wird dann geboren, wenn sie genau drei lebende Nachbarn hat
- eine Zelle stirbt, wenn sie weniger als 2 lebende Nachbarn hat
- eine Zelle bleibt weiterhin am leben, wenn sie 2 oder 3 lebende Nachbarn hat
- Zellen mit mehr als 3 lebenden Nachbarn sterben an Überbevölkerung
Einfach:
In der einfachsten Variante reicht es aus, ein Feld von einer vorgegebenen Maximalgröße zu haben und die Startgeneration im Code "fest" einzutragen.
Als Ausgabe darf eine Konsole/Datei genommen werden.
Fortgeschritten:
Fortgeschrittene Variante soll ein (theoretisch) unendliches Spielfeld haben und die Startgeneration aus einer Textdatei einlesen.
Das Format ist auf "benutzerfreundlichkeit" getrippt und arbeitet nur mit ASCIIs:
Leerzeichen für "nichts" und "X" für eine Zelle:
damit lassen sich schon Positionen (relativ zu den anderen Zellen) festlegen und ihr müsst euch ein wenig Gedanken machen, wie man das am geschicktesten einliest
Auch hier: Ausgabe über Konsole/Datei reicht aus, allerdings muss man sich überlegen, nicht das gesamte (unendliche) Spielfeld auszugeben, sondern nur den relevanten Ausschnitt mit den Zellen .
Der Ausschnitt darf aber eine feste Größe haben (also z.B 80x50 und ähnliches) und den nicht mehr "hineinpassenden" Teil des Feldes weglassen. Es geht hier eigentlich nur darum, nicht einfach stumpf die ersten x Position anzuzeigen (egal ob leer, oder mit Zellen gefüllt), sondern die Ausgabe "intelligent" auf die vorhanden Zellen zu "setzen"
Beispielausgabe auf der Konsole (die als ASCII gespeichert auch als Eingabe für den Startzustand benutzt werden kann)
"Schwer"
die "schwere" Variante hat zusätzlich zu allen Funktionen eine hübsche grafische Ausgabe (Applet/Fenster/WebSeite usw). Dabei sollte unbedingt bedacht werden, dass es auch so genannte "Glider" gibt:
also "Objekte", die sich von der großen "Zellmasse" losmachen und auf "Reisen" gehen.
Hierzu sollte man sich überlegen, wie man eine halbwegs benutzerfreundliche Anzeige umsetzt (das strickte Wegzoomen geht ja nur bis zur eine gewissen Grenze, das simple Scrollen auf dem Feld kann auch alles andere als einfach sein, wenn die Zellen zu weit auseinander liegen - also wird man sich zumindest eine Kombination überlegen müssen ).
Zusätzlich kann man sich einige Gedanken zu seinem verwendeten Algorithmus machen - insbesondere für sehr große Felder. Auf Wunsch kann ich ein 500x500 Feld freigeben, bei dem man nach X Runden eine vordefinierte Ausgabe erhält und die Laufzeit sich sehr deutlich je nach verwendetem Algorithmus unterscheidet.
Eingereicht von Tarantoga
d.h:Die Aufgabe wäre es eine Anwendung zu schreiben, bei der man eine Ausgangskonfiguration von "lebenden" Zellen einstellen kann & dann, anhand von 4 einfachen Regeln, die Folgegenerationen berechnen kann.
Verschiedene Schwierigkeitsgrade wären auch denkbar, z. B. kann man die Ausgabe ganz simpel in der Konsole als eine Folge aus 0en und Xen darstellen, animiert in einem Applet oder animiert im Fenster einer stand-alone Applikation...
Die Regeln gibt's bei Wikipedia:
http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens
Es gibt ein Spielfeld, auf dem Zellen "leben". Nach einiger Zeit ist der Lebenszyklus der Zellen vorbei und die Zeit der nächsten Generation bricht an (simpel gesagt: nächste Runde). Dann wird die neue Zellgeneration so berechnet:
- eine Zelle wird dann geboren, wenn sie genau drei lebende Nachbarn hat
- eine Zelle stirbt, wenn sie weniger als 2 lebende Nachbarn hat
- eine Zelle bleibt weiterhin am leben, wenn sie 2 oder 3 lebende Nachbarn hat
- Zellen mit mehr als 3 lebenden Nachbarn sterben an Überbevölkerung
Einfach:
In der einfachsten Variante reicht es aus, ein Feld von einer vorgegebenen Maximalgröße zu haben und die Startgeneration im Code "fest" einzutragen.
Als Ausgabe darf eine Konsole/Datei genommen werden.
Fortgeschritten:
Fortgeschrittene Variante soll ein (theoretisch) unendliches Spielfeld haben und die Startgeneration aus einer Textdatei einlesen.
Das Format ist auf "benutzerfreundlichkeit" getrippt und arbeitet nur mit ASCIIs:
Leerzeichen für "nichts" und "X" für eine Zelle:
Code:
X X
XXX
X
Auch hier: Ausgabe über Konsole/Datei reicht aus, allerdings muss man sich überlegen, nicht das gesamte (unendliche) Spielfeld auszugeben, sondern nur den relevanten Ausschnitt mit den Zellen .
Der Ausschnitt darf aber eine feste Größe haben (also z.B 80x50 und ähnliches) und den nicht mehr "hineinpassenden" Teil des Feldes weglassen. Es geht hier eigentlich nur darum, nicht einfach stumpf die ersten x Position anzuzeigen (egal ob leer, oder mit Zellen gefüllt), sondern die Ausgabe "intelligent" auf die vorhanden Zellen zu "setzen"
Beispielausgabe auf der Konsole (die als ASCII gespeichert auch als Eingabe für den Startzustand benutzt werden kann)
Code:
XX XX
XX XX
XX
X X
XX
XXX
X X
XX XXX
XX XX
X X XXX
X X XX X X
X XX XXX
XX XX
XX
XX X X
XX XX
XX
XX
XX X
XX XXXX XX XX XXX
XX XX XXX XX XXXX
X XX
"Schwer"
die "schwere" Variante hat zusätzlich zu allen Funktionen eine hübsche grafische Ausgabe (Applet/Fenster/WebSeite usw). Dabei sollte unbedingt bedacht werden, dass es auch so genannte "Glider" gibt:
also "Objekte", die sich von der großen "Zellmasse" losmachen und auf "Reisen" gehen.
Hierzu sollte man sich überlegen, wie man eine halbwegs benutzerfreundliche Anzeige umsetzt (das strickte Wegzoomen geht ja nur bis zur eine gewissen Grenze, das simple Scrollen auf dem Feld kann auch alles andere als einfach sein, wenn die Zellen zu weit auseinander liegen - also wird man sich zumindest eine Kombination überlegen müssen ).
Zusätzlich kann man sich einige Gedanken zu seinem verwendeten Algorithmus machen - insbesondere für sehr große Felder. Auf Wunsch kann ich ein 500x500 Feld freigeben, bei dem man nach X Runden eine vordefinierte Ausgabe erhält und die Laufzeit sich sehr deutlich je nach verwendetem Algorithmus unterscheidet.