Conways Game of Life in Processing - ETH Zbaderjo/Game-of-Life_Un... · 2020. 4. 25. ·...

38

Transcript of Conways Game of Life in Processing - ETH Zbaderjo/Game-of-Life_Un... · 2020. 4. 25. ·...

  • Leitprogrammartige Unterrichtsunterlagen

    für den Informatikunterricht am Gymnasium

    Conways �Game of Life� in Processing

    Autor: Jörg BaderVersion: 14. November 2017Betreuer: Dr. Harald Pierhöfer

    Praktikum im Lehrdiplom Informatik

    ETH Zürich, Herbstsemester 2017

  • Conways �Game of Life� in Processing

    Jörg Bader, [email protected]

    Inhaltsverzeichnis

    Konzeption der Unterrichtsunterlagen i

    1 Sachanalyse i

    1.1 Einführung und Bedeutung im Unterricht . . . . . . . . . . . . . . . . . . i

    1.2 Nötiges Vorwissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i

    1.3 Zentrale Begri�e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii

    1.4 Literatur zu Arrays und Game of Life . . . . . . . . . . . . . . . . . . . . vi

    1.5 Re�exion zu einer Durchführung . . . . . . . . . . . . . . . . . . . . . . . vi

    2 Lernziele viii

    Unterrichtsunterlagen: �Game of Life� in Processing 1

    1 Einführung 2

    2 Die Regeln von Conways �Game of Life� 4

    3 Eine Umsetzung in Processing 7

    3.1 Aufbau des Programms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    3.2 Gra�sche Darstellung des Spielbretts . . . . . . . . . . . . . . . . . . . . 8

    3.3 Berechnung der nächsten Generation . . . . . . . . . . . . . . . . . . . . 9

    3.4 Selbsterklärungsaufgaben zum Programmcode . . . . . . . . . . . . . . . 11

    4 Weitere Aufgaben zu �Game of Life� 13

    4.1 Muster in �Game of Life� . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    4.2 Ausbau des Programms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    5 �Game of Life� in der Informatik 17

    6 Beispiellösungen der Aufgaben 19

  • 1 SACHANALYSE

    Konzeption der Unterrichtsunterlagen

    Im ersten Abschnitt dieser Arbeit werden die hier vertieften Inhalte zu mehrdimensio-nalen Arrays inhaltlich zusammengefasst und der Einsatz der Unterlagen im Unterrichtdidaktisch eingeordnet und begründet.

    1 Sachanalyse

    1.1 Einführung und Bedeutung im Unterricht

    Die vorliegenden Unterrichtsunterlagen geben eine Einführung zu Conways �Game of Li-fe�. Das Thema �Game of Life� ist anschaulich und motivierend und kann genutzt werden,die Informatik mit Fragestellungen aus Biologie, Chemie oder Philosophie zu verknüpfen.Der Fokus liegt auf der Umsetzung in Processing (ein Erfolgserlebnis für die Schülerin-nen und Schüler), hierbei wenden die Schülerinnen und Schüler ihr bereits theoretischerworbenes Wissen zu zweidimensionalen Arrays an. Inhaltliches Ziel ist die Erkenntnis,dass Automatisierung bei solcherlei Rechenproblemen unabdingbar ist. Weitherin dient�Game of Life� als zellulärer Automat als ein erstes einfach erscheinendes Beispiel einerabstrakten Rechnerarchitektur.

    Für die Behandlung der hier vorliegenden Unterlagen am Gymnasium ist eine gewis-se Abstraktionsfähigkeit nötig, wie sie Schülerinnen und Schüler des mathematisch-naturwissenschaftlichen Zweiges in der 11./12. Klassenstufe erlangt haben sollten. DieZielgruppe dieser Ausarbeitung ist eine solche Klasse im Ergänzungsfach Informatik,Details sind im Abschnitt 1.2 �Nötiges Vorwissen� zu �nden.

    Es sind viele Übungsaufgaben in die Sto�vermittlung eingearbeitet, für die ausführlicheLösungen angegeben werden. Für die Behandlung im Unterricht sind etwa drei Lektionenvorgesehen. Die Schülerinnen und Schüler können sich den Sto� mit den vorliegendenUnterlagen dabei selbständig in ihrem eigenen Tempo aneignen. Eine Zusammenfassungfür die Lehrperson �ndet sich im Abschnitt 1.3 �Zentrale Begri�e�.

    1.2 Nötiges Vorwissen

    Es wird vorausgesetzt, dass die Schülerinnen und Schüler mit der grundlegenden Syntaxder Programmiersprache Processing vertraut sind. Sie kennen die primitiven DatentypenInteger und Boolean, haben bereits im �Continuous Mode� einfache bewegte Gra�ken inProcessing implementiert und den Aufbau von Programmen sowie die Umsetzung einfa-cher Funktionen mit Rückgabewert verinnerlicht. Sie kennen die Grundlagen sequenti-eller Programmierung mit den Konzepten der Iteration und der Selektion. Insbesonderehaben die Schülerinnen und Schüler bereits mit if/else-Selektionen und for-Schleifen inProcessing gearbeitet.

    Die Schülerinnen und Schüler haben bereits das Konzept von Arrays kennengelernt undkennen einzelne Anwendungsmöglichkeiten. Sie können ein- und zweidimensionale Arraysin Processing deklarieren, initialisieren und diese mittels (verschachtelten) fro-Schleifenmit Werten belegen. Die Ausgabe der Arraywerte wurde bisher nur über den printlnBefehl in der Konsole geübt.

    i

  • 1.3 Zentrale Begri�e 1 SACHANALYSE

    1.3 Zentrale Begri�e

    In diesem Abschnitt wird die zu vermittelnde Theorie zusammengefasst und für dieLehrperson in einem breiteren Zusammenhang erläutert.

    Geschichte zellulärer Automaten und Turing-Berechenbarkeit

    Ein zellulärer Automat ist ein diskretes Rechnermodell, welches der Modellierung undSimulation zeitdynamischer Systeme dient. Ein zellulärer Automat besteht dabei aus ei-ner Menge von Zellen R (in einem d-dimensionalen Raum), die gewisse Zustände auseiner Zustandsmenge Q annehmen können. Der Zustand aller Zellen zu einem beliebigenZeitpunkt t ∈ N nennt sich Kon�guration qt und kann beschrieben werden durch eineAbbildung qt : R→ Q. Der Zustand einer Zelle x ∈ R zum Zeitpunkt t+1 hängt von denZellzuständen vorgegebener Nachbarzellen N(x) ⊆ R zum Zeitpunkt t ab. Üblicherweiseist die Anzahl der Nachbarzellen für jede Zelle gleich, n := |N(x)| für alle x ∈ R, und derneue Zustand wird für alle Zellen gleichzeitig nach denselben Zustandsübergangsregelnδ : Q×Qn → Q bestimmt. qt+1 ergibt sich also aus qt und δ. Im Allgemeinen müssen dieZustandsübergangsregeln nicht deterministisch sein. Bei stochastischen Zustandsüber-gangsregeln sind entsprechend auch die Zustandsabbildungen qt Zufallsvariablen.

    Zelluläre Automaten wurden zuerst in den Vierzigerjahren des zwanzigsten Jahrhundertsdurch Stanislaw Ulam und John von Neumann beschrieben.

    Zelluläre Automaten sind trotz ihrer einfachen Struktur ein mächtiges Modell. Beispiels-weise können sie eine universelle Turingmaschine modellieren und sind damit Turing-vollständig. Die Church-Turing Hypothese besagt, dass eine Funktion über den na-türlichen Zahlen genau dann durch einen deterministischen Algorithmus berechnet wer-den kann, falls sie auch auf einer Turingmaschine berechnet werden kann. Nötiger Platzund Zeit werden dabei weder bei der Algorithmusberechnung noch für die Turingmaschi-ne beschränkt. Die Vermutung wurde im Jahr 1939 von Alan Turing und Alonso Churchformuliert und verbindet die Erkenntnisse von Kurt Gödel zu primitiv-rekursiven Funk-tionen (Gödel, ab 1931) mit der Forschung zu Lambda-rekursiven Funktionen (Church,1936) und Turing-berechenbaren Funktionen (Turing, 1936). Insbesondere gehören zel-luläre Automaten zu dieser Klasse der mächtigsten bekannten Rechnermodelle.

    Ein bekanntes Beispiel für ein anschauliches und ästhetisch ansprechendes Modell eineszellulären Automaten ist �Game of Life�, 1970 von John Horton Conway erfunden.Aufbauend auf von Neumanns Theorie zu zellulären Automaten war Conway auf derSuche nach einem zellulären Automaten mit möglichst einfachen Regeln, der Kopienvon sich selbst bauen kann (in gewisser Weise rekursiv ist). Die Regeln von �Game ofLife� wurden durch Martin Gardners Kolumne �Mathematical Games� in der ZeitschriftScienti�c American einem breiten Publikum bekannt (Oktober 1970).

    Regeln von �Game of Life�

    Conways �Game of Life� ist ein zellulärer Automat mit folgenden Spezi�kationen. DieMenge aller Zelle ist in einem unendlich grossen zweidimensionalen regelmässigenGitter R = Z2 angeordnet und kann somit als unendliches Spielbrett gleichgrosserquadratischer Zellen interpretiert werden. Jede Zelle kann einen von zwei Zuständenannehmen, Q = {�lebend� , �tot�}. Die Nachbarn einer Zelle x ∈ Z2 bildet die sogenannte

    ii

  • 1 SACHANALYSE 1.3 Zentrale Begri�e

    Moore-Nachbarschaft, N(x) = {y ∈ Z2 | ‖x− y‖∞ = 1} . Es handelt sich damit umdie acht direkt (gerade oder diagonal) angrenzenden Zellen.

    Abbildung I: Links : Anschauliche Darstellung einer �Game of Life� Kon�guration. DieZellen im Zustand �lebend� sind durch ein dunkel eingefärbtes Quadrat dargestellt.Rechts : Vergrösserte Darstellung einer lebenden Zelle (in der Mitte) mit ihren acht Nach-barzellen. Drei der acht Nachbarzellen leben, fünf sind tot.

    Als Anfangskon�guration (auch: Anfangsgeneration) q0 ist eine Menge von lebendenZellen gegeben, alle anderen Zellen sind tot. Die nachfolgende Kon�guration/Ge-neration wird ermittelt:

    · Eine tote Zelle mit genau drei lebenden Nachbarzellen wird in der nächsten Gene-ration zum Leben erweckt.

    · Eine lebende Zelle mit genau zwei oder genau drei lebenden Nachbarzellen lebt auchin der nächsten Generation.

    · Alle restlichen Zellen sind in der nächsten Generation tot.

    Weitere Nachfolgegenerationen werden in diskreten Schritten nach denselben Regelnbestimmt.

    Eigenschaften von �Game of Life�

    Bestimmte Muster lebender Zellen haben bemerkenswerte Eigenschaften und wurdendeshalb teilweise benannt. Muster können als unbeein�usst von den umliegenden Zellenbetrachtet werden, solange sie vollständig von toten Zellen umgeben werden. von ihrerbetrachtet werden So gibt es statische Muster, also begrenzte Bereiche von Zellen,deren Zustand sich (ohne Ein�uss von aussen) nicht verändert. Es gibt oszillierendeMuster, die (ohne Ein�uss von aussen) nach einer gewissen Anzahl von Nachfolgegene-rationen (der Periodenlänge) wieder genau dem Ausgangsmuster entsprechen. Ausser-dem wurden sogenannte Raumschi�e in �Game of Life� gefunden, die (ohne Ein�ussvon aussen) nach einer gewissen Anzahl von Nachfolgegeneration einer verschobenenKopie ihres Ausgangsmuster entsprechen.

    Es gibt viele interessante Anfangsgenerationen, die früher oder später zu Kombinatio-nen von statischen und oszillierenden Mustern mit Raumschi�en führen. Es gibt auchMuster, die in regelmässigen Abständen neue Raumschi�e �produzieren�. Viele Muster

    iii

  • 1.3 Zentrale Begri�e 1 SACHANALYSE

    Abbildung II: Ausgewählte Muster, umgeben von toten Zellen. Von links nach rechts:�Quadrat� (ein statisches Muster), �Blinker� (ein oszillierendes Muster mit Periodenlänge2), �Gleiter� (ein Raumschi�) und �r-Pentomino�.

    erscheinen über einen länger Zeitraum chaotisch und führen zu einem explosionsartigemVerhalten. Manche von ihnen resultieren nach einer grossen Anzahl von Nachfolgege-nerationen teilweise (wenn man sie nur auf einem begrenzten Bereich betrachtet) dochin oszillierenden Mustern. So ergibt r-Pentomino ab der 1103-ten Nachfolgegenerationein oszillierendes Muster der Periodenlänge zwei, wenn man von sechs �weg ge�ogenenGleitern� absieht.

    Fachwissenschaftliche Bedeutung

    �Game of Life� kann durch die Wahl einer passenden Anfangskon�guration eine universel-le Turingmaschine simulieren und ist damit Turing-vollständig. Weiterhin kann �Gameof Life� auch genutzt werden, um eine grosse Kopien eines �Game of Life� Spielbretts zuerzeugen und darauf die �Game of Life� Regeln (und damit sich selbst) zu simulieren.

    Man kann sich fragen, ob ein gegebenes �Game of Life� Muster eine (möglicherweise sehrspäte) Nachfolgegeneration einer gegebenen Anfangsgeneration ist. Es existiert kein Al-gorithmus, der diese Problemstellung allgemein lösen kann. In diesem Sinn ist �Gameof Life� unentscheidbar. Der Beweis geht im Wesentlichen folgendermassen: Würdesolch ein Algorithmus existieren, könnte er entscheiden, ob eine universelle Turingma-schine, auf deren Band zu Beginn die Codierung einer speziellen Turingmaschine undderen Eingabe steht, anhält (indem sie ohne Beschränkung der Allgemeinheit zu einemleeren Band führt). Schliesslich lässt sich die universelle Turingmaschine in �Game ofLife� umsetzen. Dieses sogenannte Halteproblem ist allerdings unentscheidbar (es gibtkeinen Algorithmus, um dieses Problem zu lösen), was Alan Turing 1936 bewies.

    Umsetzung von �Game of Life� in Processing

    Zur Implementierung von �Game of Life� in Processing wird als Datenstruktur ein zwei-dimensionales Array von Wahrheitswerten verwendet.

    // Dek larat ionboolean [ ] [ ] s p i e l b r e t t ;// I n i t i a l i s i e r u n gs p i e l b r e t t=new boolean [ 5 0 ] [ 5 0 ] ;

    // B e i s p i e l f ü r Belegung mit Werten// anhand des Musters "Quadrat"s p i e l b r e t t [ 9 ] [ 3 ]= s p i e l b r e t t [ 1 0 ] [ 4 ]=

    s p i e l b r e t t [ 1 0 ] [ 2 ]= s p i e l b r e t t [ 1 1 ] [ 3 ]= true ;

    iv

  • 1 SACHANALYSE 1.3 Zentrale Begri�e

    Im Computer können keine tatsächlich unendlich grossen Spielbretter realisiert werden.Man geht häu�g von grossen (oder sich bei der Programmausführung dynamisch vergrös-sernden) Spielbrettern aus. Ein Beispiel für einen Processing-Programmcode, der �Gameof Life� darstellt, ist im Folgenden dargestellt.

    // Grösse des S p i e l b r e t t s pro Richtungf ina l int dimension=40;// Leeres Sp i e l b r e t tboolean [ ] [ ] s p i e l b r e t t=new boolean [ dimension ] [ dimension ] ;

    void setup ( ){

    s i z e ( 801 , 801 ) ;frameRate ( 2 0 ) ;

    // G l e i t e rint i n d i z e s [ ] [ ]={{1 , 1} , {2 , 2} , {3 , 2} , {1 , 3} , {2 , 3}} ;for ( int k=0; k

  • 1.4 Literatur zu Arrays und Game of Life 1 SACHANALYSE

    for ( int j =1; j

  • 1 SACHANALYSE 1.5 Re�exion zu einer Durchführung

    �Game of Life� sowie einer universellen Turingmaschine in �Game of Life� kurz angespro-chen.

    Diskussion des Ablaufs

    Die erste Lektion ist sehr gut verlaufen. Zwei der Lernenden hatten bereits von �Game ofLife� gehört, die Details waren ihnen momentan aber nicht bekannt. Alle Schülerinnenund Schüler haben konzentriert und motiviert gearbeitet und die Lektionsziele erreicht.

    Die zweite Lektion hat sich als die Stunde herausgestellt, die die höchsten Anforderun-gen an die Schülerinnen und Schüler stellt. Die nötigen Grundlagen in Processing warenvorhanden und in der ersten Lektion waren bereits die nötige Datenstruktur und dieAnsprache von Pixeln in Programming diskutiert worden. Die Hausaufgaben hatten dieSchülerinnen und Schüler o�enbar erledigt. Allerdings wurde mit der Implementierungder beiden Hauptteile des Programms den Lernenden recht viel in kurzer Zeit abverlangt.So konnte der geplante Sto� noch in der Lektion bewältigt werden, es blieb allerdingsnicht ausreichend Zeit für eine Besprechung zur Re�exion des Erreichten. Die Umwand-lung von Wahrheitswerten in die Zahlen 0 bzw. 1 mit dem Befehl int(boolean) inProcessing hätte in einer früheren Lektion geschehen können, um an dieser Stelle etwasZeit zu sparen. Eine weitere Möglichkeit, die Lektion für die Schülerinnen und Schülerangenehmer zu gestalten, kann (nach Möglichkeit) die Zusammenfassung der zweitenund dritten Lektion zu einer Doppellektion sein.

    Die dritte Lektion begann mit Selbsterklärungsaufgaben zum erhaltenen Programmcode.So wurde sichergestellt, dass alle Schülerinnen und Schüler das Programm vervollstän-digen konnten/können und verstehen. Der entsprechende Unterabschnitt 3.4 in diesenUnterlagen wurde aufgrund der Erfahrungen aus der zweiten Lektion eingefügt. Die Re-petition wurde dankbar von den Schülerinnen und Schülern angenommen und hat sichals gut geeignet herausgestellt. Es blieb Zeit, in der sich die Schülerinnen und Schülerselbständig mit Aufgaben zu Mustern und deren manchmal komplexer Entwicklung be-fasst haben. Auch beim abschliessende Ausblick auf Rechnermodelle waren die Lernendeninteressiert und konzentriert bei der Sache.

    Insgesamt war es für alle Unterrichtsteilnehmer ein schönes Projekt, das von den Schüle-rinnen und Schülern ausnahmslos gut angenommen wurde. Mit dem mehrere Lektionenübergreifenden Thema konnte die Erfahrung der Lernenden um weitere Aspekte auf dieInformatik erweitert werden.

    vii

  • 2 LERNZIELE

    2 Lernziele

    Leitidee

    Zelluläre Automaten bilden eine einfache, aber wichtige Rechnerarchitektur. Conways�Game of Life� als erstes Beispiel eines zellulären Automaten ist ein für Schülerinnenund Schüler verständliches und motivierendes Thema der Informatik. Die Anschaulich-keit und Ästhetik von aufeinanderfolgenden Mustern in Game of Life verleiten zumAusprobieren und machen dabei den diskreten Charakter von iterativen Berechnungenklar. Sie fördern das Abstraktionsvermögen und schulen so das algorithmische Denken.

    Die Berechnung der nächsten �Game of Life�-Generation eines Musters ist für die Schüle-rinnen und Schüler gut verständlich und einfach auszuführen, wird aber bei selbst relativkleinen Mustern schnell zu einer ermüdenden und fehleranfälligen Detailarbeit, die nachAutomatisierung verlangt. Die Programmiersprache Processing ist besonders zur Darstel-lung bewegter Gra�ken geeignet und bietet sich für eine �Game of Life� Implementierungan.

    Dispositionsziele

    Die Schülerinnen und Schüler erlangen Kenntnisse über die diskrete Struktur von Be-rechnungen in einfachen Rechnermodellen. Sie kommen zur Erkenntnis, dass auch füreinfache Berechnung Automatisierung unerlässlich ist. Ihnen wird bewusster, dass sichzweidimensionale Arrays für die Speicherung von Gra�ken im PC eignen.

    Sie bauen ihre Programmierfähigkeiten aus. Die Quelltexte ihrer Programme werdenkomplexer und es wird selbstverständlicher für sie, mit Selektionen, Iterationen undArrays umzugehen.

    Operationalisierte Lernziele

    Die Schülerinnen und Schüler erklären interessierten Laien ohne spezi�sche Vorbildungin ihren eigenen Worten anhand eines selbstgewählten Beispiels, was Conways �Game ofLife� ist.

    Die Schülerinnen und Schüler verstehen den Grundaufbau eines ihnen vorgestellten kur-zen Programms und vervollständigen es nach Anleitung.

    Gegeben ein 6x6 Muster einer �Game of Life�-Generation in einer �unendlichen� Ebenesind die Schülerinnen und Schüler in der Lage, mit Zettel und Papier das Muster dernächsten Generation der inneren 4x4 Zellen zu bestimmen. Ausserdem lesen sie die re-lativen Koordinaten der lebenden Zellen ab und geben sie ihrem Processing-Programmein.

    viii

  • Unterrichtsunterlagen

    für das Ergänzungsfach Informatik

    Conways �Game of Life� in Processing

    Autor: Jörg BaderKlasse: 6Version: 14. November 2017

  • �Game of Life� in Processing

    1 Einführung

    Auf einem zweidimensionalen Brett von quadratischen Zellen entstehen Muster, indemman einige der Zellen dunkel einfärbt.

    Aufgabe 1. Betrachten Sie die beiden Muster. Finden Sie mindestens drei Gemein-samkeiten und drei Unterschiede! Wie könnte das rechte Muster aus dem linkenMuster hervorgegangen sein?

    Die obigen Muster treten bei der Simulation eines Organismus auf. Dunkel eingefärbteZellen werden als �lebend� interpretiert, die hellen (beziehungsweise nicht eingefärbten)Zellen als �tot�. Beginnend mit einem beliebigen Muster lebender Zellen können alleZellen nach bestimmten Regeln �sterben� (also dann tot sein) oder �geboren�/zum Lebenerweckt werden (also dann lebend sein).

    In der Informatik nennt man dies �Game of Life�. Sie werden ein solches Spielbrett inProcessing gra�sch darstellen, die Entwicklung von Mustern anhand der �Game of Life�Regeln berechnen und spannende Muster mit ihren Eigenschaften entdecken.

    Aufgabe 2. Das Spielbrett soll in Processing implementiert werden.

    (a) Welcher Datentyp/welches Objekt bietet sich dafür an? Begründen Sie IhrenVorschlag!

    (b) Wie würde man bei Ihrem gewählten Objekt ein Spielbrett mit 25x25 totenZellen initialisieren?

    (c) Wie würde man bei Ihrem gewählten Objekt ein Spielbrett mit 25x25 lebendenZellen initialisieren?

    Erinnern Sie sich, dass beim gra�schen Darstellen in Processing die erste Koordinatenach rechts hochzählt, die zweite Koordinate (anders wie in der Mathematik üblich)nach unten hochzählt. Deswegen ist es empfehlenswert, auch das zu implementierendeSpielbrett-Array entsprechend wie in der folgendem Abbildung eines Spielbrettes von6x6 Zellen zu modellieren.

    2

  • 1 Einführung

    (0,0)

    (0,1)

    (0,2)

    (0,3)

    (0,4)

    (0,5)

    (1,0)

    (1,1)

    (1,2)

    (1,3)

    (1,4)

    (1,5)

    (2,0)

    (2,1)

    (2,2)

    (2,3)

    (2,4)

    (2,5)

    (3,0)

    (3,1)

    (3,2)

    (3,3)

    (3,4)

    (3,5)

    (4,0)

    (4,1)

    (4,2)

    (4,3)

    (4,4)

    (4,5)

    (5,0)

    (5,1)

    (5,2)

    (5,3)

    (5,4)

    (5,5)

    Aufgabe 3. Angenommen, das Spielbrett-Array wird initialisiert mit

    boolean [ ] [ ] s p i e l b r e t t = new boolean [ 4 0 ] [ 4 0 ] ;

    Bestimmen Sie, welche Arrayeinträge den folgenden Ausschnitten von �Game of Life�-Mustern lebender Zellen entsprechen.

    (a) (2,8) (3,8)

    (2,9)

    (b) (8,1) (9,1)

    (8,2)

    (c) (0,0) (1,0)

    (0,1)

    (d) (0,0) (1,0)

    (0,1)

    3

  • �Game of Life� in Processing

    2 Die Regeln von Conways �Game of Life�

    Die Regeln, nach denen Zellen auf dem �Game of Life�-Spielbrett leben, geboren werdenund sterben, wurden 1970 vom englischen Mathematiker John Horton Conway erfundenund notiert. Conway, der sich besonders mit Kombinatorik und Spieltheorie befasste,konnte mit dem anschaulichen und unterhaltsamen �Game of Life� auch Bevölkerungs-gruppen erreichen, die sonst an Mathematik nicht viel Freude haben. So konnte er auchdas Augenmerk auf die noch sehr junge Informatik lenken und die Untersuchung einfacherRechnermodelle in der sogenannten �Automatentheorie� in der Informatik vorantreiben.

    Ähnlich wie beispielsweise viele Gesellschaftsspiele verläuft �Game of Life� in Runden,sogenannten diskreten Schritten. Ob eine lebende Zelle weiterleben oder sterben wirdbeziehungsweise eine tote Zelle geboren werden oder tot bleiben wird, hängt bei �Gameof Life� jeweils von den Zuständen ihrer acht direkten Nachbarzellen ab. Folgend isteine lebende Zelle mit ihren acht Nachbarzellen abgebildet. Drei der acht Nachbarzellenleben, fünf sind tot.

    �Game of Life� wird vollständig durch die nachfolgenden Regeln beschrieben.

    Die Regeln von Conways �Game of Life�:

    Gespielt wird auf einem unendlich grossen zweidimensionalen Spiel-brett von quadratischen Zellen.Als Anfangsgeneration ist eine Menge von �lebenden� Zellen gege-ben. Alle anderen Zellen heissen �tot�.Nun wird die nachfolgende Generation ermittelt:

    · Eine tote Zelle mit genau drei lebenden Nachbarzellen wird in dernächsten Generation zum Leben erweckt.

    · Eine lebende Zelle mit genau zwei oder genau drei lebenden Nach-barzellen lebt auch in der nächsten Generation.

    · Alle restlichen Zellen sind in der nächsten Generation tot.

    Weitere Nachfolgegenerationen können in diskreten Schritten be-stimmt werden.

    4

  • 2 Die Regeln von Conways �Game of Life�

    Aufgabe 4. Folgend ist jeweils eine Zelle mit ihren acht Nachbarzellen abgebildet.

    (a) Untersuchen Sie jeweils, ob in der nachfolgenden Generation die tote Zelle inder Mitte geboren werden oder tot bleiben wird.

    1. 2. 3. 4.

    (b) Untersuchen Sie jeweils, ob in der nachfolgenden Generation die lebende Zellein der Mitte überleben oder sterben wird.

    1. 2. 3. 4.

    (c) Untersuchen Sie für die zentralen 4x4 Zellen, ob sie in der nachfolgenden Gene-ration lebend oder tot sein werden.

    Da im Computer keine unendlich grossen Spielbretter realisiert werden können, geht manhäu�g von grossen (oder sich bei der Programmausführung dynamisch vergrössernden)Spielbrettern aus. Beispielsweise ist in Aufgabe 1 nur ein Spielbrett von 25x25 Zellenabgebildet.

    Aufgabe 5. Vergleichen Sie die Regeln von �Game of Life� mit Ihren Beobachtungenund Vermutungen zu Aufgabe 1. Kann es sein, dass das rechte 25x25 Spielbrett dienachfolgende �Game of Life�-Generation zum rechten Spielbrett darstellt? Sie müssennicht jede Zelle überprüfen!

    Vorerst gehen wir (auch für die Implementierung) von einem endlichen quadratischenSpielbrett aus, z. B. von 40x40, 25x25 oder 6x6 Zellen. Auf diesem Spielbrett haben dieZellen rundherum am Rand keine acht Nachbarn, sondern nur drei oder fünf. Für dieRandzellen muss man also die Regeln von �Game of Life� anpassen. Als Konvention sollendiese Zellen rundherum am Rand bei uns immer tot bleiben.

    5

  • �Game of Life� in Processing

    Aufgabe 6. Als Menge von lebenden Zellen der Anfangsgeneration sind die fol-genden Muster jeweils auf einem endlichen Spielbrett von 6x6 Zellen gegeben. Diezwanzig Zellen rundherum am Rand sollen nach Konvention immer tot bleiben. Be-stimmen Sie jeweils alle lebenden Zellen der beiden nachfolgenden Generation.

    (a) (b)

    (c) (d)

    Es wurde vereinbart, dass auf endlichen Spielbrettern die Zellen rundherum am Randbei uns immer tot bleiben. Trotzdem ist es interessant und herausfordernd, auch überunendliche Spielbretter nachzudenken.

    Aufgabe 7. �Game of Life� soll auf einem unendlichen Spielbrett durchgeführt wer-den, auf dem anfangs unendlich viele Zellen leben.

    (a) Nehmen Sie an, die Anfangsgeneration besteht aus lebenden Zellen, die schach-brettartig angeordnet sind. Welche Zellen leben in der nachfolgenden Generati-on?

    (b) Nehmen Sie an, die Anfangsgeneration besteht aus lebenden Zellen, die in einerhorizontalen Linie angeordnet sind. Welche Zellen leben in der nachfolgendenGeneration?

    6

  • 3 Aufbau des Programms

    3 Eine Umsetzung in Processing

    In diesem Abschnitt lernen Sie, wie man �Game of Life� in Processing umsetzen kann.

    3.1 Aufbau des Programms

    Bei der Implementierung komplexer Programme ist es wichtig, mittels geschickter Pro-grammierung den strukturellen Überblick zu behalten. Neben Einrückungen und Kom-mentaren zu den einzelnen Programmcodeteilen können hier aussagekräftige Variablen-namen helfen. Bei der Realisierung von �Game of Life� werden Sie folgendes Gerüst einesProcessing-Programmcodes nach und nach mit Leben füllen.

    // Grösse des S p i e l b r e t t s pro Richtungint dimension=40;// Erzeugen e i n e s dimension x dimension gros sen Sp i e l b r e t t sboolean [ ] [ ] s p i e l b r e t t=new boolean [ dimension ] [ dimension ] ;

    void setup ( ){

    s i z e ( 801 , 801 ) ;frameRate ( 1 ) ;

    // De f i n i t i o n e i n e s Startmuster s/* . . .

    ( 0 ). . . */

    }

    void draw ( ){

    // Zeichnen des ak tu e l l e n Musters/* . . .

    ( 1 ). . . */

    // Berechnung des nächsten Musters/* . . .

    ( 2 ). . . */

    }

    Aufgabe 8. Betrachten Sie das Programmgerüst.

    (a) Sammeln Sie Argumente, warum sich Processing für eine Umsetzung von �Gameof Life� gut eignet.

    (b) Erklären Sie am obigen Programmgerüst, was in setup() und was in draw()geschieht.

    7

  • �Game of Life� in Processing

    (c) Welche Grösse hat das Spielbrett-Array im obigen Programmgerüst? WelcheGrösse ist für die gra�sche Darstellung vorgesehen?

    (d) Angenommen, die ganze Zeichen�äche von Processing ist für die Darstellung desSpielbretts bestimmt. Wie gross wird dann eine einzelne Zelle des Spielbrettsdargestellt?

    Wir werden zwei Zwischenzielen ansteuern: die gra�sche Darstellung des Spielbrett-Musters und die Berechnung der Nachfolgegeneration des Musters.

    3.2 Gra�sche Darstellung des Spielbretts

    Wir beginnen damit zu untersuchen, wie man ein �Game of Life� Muster (eine einzelneGeneration) darstellen kann. Im Programmgerüst von Seite 7 soll also die Lücke (1)gefüllt werden.

    Aufgabe 9. Wählen Sie zwei gut unterscheidbare Farben (eine für die toten, einefür die lebenden Zellen) und bestimmen Sie deren rgb-Kodierung.

    Die beiden von Ihnen gewählten Farben werden im Folgenden genutzt, um die lebendenund toten Zellen eines �Game of Life� Musters darzustellen.

    Aufgabe 10. (a) Ein Eintrag des Arrays spielbrett soll anhand seines Wahr-heitswertes gra�sch dargestellt werden.

    int i =10;int j =24;

    // Auswahl der Farbe fü r Z e l l e ( i , j )/* . . .

    . . .

    . . . */// Färben der Z e l l e ( i , j )r e c t ( i *20 , j *20 , 20 , 20 ) ;

    Setzen Sie mittels einer Selektion abhängig vom Wert spielbrett[i][j] dievon Processing verwendete Füllfarbe fest. Verwenden Sie dabei die beiden Far-ben, für die Sie sich in Aufgabe 9 entschieden haben.

    (b) Nun soll nicht nur die Zelle zum Arrayeintrag spielbrett[10][24] eingefärbtdargestellt werden, sondern die Zellen zu allen Einträge von spielbrett. Ent-fernen Sie dafür in Ihrem Quellcode aus (a) die Zeilen:

    int i =10;int j =24;

    Verwenden Sie anschliessend verschachtelte for-Schleifen, damit das ganze Spiel-brett gra�sch dargestellt wird.

    8

  • 3 Berechnung der nächsten Generation

    Aufgabe 11. Das Programmgerüst von Seite 7 wird nun um die gra�sche Darstel-lung ergänzt.

    (a) Übertragen Sie Ihren Code aus Aufgabe 10 (b) in den Processingcode an dieStelle (1). Beim Ausführen sollte Ihr Programm nun ein Spielbrett von totenZellen anzeigen.

    (b) Lassen Sie die Muster aus Aufgabe 3 (a) bis (c) zusammen auf das Spielbrettzeichnen, indem Sie die zu Aufgabe 3 notierten Codezeilen in Ihren Processing-code an die Stelle (0) einfügen.

    3.3 Berechnung der nächsten Generation

    Nachdem nun die gra�sche Darstellung (das Zeichnen des aktuellen Musters) erledigtist, kümmern wir uns um die Berechnung der Nachfolgegeneration. Da die Nachfolgege-neration von allen Zellen der aktuellen Generation abhängt, darf bei der Berechnung derNachfolgegeneration auf keinen Fall die aktuelle Generation gleich überschrieben wer-den. Es bietet sich vielmehr an, die Nachfolgegeneration auf ein neues �Spielbrett� zuspeichern. Wir benennen die auf dieses Array verweisende Variable:

    // Erzeugen e i n e s S p i e l b r e t t s f ü r d i e Nach fo lgegenerat i onboolean [ ] [ ] n eu e sSp i e l b r e t t=new boolean [ dimension ] [ dimension ] ;

    Betrachten Sie einmal nur einen einzelnen Arrayeintrag spielbrett[i][j], dessen Zellesich irgendwo auf dem Spielbrett be�ndet und lebend (spielbrett[i][j] ist True)oder tot (spielbrett[i][j] ist False) sein kann. Abhängig von diesem Wahrheitswertund den acht Nachbarzellen soll der Wahrheitswert neuesSpielbrett[i][j] auf Truegesetzt werden, oder False bleiben. Um zu zählen, wie viele der Nachbarn lebend sind,ist die Funktion int() hilfreich, die einen Wahrheitswert in eine Ganzzahl umwandelt.

    Aufgabe 12. Schreiben Sie folgendes kurzes Programm in Processing.

    // Eingabeboolean wahrhe i tswert1 = true ;boolean wahrhe i tswert2 = fa l se ;// Umrechnungint zah l1 = int ( wahrhe itswert1 ) ;int zah l2 = int ( wahrhe itswert2 ) ;// Ausgabep r i n t l n ( "Der Ganzzahlwert von "+wahrhe i tswert1+" i s t "+zahl1 ) ;p r i n t l n ( "Der Ganzzahlwert von "+wahrhe i tswert2+" i s t "+zahl2 ) ;

    Was wird ausgegeben?

    9

  • �Game of Life� in Processing

    Aufgabe 13. Betrachten Sie die Nachbarzellen von spielbrett[i][j].

    (i,j)

    (a) Geben Sie die acht Nachbarzellen an, indem Sie deren Indexpaare bestimmen.

    (b) Bestimmen Sie die Anzahl der Nachbarzellen, die den Wert True besitzen.Verwenden Sie dafür die Funktion int(). Speichern Sie diese Anzahl in derVariable int anzahlLebenderNachbarn.

    (c) Betrachten Sie folgenden Programmcode-Ausschnitt.

    anzahlLebenderNachbarn==3 | |( anzahlLebenderNachbarn==2 && s p i e l b r e t t [ i ] [ j ] )

    Warum beschreibt der Code genau die Bedingung, unter der spielbrett[i][j]in der Nachfolgegeneration lebt?

    Aufgabe 14. Die Anzahl lebender Nachbarn bestimmt im Wesentlichen, ob eineZelle in der nächsten Generation lebt.

    (a) Ergänzen Sie folgenden Programmcode mit Ihrem Wissen von Aufgabe13

    // Erzeugen e i n e s S p i e l b r e t t s f ü r d i e Nach fo lgegenerat i onboolean [ ] [ ] n eu e sSp i e l b r e t t=new boolean [ dimension ] [ dimension ] ;// Berechnung des nächsten Mustersfor ( int i =1; i

  • 3 Selbsterklärungsaufgaben zum Programmcode

    3.4 Selbsterklärungsaufgaben zum Programmcode

    In der vergangenen Lektion haben Sie �Game of Life� in Processing implementiert. Derdraw() Teil Ihres Programmcodes sieht in etwa aus wie folgender Codeausschnitt.

    void draw ( ){

    for ( int i =0; i

  • �Game of Life� in Processing

    Aufgabe 15. Beantworten Sie die folgenden Detailfragen.

    1. Markieren Sie den Teil des Codes, in dem die aktuelle Generation des Spielbrettsgefärbt wird!

    · In welcher Zeile wird die Füllfarbe für �lebende Zellen� festgelegt, in wel-cher Zeile die Füllfarbe für �tote Zellen�?

    2. Markieren Sie den Teil des Codes, in dem die Nachfolgegeneration des aktuellenMusters berechnet wird!

    · Betrachten Sie die Iteration zu bestimmten Indizes i und j. Wodurch be-stimmt die Variable anzahlLebenderNachbarn, wie viele der acht Nach-bareinträge um spielbrett[i][j] wahr sind?

    · Wo werden die �Game of Life� Regeln zur Bestimmung der toten/lebendenZellen der Nachfolgegeneration verwendet?

    · Wie wird sichergestellt, dass der Rand des Spielbretts in der Nachfolgege-neration nur aus toten Zellen besteht?

    3. Wodurch wird der vollständige Programmcode zu einer bewegten Gra�k?

    12

  • 4 Muster in �Game of Life�

    4 Weitere Aufgaben zu �Game of Life�

    4.1 Muster in �Game of Life�

    Bestimmte Muster lebender Zellen haben bemerkenswerte Eigenschaften und wurdendeshalb teilweise benannt. Muster können als unbeein�usst von den umliegenden Zellenbetrachtet werden, solange sie vollständig von toten Zellen umgeben sind. So gibt es sta-tische Muster, also begrenzte Bereiche von Zellen, deren Zustand sich (ohne Ein�ussvon aussen) nicht verändert. Es gibt oszillierende Muster, die (ohne Ein�uss von aus-sen) nach einer gewissen Anzahl von Nachfolgegenerationen (derPeriodenlänge) wiedergenau dem Ausgangsmuster entsprechen. Ausserdem wurden sogenannte Raumschi�ein �Game of Life� gefunden, die (ohne Ein�uss von aussen) nach einer gewissen Anzahlvon Nachfolgegeneration einer verschobenen Kopie ihres Ausgangsmuster entsprechen.

    Aufgabe 16. Testen Sie Ihr Programm mit den Mustern aus Aufgabe 6. Handelt essich um statische Muster, oszillierende Muster, Raumschi�e oder chaotische Muster?

    Die folgenden Aufgaben sollen Ihnen helfen, Musterentwicklungen in �Game of Life� zuerforschen und Sie auch zum Ausprobieren verleiten. Sollten Sie interessante oder schö-ne Musterentwicklungen beobachten, denken Sie daran, Ihre Ausgangsgeneration nichteinfach aus dem Code zu löschen. Sie können sie beispielsweise auskommentieren oderin einer separaten Datei die Anfangsgenerationen Ihrer Lieblingsmuster-Entwicklungenspeichern. Bei grösseren Mustern bietet es sich manchmal auch an, die Framerate zuerhöhen, um die Entwicklung besser nachverfolgen zu können.

    Aufgabe 17. Platzieren Sie folgende Anfangsmuster jeweils ungefähr auf der Mittedes Spielbretts und beschreiben Sie das Verhalten.

    (a) �Stairstep Hexomino�

    (b) �Doppel U�

    (c) �Pulsar�

    13

  • �Game of Life� in Processing

    Es gibt viele interessante Anfangsgenerationen, die früher oder später zu Kombinatio-nen von statischen und oszillierenden Mustern mit Raumschi�en führen. Es gibt auchMuster, die in regelmässigen Abständen neue Raumschi�e �produzieren�. Viele Mustererscheinen über einen längeren Zeitraum chaotisch und führen zu einem explosionsartigenVerhalten. Manche von ihnen resultieren nach einer grossen Anzahl von Nachfolgegene-rationen teilweise (wenn man sie nur auf einem begrenzten Bereich betrachtet) doch inoszillierenden Mustern. Beispielsweise ergibt r-Pentomino ab der 1103-ten Nachfolgegene-ration schliesslich ein oszillierendes Muster der Periodenlänge zwei. Auf einem unendlichgrossen Spielbrett würde man zusätzlich zu dem oszillierenden Teilmuster noch sechs�weg�iegende Gleiter� beobachten können.

    Aufgabe 18. Finden Sie weitere Beispiele für statische Muster, oszillierende Mus-ter, Raumschi�e und chaotische Muster. Notieren Sie die Anfangsgeneration undbeschreiben Sie kurz deren Verhalten.

    Aufgabe 19. Führen Sie �Game of Life� mit einer zufälligen Anfangsgeneration aus.

    Hinweis : Verwenden Sie dafür die Funktion random(). Übergibt man dieser Funktioneine Zahl, so wird eine �zufällige� Gleitkommazahl zwischen Null und dieser Zahlzurückgegeben. Beispielsweise erzeugt folgender Code einen Wahrheitswert ww, dermit Wahrscheinlichkeit 0.3=30% wahr ist, und ansonsten falsch:

    boolean ww;i f ( random(1)

  • 4 Ausbau des Programms

    4.2 Ausbau des Programms

    Aufgabe 23. Vergrössern Sie Ihr Spielbrett auf 200 Zellen Breite und 200 ZellenHöhe. Jede Zelle hat dann 10 Pixel mal 10 Pixel Platz.

    Aufgabe 24. Übertragen Sie die folgenden Anfangsmuster etwa in die Mitte IhresSpielbretts der Grösse 200x200. Betrachten Sie jeweils einige tausend Nachfolgege-nerationen und beschreiben Sie kurz deren Verhalten.

    (a) �r-Pentomino� (b) �Rabbits�

    (c) �Gosper's Glider Gun�

    Aufgabe 25. In dieser Aufgabe erweitern Sie Ihr Programm durch eine Funktion dieermöglicht, dass die nächste Generation erst nach einem Mausklick dargestellt wird.Steht im setup() Teil des Programms der Befehl noLoop(), so wird diese Wirkungdurch folgende Funktion ermöglicht:

    void mousePressed ( ){

    redraw ( ) ;}

    Übertragen Sie diese Funktion in Ihr Programm und testen Sie ihre Wirkung aneinigen Beispielen.

    15

  • �Game of Life� in Processing

    Aufgabe 26. In dieser Aufgabe erweitern Sie Ihr Programm, sodass eine übersicht-lichere Eingabe des Startmusters möglich wird.

    (a) Überzeugen Sie sich anhand der angegebenen Indizes, dass folgender Programm-code einen �Gleiter� darstellt.

    s p i e l b r e t t [ 1 ] [ 1 ]= s p i e l b r e t t [ 2 ] [ 2 ]= s p i e l b r e t t [ 3 ] [ 2 ]=s p i e l b r e t t [ 1 ] [ 3 ]= s p i e l b r e t t [ 2 ] [ 3 ]= true ;

    (b) Erklären Sie, warum auch folgender Programmcode einen Gleiter erzeugt.

    int i n d i z e s [ ] [ ]={{1 , 1} , {2 , 2} , {3 , 2} , {1 , 3} , {2 , 3}} ;for ( int k=0; k

  • 5 Eine universelle Turingmaschine in �Game of Life�

    5 �Game of Life� in der Informatik

    �Game of Life� kann verallgemeinert werden: auf kompliziertere Spielbretter, mit mehrmöglichen Zuständen für jede Zelle und anderen Nachbarschaftsbeziehungen. Ein so ent-stehendes Modell nennt man zellulären Automat. Die Modellierung und Simulierungvieler Problemen aus der realen Welt ist durch zelluläre Automaten möglich. Sie wurdenzuerst in den Vierzigerjahren des zwanzigsten Jahrhunderts durch Stanislaw Ulam undJohn von Neumann beschrieben.

    Alle zellulären Automaten (also auch �Game of Life�) gehören zu den Rechnermodellender Informatik. Rechnermodelle sind theoretisch (oder praktisch) entworfene Maschi-nen, die Berechnungen auf Eingaben ausführen können, sozusagen eine Vereinfachungeines handelsüblichen Computers. Zelluläre Automaten sind trotz ihrer einfachen Struk-tur ein sehr mächtiges Rechnermodell und haben einen zentralen Stellenwert in der In-formatik. Eine weitverbreitete Vermutung unter Wissenschaftlern besagt, dass zelluläreAutomaten alle berechenbaren Algorithmen umsetzen können - man sagt, zelluläre Au-tomaten sind Turing-vollständig. Dieser Begri� geht auf Alan Turing zurück (im Jahr1939 formuliert), einen bedeutenden Pionier der Informatik.

    �Game of Life� in �Game of Life�

    Bereits der spezielle zelluläre Automat �Game of Life� ist ein äusserst mächtiges Rech-nermodell. Durch die Wahl spezieller Anfangsgenerationen können auf dem �Game ofLife�-Spielbrett komplizierte Berechnungen ausgeführt werden. Das mag erst einmal un-glaubwürdig und recht abstrakt klingen. Ein Hinweis auf die Fähigkeiten von �Gameof Life� bietet beispielsweise folgende beeindruckende Eigenschaft: �Game of Life� kanngenutzt werden, um eine viel grössere Kopie eines �Game of Life�-Spielbretts zu erzeugenund darauf wiederum die �Game of Life�-Regeln zu simulieren! Die folgende Abbildungzeigt einen Ausschnitt der dafür nötigen �Game of Life� Ausgangsgeneration.

    Die lebenden Zellen sind hier schwarz, die toten Zellen sind weiss. Es ist ein Standbild auseinem youtube-Video von Phillip Bradbury: https://www.youtube.com/watch?v=xP5-iIeKXE8, Stand 01.11.2017.

    Die erste Nachfolgegeneration eines Musters auf dem grossen simulierten �Game of Life�Spielbrett entspricht der 35328. Nachfolgegeneration des tatsächlichen, kleinen �Game ofLife� Musters.

    17

    https://www.youtube.com/watch?v=xP5-iIeKXE8https://www.youtube.com/watch?v=xP5-iIeKXE8

  • �Game of Life� in Processing

    Eine universelle Turingmaschine in �Game of Life�

    Auch der spezielle zelluläre Automat �Game of Life� ist Turing-vollständig. Es wird alsovermutet, dass man auf dem �Game of Life� Spielbrett alle berechenbaren Algorith-men durchführen kann. Diese Eigenschaft wird dadurch de�niert, dass man in �Game ofLife� ein anderes Rechnermodell, eine sogenannte universelle Turingmaschine, simu-lieren kann. Diese ist auch nach Alan Turing benannt und spielt in der Informatik eineherausragende Rolle in der �Komplexitätstheorie�. Die folgende Abbildung zeigt einenAusschnitt des �Game of Life� Spielbretts einer Turingmaschine.

    Die lebenden Zellen sind hier schwarz, die toten Zellen sind weiss. Das Bild ist vonPaul Rendell: http://rendell-attic.org/gol/tm.htm, Stand 01.11.2017. Ein zugehörigesyoutube-Video: https://www.youtube.com/watch?v=My8AsV7bA94.

    Der Aufbau dieses �Game of Life� Musters ist sehr komplex. Eine genaue Erklärungmit allen darin vorkommenden Bausteinen füllt ein ganzes Buch: Paul Rendell, TuringMachine Universality of the Game of Life, Springer-Verlag 2016.

    So kompliziert die Turing-Vollständigkeit von �Game of Life� zu verstehen und zu be-weisen ist, sie hat eine interessante Konsequenz. Man könnte die Frage stellen, ob eingegebenes �Game of Life� Muster eine (möglicherweise sehr späte) Nachfolgegenerationeiner gegebenen Anfangsgeneration ist. Es existiert jedoch kein Algorithmus, der dieseFrage allgemein in endlicher Zeit beantworten kann. Würde es solch einen Algorithmusgeben, könnte man nämlich mithilfe der universellen Turingmaschine in �Game of Life�das sogenannte Halteproblem lösen: �Hält eine universelle Turingmaschine mit einerbestimmten Eingabe an?�. Wie Alan Turing 1936 bewies, ist das Halteproblem allerdingsunentscheidbar (es gibt keinen Algorithmus, um dieses Problem zu lösen).

    Deswegen kann man auch in �Game of Life� nicht allgemein vorhersagen, wie sich einbestimmtes Anfangsmuster entwickeln wird.

    18

    http://rendell-attic.org/gol/tm.htmhttps://www.youtube.com/watch?v=My8AsV7bA94

  • 6 Lösungen zu den Aufgaben im Abschnitt 1

    6 Beispiellösungen der Aufgaben

    Lösungen zu den Aufgaben im Abschnitt 1

    Lösung zu Aufgabe 1. Es gibt einige Gemeinsamkeiten zwischen den zwei Mustern.Beide Muster bestehen aus 25x25 Zellen, jede Zelle ist entweder hell oder dunkel einge-färbt. Die Muster haben je eine horizontale und eine vertikale Symmetrieachse und sinddemzufolge auch punktsymmetrisch. Ein zentraler Bereich und viele Zellen in der Näheder Ecken sind bei beiden Mustern hell eingefärbt.

    Andererseits kann man Unterschiede erkennen, insbesondere sind die beiden Muster nichtidentisch. Beim linken Muster gibt es gröÿere Bereiche dunkel eingefärbter Zellen (z. B.2x2 Blöcke und 2x3 Blöcke), beim rechten Muster scheinen die dunkel eingefärbten Be-reiche sich besser zu verteilen. Im linken Muster sind 140 Zellen dunkel eingefärbt, imrechten Muster sind nur 118 Zellen dunkel eingefärbt.

    Man kann sich vorstellen, dass das rechte Muster aus dem linken Muster hervorgegangensein könnte. Groÿ�ächig nicht eingefärbte Bereiche scheinen nicht eingefärbt zu bleiben.In der �Nähe� dunkel eingefärbter Zellen gibt es wiederum einige eingefärbte Zellen. Esgibt einige Zellen, die von links nach rechts ihre dunkle Färbung verlieren. Andererseitsgibt es Zellen, die links noch nicht eingefärbt sind, aber dann rechts dunkel eingefärbtsind. Eine Regel, wie das rechte Muster aus dem linken entstanden sein könnte, ist nichteinfach zu erkennen.

    Lösung zu Aufgabe 2.

    (a) Das zweidimensionale Spielbrett ist aus vielen kleinen Zellen zusammengesetzt. Jedekleine Zelle kann genau einen von zwei Zuständen (�lebend�/nicht eingefärbt und�tot�/dunkel eingefärbt) annehmen. Deswegen bietet es sich an, den Zustand einerkleinen Zelle als Wahrheitswert zu speichern, z. B. False für �tot� und True für�lebend�. Da man sehr viele Objekte hat, die alle denselben Datentyp besitzen, sollteman das Spielbrett als Array umsetzen. Da das Spielbrett zweidimensional ist, wähltman idealerweise ein zweidimensionales Array von Boolean-Werten.

    (b) Ein Spielbrett mit 25x25 toten Zellen entspricht einem zweidimensionalen Array von25x25 False-Wahrheitswerten und kann folgendermassen deklariert und initialisiertwerden:

    boolean [ ] [ ] s p i e l b r e t t = new boolean [ 2 5 ] [ 2 5 ] ;

    Es handelt sich um ein Array voller False-Werte, da Boolean-Variablen automa-tisch mit False initialisiert werden.

    (c) Ein Spielbrett mit 25x25 lebenden Zellen entspricht einem zweidimensionalen Ar-ray von 25x25 True-Wahrheitswerten. Aufgrund des Schreibaufwands kommt esfür ein 25x25 Array nicht in Frage, nach der Deklaration und Initialisierung alleArrayvariablen einzeln mittels folgendem Code zu belegen1:

    boolean [ ] [ ] s p i e l b r e t t = new boolean [ 2 5 ] [ 2 5 ] ;s p i e l b r e t t [ 0 ] [ 0 ]= s p i e l b r e t t [ 0 ] [ 1 ] = . . . = s p i e l b r e t t [ 0 ] [ 2 4 ]= true ;

    1Die Punkte ... sind hier zur besseren Übersicht eingefügt, in Processing müsste dies vollständig(und nicht mit ... abgekürzt) geschrieben werden.

    19

  • �Game of Life� in Processing

    s p i e l b r e t t [ 1 ] [ 0 ]= s p i e l b r e t t [ 1 ] [ 1 ] = . . . = s p i e l b r e t t [ 1 ] [ 2 4 ]= true ;. . .

    s p i e l b r e t t [ 2 4 ] [ 0 ]= s p i e l b r e t t [ 2 4 ] [ 1 ] = . . . = s p i e l b r e t t [ 2 4 ] [ 2 4 ]= true ;

    Ebenso ist es mühsam und unelegant, das Array konkret zu initialisieren2:

    boolean [ ] [ ] s p i e l b r e t t ={{true , true , . . . , true } ,{true , true , . . . , true } ,

    . . .{true , true , . . . , true }} ;

    Kürzer und eleganter geht es mit verschachtelten for-Schleifen:

    boolean [ ] [ ] s p i e l b r e t t = new boolean [ 2 5 ] [ 2 5 ] ;for ( int i =0; i

  • 6 Lösungen zu den Aufgaben im Abschnitt 2

    Lösungen zu den Aufgaben im Abschnitt 2

    Lösung zu Aufgabe 4.

    (a) Die zentrale Zelle in 1. wird geboren, in 2. bleibt tot, in 3. bleibt tot, in 4. wirdgeboren.

    (b) Die zentrale Zelle in 1. wird sterben, in 2. bleibt lebend, in 3. wird sterben, in 4.bleibt lebend.

    (c) Die lebenden Zellen sind dunkel eingefärbt. Über die Zellen aussen am Rand lässtsich keine Aussagen tre�en, da über den Zustand ihrer verbleibenden Nachbarzellenin der Anfangsgeneration nichts bekannt ist.

    Lösung zu Aufgabe 5. Eine tote Zelle mit acht toten Nachbarn bleibt nach den �Gameof Life� Regeln tot. Dass die grösseren Bereiche toter Zellen vom linken Muster zum rech-ten Muster tot bleiben, würde also den �Game of Life� Regeln entsprechen. Dass die Sym-metrie erhalten bleibt, deutet auf klare Regeln, die bei Spiegelung des Spielbretts oderDrehung um 180° genau dasselbe Ergebnis liefern (unter Spiegelung/Drehung um 180°invariant sind). Auch die �Game of Life� Regeln sind invariant unter Spiegelung/Drehungdes Spielbretts. Ohne Überprüfung aller Zellen einzeln (zumindest auf einem Viertel desSpielbretts) kann man allerdings nicht einfach sagen, ob das rechte Spielbrett tatsächlichdie �Game of Life�-Nachfolgegeneration des linken Spielbretts darstellt.

    Streng genommen müsste man zusätzlich hinterfragen, was rundherum am Rand desSpielbretts passiert. Schliesslich sieht man von den Randzellen keine acht Nachbarzellen,sondern nur drei oder fünf. Man könnte annehmen, dass alle Zellen am Rand immertot sein sollen, oder dass sich ausserhalb des gezeigten Spielbrettausschnitts weitere toteZellen be�nden.

    Tatsächlich handelt es sich beim rechten Spielbrett(ausschnitt) um die Nachfolgegenerati-on des linken Spielbrett(ausschnitt)s nach den �Game of Life�-Regeln. Interessanterweisesind es die 23. und 24. Nachfolgegeneration folgendem einfachen Musters:

    21

  • �Game of Life� in Processing

    Lösung zu Aufgabe 6. Neben dem Ausgangsmuster sind die nächsten beiden Genera-tionen abgebildet.

    (a)

    (b)

    (c)

    (d)

    22

  • 6 Lösungen zu den Aufgaben im Abschnitt 2

    Lösung zu Aufgabe 7.

    (a) Folgend ist das Schachbrett und seine Nachfolgegeneration dargestellt.

    ...

    . . . . . .

    ...

    ...

    . . . . . .

    ...

    Das Schachbrett ist bereits in der nächsten Generation vollkommen ausgestorben.Jede lebende Zelle des unendlichgrossen Schachbretts besitzt vier lebende Nachbarn,deswegen stirbt sie. Jede tote Zelle des unendlichgrossen Schachbretts hat auch vierlebende Nachbarn, deswegen stirbt sie.

    (b) Folgend ist die Linie und die erste und zweite Nachfolgegeneration dargestellt.

    ...

    . . . . . .

    ...

    ...

    . . . . . .

    ...

    ...

    . . . . . .

    ...

    Das Spielbrett der nachfolgenden Generationen wird niemals völlig aussterben, son-dern immer aus einer Menge horizontaler Linien bestehen. Die Anzahl von Zeilenlebender Zeilen schwankt. Ausgehend von der einen ursprünglichen Linie lebenderZellen verbreiten sich die Zeilen lebender Zellen beliebig weit nach oben und unten.Es erfordert etwas mathematische Analyse um festzustellen, dass für jede natürli-che Zahl n ≥ 1 in der (2n − 1)-ten Nachfolgegeneration genau 3n Zeilen lebenderZeilen existieren, in der 2n-ten Nachfolgegeneration leben nur genau zwei Zeilenlebender Zeilen. Die Musterentwicklung ist interessant, sie hat starke Beziehungenzum pascalschen Dreieck bzw. �diskreten� Versionen des Siepinskidreiecks.

    23

  • �Game of Life� in Processing

    Lösungen zu den Aufgaben im Abschnitt 3

    Lösung zu Aufgabe 8.

    (a) Wie in vielen �höheren Programmiersprachen� sind in Processing Algorithmen aufArrays gut umsetzbar. Processing ist ideal, um bewegte Gra�ken darzustellen. �Ga-me of Life� verändert sein Muster in festen Schritten. Implementiert man die Be-rechnung der Nachfolgegeneration in draw(), kann durch wiederholtes Aufrufen vondraw() nicht nur eine Nachfolgegeneration berechnet werden. Man erhält durchgeignete Wahl einer framerate eine schöne bewegte Gra�k.

    (b) In setup() steht wie üblich alles, was direkt am Anfang der Programmausführunggetan werden muss. Es handelt sich hier um die generellen Eigenschaften der Gra�k(Fenstergrösse und Framerate). Da das Muster (die Anfangsgeneration von �Gameof Life�) später durch nachfolgende Generationen überschrieben werden soll, erfolgtauch die De�nition des Startmusters. In draw() stehen tatsächliche gra�sche Dar-stellungen (Zeichnen des aktuellen Musters) und wiederkehrende Berechnungen (dieBerechnung der Nachfolgegeneration). Schliesslich soll auch die Nachfolgegenerationder Nachfolgegeneration (und später deren Nachfolgegeneration) berechnet werden.

    (c) Das Spielbrett hat die Grösse 40x40, von spielbrett[0][0] bis spielrbett[39][39]. DieFenstergrösse in Pixeln ist 801x801.

    (d) Auf dem 801x801 Spielbrett sind für jede der 40x40 Zellen maximal 20x20 Pixelvorgesehen. Der zusätzliche Pixel in der Breite und Höhe stellt sicher, dass auch derZellenrahmen der Zellen am rechten und unteren Rand gezeichnet wird.

    Lösung zu Aufgabe 9. Bei den Gra�ken in diesen Unterlagen wurde für lebende Zel-len die Farbe (r, g, b) = (0, 50, 0) und für tote Zellen die Farbe (r, g, b) = (0, 255, 100)verwendet. Sie können beliebige andere Farben wählen!

    Lösung zu Aufgabe 10.

    (a) Man erhält (bis auf die ausgewählten Farben) folgenden Code:

    int i =10;int j =24;

    // Auswahl der Farbe fü r Z e l l e ( i , j )i f ( s p i e l b r e t t [ i ] [ j ] )

    f i l l ( 0 , 5 0 , 0 ) ;else

    f i l l ( 0 , 2 55 , 100 ) ;// Färben der Z e l l e ( i , j )r e c t ( i *20 , j *20 , 20 , 20 ) ;

    (b) Man erhält (bis auf die ausgewählten Farben) folgenden Code:

    // Zeichnen der ak tu e l l e n Generationfor ( int i =0; i

  • 6 Lösungen zu den Aufgaben im Abschnitt 3

    {// Auswahl der Farbe fü r Z e l l e ( i , j )i f ( s p i e l b r e t t [ i ] [ j ] )

    f i l l ( 0 , 5 0 , 0 ) ;else

    f i l l ( 0 , 2 55 , 100 ) ;// Färben der Z e l l e ( i , j )r e c t ( i *20 , j *20 , 20 , 20 ) ;

    }}

    Lösung zu Aufgabe 8.

    // Grösse des S p i e l b r e t t s pro Richtungint dimension=40;

    // Erzeugen e i n e s dimension x dimension gros sen Sp i e l b r e t t sboolean [ ] [ ] s p i e l b r e t t=new boolean [ dimension ] [ dimension ] ;

    void setup ( ){

    s i z e ( 801 , 801 ) ;frameRate ( 1 ) ;

    // Ein Bl inkers p i e l b r e t t [ 3 ] [ 1 1 ]= s p i e l b r e t t [ 4 ] [ 1 1 ]= s p i e l b r e t t [ 5 ] [ 1 1 ]= true ;

    // Ein Quadrats p i e l b r e t t [ 9 ] [ 3 ]= s p i e l b r e t t [ 1 0 ] [ 4 ]=

    s p i e l b r e t t [ 1 0 ] [ 2 ]= s p i e l b r e t t [ 1 1 ] [ 3 ]= true ;

    // Ein G l e i t e rs p i e l b r e t t [ 1 ] [ 1 ]= s p i e l b r e t t [ 2 ] [ 2 ]= s p i e l b r e t t [ 3 ] [ 2 ]=

    s p i e l b r e t t [ 1 ] [ 3 ]= s p i e l b r e t t [ 2 ] [ 3 ]= true ;}

    void draw ( ){

    // Zeichnen der ak tu e l l e n Generationfor ( int i =0; i

  • �Game of Life� in Processing

    }

    // Berechnung des nächsten Musters/* . . .

    . . .

    . . . */}

    Lösung zu Aufgabe 12. Es wird ausgegeben �Der Ganzzahlwert von true ist 1� und�Der Ganzzahlwert von false ist 0�.,

    Lösung zu Aufgabe 13.

    (a) Die Nachbarzellen sind spielbrett[i-1][j-1], spielbrett[i-1][j],spielbrett[i-1][j+1], spielbrett[i][j+1], spielbrett[i+1][j+1],spielbrett[i+1][j], spielbrett[i+1][j-1] und spielbrett[i][j-1].

    (b) Der entsprechende Code:

    int anzahlLebenderNachbarn=int ( s p i e l b r e t t [ i −1] [ j −1])+int ( s p i e l b r e t t [ i −1] [ j ])+int ( s p i e l b r e t t [ i −1] [ j +1])+int ( s p i e l b r e t t [ i ] [ j +1])+int ( s p i e l b r e t t [ i +1] [ j +1])+int ( s p i e l b r e t t [ i +1] [ j ])+int ( s p i e l b r e t t [ i +1] [ j −1])+int ( s p i e l b r e t t [ i ] [ j −1 ] ) ;

    (c) Laut den �Game of Life� Regeln lebt eine Zelle in der Nachfolgegeneration, wenn siein der aktuellen Generation lebt und genau zwei oder drei lebende Nachbarn hat,oder wenn sie in der aktuellen Generation tot ist und genau drei lebende Nachbarnhat.

    Hat eine Zelle genau dreu lebende Nachbarn, wird sie also auf jeden Fall in derNachfolgegeneration (egal, ob sie in der aktuellen lebt oder tot ist). Zusätzlich lebtsie in der Nachfolgegeneration, falls sie genau zwei lebende Nachbarn hat und auchselbst in der aktuellen Generation lebt.

    Genau diese beiden Möglichkeiten werden im Quellcode durch oder verknüpft. Be-achten Sie, dass der Wahrheitswert spielbrett[i][j] identisch ist zur Bedingungspielbrett[i][j]==true.

    Lösung zu Aufgabe 14.

    (a) Man erhält folgenden Code:

    // Erzeugen e i n e s S p i e l b r e t t s f ü r d i e Nach fo lgegenerat i onboolean [ ] [ ] n eu e sSp i e l b r e t t=new boolean [ dimension ] [ dimension ] ;// Berechnung des nächsten Mustersfor ( int i =1; i

  • 6 Lösungen zu den Aufgaben im Abschnitt 3

    for ( int j =1; j

  • �Game of Life� in Processing

    // Auswahl der Farbe fü r Z e l l e ( i , j )i f ( s p i e l b r e t t [ i ] [ j ] )

    f i l l ( 0 , 5 0 , 0 ) ;else

    f i l l ( 0 , 2 55 , 100 ) ;// Färben der Z e l l e ( i , j )r e c t ( i *20 , j *20 , 20 , 20 ) ;

    }}

    // Berechnung des nächsten Musters// Erzeugen e i n e s S p i e l b r e t t s f ü r d i e Nach fo lgegenerat i onboolean [ ] [ ] n eu e sSp i e l b r e t t=new boolean [ dimension ] [ dimension ] ;// Berechnung des nächsten Mustersfor ( int i =1; i