Conways Game of Life (dt. "Spiel des Lebens") ist eine 1970 von John Conway erdachte Computersimulation.
Die Simulation findet statt auf einem karierten Spielfeld. Auf diesem befinden sich in den Zellen "Lebewesen". Diese Lebewesen bleiben am Leben, sterben oder bringen neues Leben nach einem Satz einfacher Regeln hervor.
Einen beispielhaften Ablauf zeigt diese Animation:

Regeln der Simulation: In jedem Simulationsschritt ("Generation") werden alle Felder des Spielfelds (engl. Grid) betrachtet:
Eine Beschreibung der Regeln (und noch viel mehr) finden Sie auch unter https://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens.
Aufgabe:
Implementieren Sie eine Version von Conways Game of Life!
Setzen Sie dabei folgende Schritte um:
Nutzen Sie zur Implementierung die vorhandene Klasse GoLGrid. Diese bietet Funktionalitäten zur graphischen Anzeige des Spielfelds sowie weiteren Hilfsfunktionen.
Um diese Klasse zu nutzen laden Sie die Java-Datei GoLGrid.java herunter und kopieren sie in Ihr Projektverzeichnis (Ordner src).
Sie können diese dann mit folgenden Anweisungen nutzen:
Erzeuge leeres Spielfeld mit übergebener Größe und zeige es an:
// Erzeuge Spielfeld 20x20 GoLGrid grid = new GoLGrid(20);
setData: Setze Inhalt des angezeigten Spielfelds auf Werte aus dem übergebenen int[][]. Die Größe des übergebenen Arrays muss der Größe des Spielfelds entsprechen. Die Bedeutung der Elemente lautet: 0 = Zelle tot, 1 = Zelle lebendig
int[][] data = new int[20][20]; grid.setData(data);
createRandom: Erzeuge Array von Größe des Spielfelds und fülle es mit zufälligen Werten. Als Parameter kann die Wahrscheinlichkeit übergeben werden, dass eine Zelle lebendig ist.
// Erzeuge Daten mit 20% lebendigen Zellen int[][] data2 = grid.createRandom(0.2);
getNumberOfNeighbors: Erhalte die Anzahl der Nachbarn einer Zelle an der Position (x,y). Die Zelle links oben hat die Position (0, 0).
Für Zellen, die am Rand des Spielfelds liegen, sind auch Zellen auf der anderen Seite des Spielfelds Nachbarinnen. Wenn man das Spielfeld beispielsweise nach rechts verlässt, befindet man sich gedanklich am linken Rand.
// Nachbarn der Zelle an x=3, y=4 int nachbarn = grid.getNumberOfNeighbors(3,4);
sleep: Pausiere Programm für übergebene Anzahl von Millisekunden (1s = 1000ms)
// Pausiere 0,2s grid.sleep(200);
Hinweise:
Ein magisches Quadrat ist eine Tabelle von natürlichen Zahlen mit n Zeilen und n Spalten, die folgende Bedingungen erfüllt:
Im Folgenden sind zwei magische Quadrate für n = 3 und n = 5 gezeigt:

