Life

Das Spiel des Lebens mit Zellulären Automaten

Steuerung

Zellen: 20x20px
Breite: 15 Zellen
Höhe 10 Zellen
Wartezeit: 1000 ms




Aktuelle Daten

 
Anzahl
Anteil
Schritt
0
 
Zellen
0
100.0%
Lebend
0
?
Tot
0
?
Mit Klick auf eine Zelle wird ihr Zustand umgekehrt.


Links

Wikipedia: Life - Das Spiel des Lebens von John Horton Conway
Basic-Modul → Life.bas (provisorisch)


Verwandte Themen


Life-Algorithmus


Darunter kann man selbstständige Objekte (Zellen) verstehen, die auf ihre Umgebung nach einem festgelegten Programm reagieren.
Die Regeln (Zell-Programme) von Life sind besonders einfach, die Resultate aber gerade deswegen so erstaunlich.



Im einfachsten Fall gibt es keinen 'Rand', d.h. das Spielfeld ist unendlich groß.

In der Realität ist jedes Spielfeld begrenzt. Man muss daher zusätzliche Regeln für Zellen festlegen, die lediglich 5 oder 3 Nachbar-Zellen haben.

Alternativ kann man das Spielfeld falten (so wie im ↑ Beispiel am Beginn dieser Seite): Gegenüberliegende Ränder werden zusammengeführt. Wenn eine Struktur nach rechts 'auswandert' dann betritt sie das Modell von Links usw.



Eine lebende Zelle mit 2 oder 3 lebenden Nachbarn bleibt im nächsten Schritt am Leben.

Eine lebende Zelle mit mehr als 3 lebenden Nachbarn stirbt im nächsten Schritt.


Modelle mit zellulären Automaten lassen sich mit Computern besonders gut berechnen. In der Praxis werden viele Aufgaben so berechnet, z.B. die Wetter-Vorhersage.
Diese Modelle enthalten meist eine sehr große Anzahl von Zellen sowie wesentlich mehr und kompliziertere Regeln.
Das Beispiel → Farb-Zellen demonstriert die einfache Simulation von Transport-Vorgängen, Diffusion und Zerfall.

Life mit Tabellen-Kalkulation + Basic


Man kann ein fertiges Basic-Modul mit allen notwendigen Programmen laden und damit in wenigen Minuten ein Life-Beispiel herstellen.

Alternativ kann man den Algorithmus selbst mit Basic programmieren: Das ist eine interessante Aufgabe für mäßig fortgeschrittene EntwicklerInnen.


(2) Basic-Modul

Öffnen sie ein vorhandenes Basic-Modul oder (besser) legen sie ein neues Basic-Modul an.
Kopieren sie den Basic-Quelltext in das Modul:
▶ Download des Basic-Moduls Life.bas
Derzeit ist das Modul nur in einer Version für MS-Excel verfügbar. Eine portable Version ist in Arbeit.


(4) Daten und Formatierung

Markieren sie das Spielfeld und stellen sie eine beliebige Hintergrund-Farbe ein, z.B. hellrot. Das Spielfeld sollte nun deutlich erkennbar sein.

Tragen sie die Zahl 0 in eine Zelle ein, kopieren sie diese und setzen sie in das gesamte Spielfeld ein.

Bedingte Formatierung: Tragen sie in eine Zelle die Zahl 1 ein. Legen sie für diese Zelle eine Bedingte Formatierung an. In LibreOffice oder OpenOffice MenÜ Format / Bedingte Formatierung, in MS-Excel je nach Version unterschiedlich.
Tragen sie als Bedingung ein: Zellwert > 0
In LibreOffice oder OpenOffice legt man für die Bedingung eine eigene (neue) Vorlage an, in MS-Excel trägt man direkt die gewünschte Formatierung für den Hintergrund ein, z.B. hellgrün. Kopieren sie die Zelle und tragen sie das Format in alle Zellen des Spielfelds ein.

Test: Tragen sie in verschiedene Zellen die Zahlen 0 oder 1 ein: Die Farbe sollte sich passend zum Wert ändern.



In MS-Excel muss man in neueren Versionen erst das benötigte Menü einschalten: Menü Datei / Optionen / Menüband anpassen / Hauptregisterkarten / EntwicklerTools / Aktivieren.
Danach ist der manuelle Start möglich, leider ebenfalls je nach Version unterschiedlich, z.B. mit Menü Extras / Makro / Makros / Life_Init / Ausführen oder mit Menü Entwicklertools / Makros / Life_Init / Ausführen.

Das Basic-Programm sollte in alle Zellen des Modells die Zahl 0 eintragen.
Man kann auch alle anderen Programme des Basic-Moduls so ausführen. Das ist jedoch für die Praxis zu kompliziert, deshalb werden bequeme Bedienungs-Elemente angelegt.



Das Anlegen von Buttons ist etwas kompliziert, für die meisten AnwenderInnen jedenfalls ungewohnt:

