Logo Logo
InfoHome Themen Projekte Links Software
Themen
JavaHamster
BlueJ
Java
Sprachelemente
Abstrakte Datentypen
Swing
Composite Pattern
AWT > Swing
GUI-Grundstruktur
Farben und Fonts
Layout-Manager
Komponenten 1
Komponenten 2
Komponenten 3
Container
Observer Pattern
Ereignisverarbeitung
MVC-Pattern
Game Of Life
Threads
Aufgaben
Sortieren
HTML
XHTML
CSS
XML
Datenbanken
MySQL
Theoretische Informatik
PHP
Kara
Lego-Roboter
Algorithmen

John Conway's Game of Life

Conways Spiel des Lebens (nicht zu verwechseln mit dem gleichnamigen Familienspiel Spiel des Lebens) ist ein von dem Mathematiker John Horton Conway 1970 entworfenes System zweidimensional angeordneter zellulärer Automaten.

Das Spielfeld

Das Spielfeld ist in Zeilen und Spalten unterteilt und im Idealfall unendlich groß. Jedes Quadrat ist ein Zellulärer Automat (Zelle), der einen von zwei Zuständen einnehmen kann, welche oft als lebendig und tot bezeichnet werden. Zunächst wird eine Anfangsgeneration von lebenden Zellen auf dem Spielfeld platziert. Jede lebende oder tote Zelle hat auf diesem Spielfeld genau acht Nachbarzellen, die berücksichtigt werden. Die nächste Generation ergibt sich durch die Befolgung einfacher Regeln.

Die Spielregeln

Die Folgegeneration wird für alle Zellen gleichzeitig berechnet und ersetzt die aktuelle Generation. Der Zustand einer Zelle, lebendig oder tot in der Folgegeneration hängt nur vom Zustand der acht Nachbarzellen dieser Zelle in der aktuellen Generation ab.

Die von Conway zu Anfang verwendeten Regeln sind:

  • Eine Zelle mit genau drei lebenden Nachbarn wird in der Folgegeneration neu geboren (birth).

    rot: Tote Zelle, die in der nächsten Generation geboren wird; grün: Nachbarn der Zelle

  • Lebende Zellen mit weniger als zwei lebenden Nachbarn sterben in der Folgegeneration an Einsamkeit (death by isolation).

  • Lebende Zellen mit mehr als drei lebenden Nachbarn sterben in der Folgegeneration an Überbevölkerung (death by overcrowding).

    magenta: Zelle, die in der nächsten Generation sterben wird; grün: Nachbarn der Zelle

Mit diesen drei einfachen Regeln entsteht aus bestimmten Anfangsmustern im Laufe des Spiels eine Vielfalt komplexer Strukturen. Einige bleiben unverändert, andere oszillieren und wieder andere wachsen oder vergehen. Manche Strukturen, sogenannte Gleiter (gliders), bewegen sich auf dem Spielfeld fort.

Es existieren weitere Varianten des Game of Life, bei denen Conways Regeln geändert oder ergänzt werden.

Realisierung als Java-Applikation nach MVC-Pattern

Hier einige Vorgaben, die die Funktionalität der einzelnen Komponenten näher spezifizieren sollen:

Model

Im Model-Objekt ist der derzeitige Zustand der Zellen der Zellkolonie in Form einer Boolschen Matrix gespeichert. Weitere Instanzvariablen sollten die Anzahl der Zeilen und Spalten der Matrix sein. Neben dem Konstruktor sind vor allem folgende Methoden zu implementieren:

  • Die Methode int numberOfNeighbors(int x, int y) berechnet die Anzahl der lebenden Nachbarzellen der Zelle an der Stelle (x,y) innerhalb der Matrix.
  • die Methode nextGeneration() berechnet aus der alten Zellmatrix die neue Zellmatrix,
  • die Methode invertCell(int x, int y), die den Zustand einer Zelle umkehrt, also aus tot lebendig und aus lebendig tot macht,
  • die Methode clear() versetzt die Matrix in einen ganz und gar leblosen Anfangszustand,
  • die Methode randomFill() füllt die Matrix zufällig mit Boolschen Werten.

Es ist weiterhin zu beachten, dass sich an unserem Model-Objekt Observer registrieren lassen müssen. Damit muss die Model-Klasse von der Klasse Observable abgeleitet werden. Nach jeder Modifikation an der Zellmatrix müssen die Observer (bei uns das View-Objekt) benachrichtigt werden.

View

Das View-Objekt sorgt für die grafische Darstellung der Zellkolonie und ist Observer des Model-Objekts (Observer-Interface implementieren). Bei jeder Änderung des Model-Objektes bekommt das View-Objekt einen Zeiger auf das Model-Objekt übergeben. Das View-Objekt soll in Form eines Custom-JPanels realisiert werden. Dabei wollen wir die Zellmatrix mit Hilfe der JComponent-Methode (JPanel ist Unterklasse von JComponent) paintComponent(Graphics g) zeichnen. Innerhalb dieser Methode kann man mittels g.drawLine() bzw. g.fillRect() Linien bzw. Rechtecke zeichnen (das Objekt g repräsentiert quasi die Zeichenfläche). Die Methode paintComponent() wird bei Erzeugung des View-Objektes automatisch aufgerufen. Innerhalb des Konstruktors sollte die Größe unseres Custom-JPanels mit Hilfe eines Dimension-Objektes und der Methode setPreferredSize() so festgelegt werden, dass die Matrix auch vollständig angezeigt wird. Die Observer-Methode update() können wir später mit Inhalt füllen. Erzeugt zu Testzwecken einfach selbst eine Boolsche Matrix, die euer View-Objekt visualisieren kann.

Controller

Hier wird die Benutzeroberfläche unserer Applikation zusammengebaut. Folgende Benutzereingaben sollten vorgesehen werden:

  • Eingabe der Anzahl der Reihen und Spalten der Zellmatrix,
  • Leeren der Matrix,
  • Auswahl eines 'schönen' Anfangspatterns per Auswahlliste, die Anfangspattern (einfache, kleine Pattern auswählen) zunächst mal direkt in Boolschen Matrizen speichern,
  • Zufälliges Füllen der Zellmatrix,
  • Schrittweise Animation,
  • Generations-Counter,
  • Einstellen eines Zoomfaktors (Angabe der Seitenlänge eines Zellquadrats in Pixeln),
  • Automatisierte Animation mit steuerbarer Geschwindigkeit (mit Hilfe eines Threads SPÄTER),
  • ein Menü, über das SPÄTER Pattern in einer Datei gespeichert bzw. aus einer Datei nachgeladen werden können, usw.

Neben dem Erzeugen und Zusammensetzen der Komponenten müssen die entsprechenden Listener implementiert werden. Im Konstruktor muss außerdem das View-Objekt beim Model-Objekt mittels addObserver() als Oberserver registriert werden. Als LayoutManager für die contentPane eigent sich wohl am besten das GridBagLayout.

» drucken: pdf | html

© 2004-2024 M. Blanke · Ursulaschule · Kleine Domsfreiheit 11-18 · 49074 Osnabrück