Eine kleine Virus-Simulation im Game-of-Life-Stil.
Bei dem Projekt handelt es sich um mein erstes "größeres" Programmierprojekt, welches ich in meinem zweiten Semester im Rahmen der Veranstaltung "Programmieren interaktiver Systeme" an der THM umgesetzt habe.
Aus der Aufgabenstellung entnommen: "Thematisch ist die Aufgabe, eine Animation, eine Simulation oder ein Spiel umzusetzen. Die Anwendung muss interaktiv sein (Beispiel: Spiel) bzw. interaktiv parametrisierbar sein (Beispiel: Animation, Simulation). Ziel ist es zu zeigen, dass Sie eine eigenständig gewählte Aufgabe alleine und selbstständig gemäß den in der Veranstaltung vermittelten Inhalte umsetzen können und die durch die Bewertungskriterien erfassten Kompetenzen erworben haben."
Für die volle Punktzahl wurden die Lines-of-Code auf 480 Zeilen beschränkt.
„Game of Corona“ ist eine Abwandlung des Klassikers „Game of Life“. Der User kann einzelne Zellen „infizieren“ und benachbarte Zellen können sich anders als beim Original „Game of Life“ anhand eines Zufallswertes anstecken. Zellen mit Maske können eine geringere Ansteckungswahrscheinlichkeit haben. Die Zellen können nach einer Infektion sterben oder immun werden. Der User soll die Simulation beeinflussen können, indem er Zellen infiziert, impft, Masken tragen lässt oder tötet. Darüber hinaus kann über verschiedene Parameter festgelegt werden wie schnell die Simulation ist, wie hoch Infektionswahrscheinlichkeit von Zellen mit erkranktem Nachbarn ist, wie effektiv eine getragene Maske vor einer Erkrankung schützt, wie tödlich diese ist und mit welcher Wahrscheinlichkeit es zu einer erneuten Infektion trotz eigentlicher Immunisierung kommen kann. Zusätzlich kann man die „ticks till event“ konfigurieren, von welchen die Dauer einer Infektion und der Immunität abhängen.
Anmerkung: Ursprünglich war ein Feature geplant, welches die Anzahl der Zellen dynamisch skalierbar gemacht hätte. Einige der Datenstrukturen und Umsetzungen berücksichtigen dies auch bereits, um eine eventuelle Umsetzung in der Zukunft zu vereinfachen. Damit die Anzahl der Zeilen nicht 480 übersteigt, wurde dies jedoch noch nicht implementiert.
Durch einen Klick auf die entsprechenden Button können die folgenden Aktionen durchgeführt werden:
Der Wert eines Sliders kann entweder durch Klicken einer Position innerhalb des selbigen oder durch Hovern und Verwendung des Mausrades verändert werden.
Titel | Beschreibung | von | bis | Einheit |
---|---|---|---|---|
ms delay between updates | Die Zeit, die zwischen Update-Ticks vergeht. | 0 | 2500 | Millisekunden |
infection probability | Die Wahrscheinlichkeit, mit welcher sich eine Zelle bei einem infizierten Nachbarn im nächsten Update ansteckt. | 0 | 100 | % |
infection reduction by mask | Wie effektiv eine Maske vor einer Infektion schützt. | 0 | 100 | % |
death probability | Die Wahrscheinlichkeit, mit welcher eine Zelle an einer Infektion stirbt. | 0 | 100 | % |
chance of becoming infectabel | Die Wahrscheinlichkeit, mit welcher sich eine Zelle nach der Immunisierung wieder infizieren kann. Nach Ablauf der garantierten Immunitätsdauer wird jede Runde gewürfelt. | 0 | 100 | % |
random tickeventrange | Die Tickrange bestimmt, wie lange eine Zelle höchstens krank sein kann. Der Wert multipliziert mit fünf bestimmt die garantierte Immunitätsdauer einer Zelle. Die "ticks till event" sind ein Versuch, die Willkür des Lebens zu erfassen. | 0 | 100 | "game ticks" |
Name | Paket | Teil von | Type | LOC | Anteil in % | Kurzbeschreibung |
---|---|---|---|---|---|---|
Cell | engine | AL | Klasse | 32 | ≈ 7% | Eine einzelne Zelle der Simulation. |
CellStatus | engine | AL | Enum | 4 | ≈ 1% | Die möglichen Zustände, die eine Zelle annehmen kann. |
Engine | engine | AL | Klasse | 172 | ≈ 38% | Der Kern der Anwendung. |
GameOfCorona | engine | AL | Interface | 37 | ≈ 8% | Die Schnittstelle zwischen AL und PI. |
Grid | presentation | PI | Klasse | 33 | ≈ 7% | Raster zur Ausrichtung der Zellen. |
PI | presentation | PI | Klasse | 172 | ≈ 38% | Die Präsentation und Interaktion der Simulation. |
Main | - | - | Klasse | 8 | ≈ 2% | Die Klasse mit der Main-Methode. |
Name | Paket | LOC | Anteil in % | Kurzbeschreibung |
---|---|---|---|---|
engine | AL | 245 | ≈ 54% | Zusammenfassung des Pakets "engine". |
presentation | PI | 206 | ≈ 45% | Zusammenfassung des Pakets "presentation". |
Gesamtes Projekt | - | 458 | - | Gesamtzeilen des Projekts = AL + PI + Main-Klasse |
- Digital:
- https://javabeginners.de/index.php
- https://docs.oracle.com/javase/8/docs/api/
- die im PiS Moodle Kurs zur Verfügung gestellten Dokumente
- https://processing.org/reference/
- Analog:
- Kofler M.(2019), "Java der Grundkurs", 3. Auflage, Rheinwerke-Verlag
- Niemann A. (2007), "Objektorientierte Programmierung in Java", 5. Auflage, bhv
- Website: http://www.sojamo.de/libraries/controlP5/
- auf GitHub: https://github.com/sojamo/controlp5
-
Der Algorithmus zum Finden benachbarter Zellen wurde von Seite 233 des Buches "Java der Grundkurs" von Michael Kofler inspiriert. Dort erklärt dieser, wie man die Bewegung einer Schachfigur auf Gültigkeit prüfen und mit einer ungültigen Bewegungen umgehen kann.
-
Aufgrund der sehr bescheidenen Dokumentation der controlP5-Bibliothek, habe ich mich an den Beispieldateien orientiert, die im entsprechenden Projekt auf GitHub zur verfügung gestellt werden:
-
In JUnit habe ich mich unter Verwendung der folgenden Videos eingearbeitet:
Alle Links wurden zuletzt am 11.06.2021 geprüft.