Klicken sie einen dieser Buttons, um die detaillierten Anweisungen anzuzeigen für
   



Taste Mutation ändert den Zustand weniger zufällig ausgewählter Zellen. In einem kleinen Spielfeld kann es sein, dass gar keine Zelle geändert wird.

Taste Schritt führt einen Schritt des Conway-Algorithmus aus. Das ist nur sinnvoll, wenn es mindestens 1 lebende Zelle gibt. Erst ab >3 benachbarte lebenden Zellen sind mehrere Schritte möglich. Außerdem gibt es stabile Strukturen, die nach einem Life-Schritt keine Änderung zeigen, z.B. ein Quadrat aus 4 Zellen.



Lebende Zellen: Absolut mit Standard-Funktion =SUMME(Life) oder mit der Basic-Funktion =Life_Alive_Get(ZUFALLSZAHL())
Relativ mit =SUMME(Life)/ANZAHL(Life) und Formatierung als Prozentzahl.

Tote Zellen mit =ANZAHL(Life)-Summe(Life) oder mit Basic-Funktion =Life_Dead_Get(ZUFALLSZAHL())

Schritt-Zähler mit Basic-Funktion =Life_Counter_Get(ZUFALLSZAHL())

Basic



Tipp 3: Der Rand des Modells wird zunächst nicht berücksichtigt. Dazu kann man z.B. den Algorithmus nur für die innerhalb liegenden Zellen berechnen (die je 8 Nachbarn haben).

Tipp 4: Die Berücksichtigung des Randes ist eine wesentlich schwierigere Aufgabe: Man muss sicherstellen, dass keine Array-Elemente außerhalb des definierten Bereichs verwendet werden.
Eine weitere Komplikation ist die Faltung des Spielfelds: Rechter und linker Rand werden zusammengeführt, ebenso oberer und unterer Rand.
Wirkung (so wie im Modell am ↑ Beginn dieser Seite): Wenn eine Sturktur nach rechts 'auswandert', dann tritt sie von links wieder in das Modell ein usw.



Das 1.Argument von Cells() bezeichnet die Reihe, das 2.Argument die Spalte (Achtung auf Verwechslung !)

So kann man Werte in die Zellen eines Bereichs schreiben:
Sub Cell_Write()
Dim r As Range
Set r = Range("A1:B2")
Cells(1, 1).Value = 9999
End Sub
Vergessen sie bei der Zuweisung eines Bereichs nicht auf das vorangestellte Befehlswort Set !


Das Modul enthält einfachen, ungeschützten Quelltext. Man kann es daher gut studieren und kontrollieren.
Es ist jedoch auch leicht zu ändern. Daher ist Vorsicht geboten, wenn das Modul aus anderen Quellen geladen wird.

SVG Objekt-Grafik

Links wird der Quelltext jener Datei angezeigt, aus welcher ihr Browser das Bild der Objekt-Grafik am ↑ Beginn dieser Seite hergestellt hat. Dazu wird die 'Programmiersprache' → SVG verwendet.

Vorteile:
Objekt-Grafik besteht aus Anweisungen ('Befehlen'), die vom Client-Programm (Browser) ausgeführt werden. Der Webserver wird entlastet und daher schneller.
Die Grafik wird nur einmal vom Server angefordert. Die gesamte Steuerung und Animation erfolgt durch lokale Programme. Der Webserver wird dadurch besonders stark entlastet.

Das SVG-Programm wird hier nur in groben Zügen kommentiert:

Es beginnt mit einem <desc>-Element, welches beschreibende (Meta)-Daten enthält.

Ein → CSS <style>-Element enthält die wenigen notwendigen Regeln zur Formatierung.

Es folgt ein umfanfgreiches <script>-Element mit allen zur Steuerung und Animation notwendigen Programmen in der Programmiersprache → Javascript. (ca. 350 Zeilen)

Erst danach beginnt der 'eigentliche' Quelltext der verwendeten Grafik-Objekte: Es handelt sich ausschließlich um Objekte des Typs
<use xlink:href="#cell"/>
d.h. von Zellen, die als wiederverwendbares Element nur 1mal programmiert und - je nach Dimension - sehr oft verwendet wird.
Es wäre mühsam und wenig flexibel, diese Elemente für jede gewünschte Größe des Spielfeld individuell herzustellen. Diese Aufgabe wird daher von einem (anderen) Programm in der Programmiersprache ↓ PHP durchgeführt.