Gehen Sie wie folgt vor:
Lesen Sie vom Benutzer einen Wert n ein.
Erzeugen Sie ein magische Quadrat nach folgendem Algorithmus:
Erzeugen Sie ein zweidimensionales Feld quadrat mit n Zeilen und Spalten
Initialisieren Sie eine int-Variable zeile mit dem Wert (n-1)/2 und eine int-Variable spalte mit dem Wert (n+1)/2.
Gehen Sie dann alle Zahlen i von 1 bis n2 durch und führen Sie jeweils folgende Schritte aus:
Weisen Sie dem Element quadrat[zeile][spalte] den Wert i zu
Erhöhen Sie spalte um 1 und vermindern Sie zeile um 1.
Wenn zeile kleiner als 0 ist, weisen Sie zeile den Wert n-1 zu
Wenn spalte gleich n ist, weisen Sie spalte den Wert 0 zu
Wenn das Element quadrat[zeile][spalte] nicht den Wert 0 hat, führen Sie folgende Schritte durch:
Erhöhen Sie zeile und spalte jeweils um 1
Wenn zeile gleich n ist, weisen Sie zeile den Wert 0 zu
Wenn spalte gleich n ist, weisen Sie spalte den Wert 0 zu
Geben Sie das erzeugte Quadrat auf die Konsole aus.
Prüfen Sie, ob das erzeugte Quadrat tatsächlich ein magisches Quadrat ist (Kriterien siehe oben!).
Hinweis: Der Algorithmus funktioniert nur für ungerade Zahlen n (also 3, 5, 7...)!
Hinweis: Diese Aufgabe ist eine freiwillige Zusatzaufgabe.
Gegeben ist folgende Klasse Zaehler:
public class Zaehler { private int count = 0; public void erhoehe() { count++; } public void zuruecksetzen() { count = 0; } public void drucke() { System.out.println("Zählerstand: " + count); } public int gibStand() { return count; } }
Erzeugen Sie die Klasse in Eclipse.
Schreiben Sie eine Testklasse 1 für die Klasse Zaehler. Die Testklasse soll:
z1 und z2 der Klasse Zaehler erzeugen,z1 und einmal für z2 die Methode erhoehe aufrufen,z1 und z2 jeweils die Methode drucke aufrufen,z1 die Methode zuruecksetzen aufrufen,gibStand abfragen.Überprüfen Sie, ob das erwartete Ergebnis ausgegeben wird. Nutzen Sie auch den Debugger in Eclipse um sich die Zusammenhänge klar zu machen.
Implementieren Sie eine Klasse Radio mit folgenden Attributen:
eingeschaltet, wenn ein Radio an oder aus ist.lautstaerke: wie laut spielt das Radio Musik? (Die Lautstärke soll nur im Bereich von 0 bis 10 liegen.)frequenz, die die Frequenz des gewählten Senders angibt (Erlaubter Frequenzbereich ist zwischen 85.0 und 110.0).Bei Erzeugung eines Objekts sollen die Attribut folgende Werte besitzen: eingeschaltet = false, lautstaerke = 5, frequenz = 100.0.
In der Klasse Radio sollen folgende Methoden implementiert werden:
lauter(), leiser(): Diese Methoden sollen die Lautstärke ändern (nur möglich im Zustand an).an(), aus(): Diese Methoden sollen den Zustand des Attributs eingeschaltet ändern.public String toString(): Diese Methode soll Informationen über den internen Zustand als String zurückgeben. Es soll eine Zeichenkette der Form "Radio an: Freq=98.4, Laut=2" zurückgeben.waehleSender(double frequenz): Diese Methode soll eine Frequenz speichern. Ist die gewählte Frequenz außerhalb der erlaubten Frequenzbereichs, so soll die Frequenz 99.9 gewählt werden.Implementieren Sie als Teil der Klasse eine main()-Methode, welche ein Objekt vom Typ Radio erstellt und die Methoden mit unterschiedlichsten Aufrufen testet. Testen Sie auch Randwerte und „falsche“ Parameter!
Sie möchten eine Anwendung programmieren, um Kontakte und ihre Adresse(n) verwalten zu können. Dazu nutzen wir Klassen als zusammengesetzte Datentypen. Methoden werden nicht benötigt.
Bearbeiten Sie folgende Teilaufgaben:
Erstellen Sie eine Klasse Kontakt, die zu einem Kontakt folgende Informationen mit geeigneten Attributen speichern kann:
Erstellen Sie eine Klasse KontaktTest mit einer main-Methode, in der Sie testweise mindestens drei Objekte für Ihre Kontakte erstellen.
Erweitern Sie KontaktTest so, dass die Kontakt-Objekte in einem Array meineKontakte abgelegt werden. Berechnen Sie das Durchschnittsalter Ihrer Kontakte und geben Sie es aus!
Sie möchten nun für die Adresse eine eigene Klasse definieren.
Erstellen Sie dazu eine Klasse Adresse, welche aus den Attributen für Strasse, Hausnummer, Postleitzahl und Stadt besteht.
Ersetzen Sie die vier Attribute in Kontakt durch ein Attribut vom Datentyp Adresse (z.B. Adresse addresse;).
Passen Sie Ihre Klasse KontaktTest an.
Nun erlauben wir mehrere Adressen für einen Kontakt.
Ändern Sie die Adresse in ein Array von Adressen um (also z.B. aus Adresse adresse; wird Adresse[] adressen;).
Passen Sie wieder Ihre Klasse KontaktTest an. Geben Sie mindestens einem Kontakt eine zweite Adresse.
Eine Testklasse ist eine weitere Klasse (z.B. ZaehlerTest), die in unserem Fall Objekte vom Typ Zaehler
erzeugt und die Funktionalität testet.
Dieses grundlegende Vorgehen setzt man bei professioneller Softwareentwicklung in erweiterter Form ein, um systematisch
die Qualität sicherzustellen (Unit Tests mit JUnit). ↩