Mit diesem Link kann man die Objekt-Grafik auch alleinstehend (ohne diese Webseite öffnen: In diesem Fall werden die wichtigsten Bedienungs-Elemente als Buttons unterhalb des Spielfelds angezeigt. In dieser Form kann man die Grafik als Datei *.svg am eigenen Arbeits-PC speichern und verwenden.

Steuerung des Life-Modells


Alle zur Fernsteuerung des Modells dienenden Programme sind in der Programmiersprache → Javascript erstellt, im Quelltext dieser Webseite enthalten und damit frei zugänglich.

Die Fernsteuerung des Modells ist besonders einfach, weil alle dazu notwendigen Programme im Quelltext der ↑ SVG-Datei enthalten sind.
In dieser Webseite sind darüber hinaus einige Effekte programmiert, die etwas anspruchsvoller sind.


Buttons

Die wichtigsten Funktionen des Life-Modells werden mit HTML <button>-Elementen gesteuert, z.B. mit
<button onclick="life.life_single_step()">
Einzelschritt
</button>

Jeder Button enthält ein onclick-Attribut. Damit wird angegeben, welche Javascript-Funktion beim Anklicken ausgeführt werden soll - Im Beispiel die Funktion life_single_step()

Die Funktionen zur Steuerung sind jedoch nicht in dieser Webseite enthalten sondern im eingebetteten SVG-Dokument. Daher muss man vor der Funktion den Namen des eingebetteten Dokuments angeben, und zwar genauso wie im name-Attribut des einbettenden <iframe>-Elements (links).

Die Objekt-Grafik enthält ebenfalls einige Buttons: Sie werden nur dann angezeigt, wenn man die Grafik alleinstehend (ohne diese Webseite) verwendet.



Alle Regler werden in ein HTML <form>-Element (Formular) eingebettet. Das onchange-Attribut gibt an, welche Javascript-Funktion bei einer interaktiven Änderung des Reglers zu starten ist (hier do_f1() )

Die Javascript-Funktion (Onchange-Handler) liest die aktuellen Werte aller Eingabe-Elemente:
var a = parseInt(document.f1.a.value);
life.ani_ms = a;
Der Wert des Reglers wird an die Variable a des eigenen Dokuments zugewiesen, danach an die Variable ani_ms des eingebetteten SVG-Dokuments.

Manche Änderungen erfordern es, die Grafik komplett neu zu zeichnen, z.B. bei Änderung der Größe des Spielfelds.
In diesem Fall muss die Funktion (Onchange-Handler) das Formular absenden und damit die Grafik neu anfordern:
document.life.submit();

Details zur → Programmierung eines Schiebereglers


Diese Funktion wird vom Modell (der SVG-Grafik) nach jedem berechneten Schritt des Algorithmus ausgeführt:
function parent_info() {
var obj={step:step_counter, total:cells_total,
alive:cells_alive, dead:cells_dead, min_alive:min_alive, max_alive:max_alive, ani:ani_do};
try{ parent.life_info_handler(obj); } catch(e) {}
}

Die aktuellen Daten werden in der Objekt-Variablen obj gesammelt. Sie enthält mehrere Daten in der Form name:wert
Danach wird die Funktion life_info_handler() des Parent-Dokuments (=dieser Webseite) aufgerufen. Es ist Aufgabe dieser Funktion, damit sinnvoll umzugehen (hier: Die Daten digital anzuzeigen).

Es ist nicht sicher, ob das Parent-Dokument eine Funktion dieses Namens enthält. Daher wird die Anweisung in einen try{}-Block eingebettet. Der catch{}-Block bleibt leer: Wenn ein Fehler auftritt, wird dieser einfach ignoriert.

Herstellung der Objekt-Grafik mit PHP

Links wird der Quelltext jenes Programms in der Programmiersprache PHP angezeigt, mit dem am Webserver der Text der SVG.Objekt-Grafik erzeugt wurde.

Dieses Programm wird jedesmal am Webserver ausgeführt, wenn die Grafik von einem Client angefordert wird.

Man könnte den ↑ SVG-Quelltext auch als 'statische' Text-Datei am Server speichern und damit Server Leistung einsparen. Das wäre jedoch unflexibel, weil man in jeder Datei nur ein Spielfeld fixer Größe zur Verfügunbg stellen kann. Mit PHP wird je nach Anforderung ein Spielfeld beliebiger Größe erzeugt.

Ein weiterer Vorteil ist die Einsparung jener mühseligen Arbeit, um eine große Anzahl fast identischer SVG-Code-Zeilen für die einzelnen Zellen zu erzeugen.
Das PHP-Programm erledigt diese Arbeit unabhängig von der Größe des Spielfelds in nur 10 Zeilen (am Ende des Programms, komentiert mit // Draw cell‑grid

Das PHP-Programm ist relativ einfach:

Anfangs werden die erhaltenen → GET-Argumente decodiert. Damit wird die gewünschte Größe der Zellen und des Spielfelds angegeben.

Danach folgt fast nur statischer Text, der unverändert zum Client weitergegeben wird.

Erst zuletzt folgt die verschachtelte for-Schleife, mit welcher die Zellen der Grafik (#cell) erzeugt werden.

Nach den Zellen des Modells sind noch einige Buttons zur interaktiven Bedienung programmiert. Dieser Abschnitt (// Control-buttons) wird nur angefügt, wenn das GET-Argument $GET['buttons'] angegeben wurde.