Final Task: Umsetzung eines Computerspiels#

Als Testaufgabe für den Kurs sollen sie ein einfaches Computerspiel umsetzen. Dies orientiert sich an dem Task B und nutzt vergleichbare Komponenten. Es soll ebenso im Design-Pattern [Gamma et al., 1994] Model-View-Controller umgesetzt werden (oder einer Variante davon). Dabei sollen sie in dem Task jeweils die drei einzelnen Bestandteile realisieren und vervollständigen – diese sind ihnen als Startpunkt einmal schon gegeben, ohne die notwendige Funktionalität jedoch schon vollständig zu implementieren.

Beschreibung Zielstellung – Computer Spiel#

Es soll ein typisches 80er Jahre Computerspiel umgesetzt werden. Als Beispiel wird das Spiel Space Invaders (von 1978) für einen Spieler im folgenden verwendet (Sie können alternativ gerne ein anderes Spiel nachimplementieren – für eine Übersicht möglicher Ideen siehe https://gymnasium.farama.org/environments/atari/ und bitte sprechen sie dies einmal kurz per Mail ab).

In Space Invaders startet der Spieler mit einem Raumschiff am unteren Rand des Bildschirms. Das Ziel des Spiels ist es, eine Invasion von Aliens zu stoppen, die in mehreren Reihen am oberen Teil des Bildschirms angeordnet sind und sich langsam nach unten bewegen.

Spielmechanik:

  • Das Raumschiff des Spielers kann sich nach links und rechts am unteren Bildschirmrand bewegen. Die Steuerung erfolgt über Tasten auf der Tastatur oder andere Eingabemethoden.

  • Der Spieler kann dazu Schüsse abfeuern, um die Aliens zu treffen und zu zerstören. Jeder zerstörte Alien bringt dem Spieler Punkte.

  • Die Aliens schießen gelegentlich zurück. Der Spieler muss diesen Schüssen ausweichen, um nicht getroffen zu werden. Ein Treffer führt zum Verlust eines Lebens.

  • Die Aliens bewegen sich in einem festgelegten Muster: Sie verschieben sich seitlich bis zum Rand des Bildschirms und rücken dann eine Zeile tiefer, bevor sie die Bewegung in die entgegengesetzte Richtung fortsetzen.

Ziele des Spiels:

  • Der Spieler muss alle Aliens treffen, um das Level zu gewinnen.

  • Nach einem Level erhöht sich die Geschwindigkeit und Häufigkeit der Alien-Schüsse, was das Spiel zunehmend herausfordernder macht.

  • Das Spiel endet, wenn die Aliens den unteren Bildschirmrand erreichen oder der Spieler alle seine Leben verliert.

../../_images/space_invaders.gif

Anforderungen#

Ein solches Spiel soll in Kleingruppen (2 bis 3 Personen) in C++ implementiert werden – einem Model-View-Control Paradigma folgend. Daher lassen sich die Anforderungen für diese Teile einzeln beschreiben.

Anforderungen Model#

Das Model soll die Dynamik des Spiels umsetzen und realisieren. In dem vorgegebenen Repository findet sich schon eine grundlegende Strukturierung. In diesem Spiel soll dies nun möglichst modular und erweiterbar realisiert werden. Dazu sollen die einzelnen Komponenten je als eigenständige Klassen mit entsprechendem Verhalten implementiert werden. Dabei soll auch über mögliche Hierarchien nachgedacht werden und diese eingesetzt werden (bzw. begründet werden, wo sich dies nicht anbietet).

Als verschiedene Bestandteile wurden oben bereits Raumschiff und Aliens identifiziert. Dazu muss überlegt werden, wie die Spielfeldumrandungen dargestellt werden. Zusätzlich soll als mindestens eine Beispielerweiterung des klassischen Spiels eine weitere Art von aktiven Objekten eingeführt werden (deren genaue Funktionalität kann selbst gestaltet werden; z.B. ein Power-Up, der eingesammelt werden kann, aber bei dem man sich den Aliens nähern muss; ein Hinderniss etc.).

In dem Modell wird dann eine update Funktion zentral sein für den Spielablauf und regelmässig von einer äußeren Schleife aufgerufen. Dabei sollen die Verhaltensweisen der einzelnen Bestandteile soweit möglich in deren Klassen implementiert werden und von hieraus nur aufgerufen werden. Nach der konzeptuellen Entwicklung der Klassen sollen daher in einem ersten Schritt jeweils Tests definiert werden, um diese Klassen zu testen.

Zusammenfassend:

  • Konzept für Klassen der einzelnen Objekte aufstellen und Methoden deklarieren,

  • Funktionalität der Methoden beschreiben (als Kommentar) und Tests definieren (mindestens 3 Testaufrufe, z.B. um die implementierte Dynamik des zu prüfen)

  • erstellen der notwendigen Header-Datei und

  • implementieren in der .cpp Datei.

  • ein zusätzliches PowerUp bzw. spezieller Stein, der das Spiel beeinflusst.

Anforderungen View#

Der View soll den Zustand des Models darstellen. Hierfür kann die einfache Darstellung direkt im Terminal beibehalten werden (libncurses nutzend). Nutzen sie gerne aber auch eine schönere Darstellung zur Umsetzung – wichtig: diese muss auf dem Jupyterhub lauffähig sein (zum Beispiel einsetzen von Simple and Fast Multimedia Library ). Der View darf auf eine Sicht des Model zugreifen und über Methoden die entsprechenden Werte der einzelnen Elemente abfragen.

  • Umsetzung einer Visualisierung,

  • die den aktuellen Zustand des Modells wiedergibt

  • und bei Änderungen diesen automatisch anpasst.

  • Der View soll auch den Spielstand anzeigen und eine Ausgabe, wenn das Level gelöst wurde.

Anforderungen Control#

Im bisherigen MVC-Beispiel wurde im Control die Tastatureingabe direkt an das Model weitergereicht und dort entsprechend verarbeitet. In dieser Umsetzung solllen sie dies abstrahieren: Das Model soll nicht die aufgerufenen Tasten übergeben bekommen, sondern sie sollen dafür spezielle Kommandos oder Anweisungen einführen, die sich auf die Funktionalität des Models beziehen (also anstatt Arrow-left-Taste soll die Anweisung, die an das Model weitergegeben wird, ein allgemeiner Aufruf sein, der das Raumschiff nach links bewegen lässt etc.). Dadurch wird das Model unabhängig von der speziellen Implementierung von Control.

Überlegen sie einmal alternative Control-Möglichkeiten und passieren sie ihr gesamtes Framework so an, dass sie diese darin auch umsetzen könnten (z.B. eine Steuerung über das Trackpad).

Zusammenfassend:

  • Einführung von abstrakten Controll-Komandos, die im Modell umgesetzt werden können und nicht direkt an eine spezifische Umsetzung eines Controllers gebunden sind;

  • Implementierung einer Tastatursteuerung, durch die das Raumschiff (ihr Agent) gesteuert werden kann;

  • Geben sie dazu einmal eine weitere mögliche Umsetzung (als Kommentar oder natürlich auch gerne als Implementierung) an, wie ein Controller noch realisiert sein könnte.

  • Realisieren sie auch einen automatischen Controller, der das Spiel löst und automatisch Kontrollanweisungen an das Modell sendet. Dieser soll durch einen Tastaturbefehl zugeschaltet werden können. Was ändert sich für diesen speziellen Fall in der MVC-Struktur?

Grundlegender Code und Repository-Struktur#

Sie können auf grundlegenden Code (angepasst aus dem Task B) inklusive Makefile zurück greifen. Der Code ist in diesem gitlab zu finden.

Weiterhin dienen als gute Referenzen: https://cppreference.com/ und die C++ Übersicht an der Uni.

Nutzen sie bitte auch das Forum im Learnweb zum Austausch über Fragen und Probleme mit dem Task.

Abgabe#

Die Abgabe erfolgt über das Learnweb:

  • hochladen einer zip Datei: diese enthält alle notwendigen Dateien (Header, CPP, Makefile) und dazu eine README;

  • es muss eine Beschreibung (die README selbst oder eine weitere Datei) beigefügt sein: zur Kompilierung und Ausführung sowie dann zum genauen Ablauf.

  • Anforderung zur Kompilierung und Ablauf: Testen sie ihr Programm unbedingt auf dem Hub der Universität Münster – für ein Bestehen der Aufgabe ist es notwendig, dass dies mindestens dort läuft.

  • Letzter Abgabetermin ist der 31.8.2024.

  • Anforderungen ansonsten wie oben beschrieben.

  • Einsatz von Hilfsmitteln: Sie dürfen für die Programmierung externe Hilfsmittel heranziehen (stackoverflow, andere repositories). Bei der Übernahme von Code ist unbedingt darauf zu achten, dass sie hier die Quelle angeben und dies den Anforderungen des Programms entspricht. Sie können gerne auch KI-Hilfsmittel einsetzen - geben sie dies aber bitte unbedingt an (Interaktion mit welchem Assistenzsystem, Prompt … und auch welcher Teil dadurch erzeugt wurde).

Referenzen#

1

Erich Gamma, Richard Helm, Ralph Johnson, and John M. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional, 1 edition, 1994. ISBN 0201633612. URL: http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=ntt_at_ep_dpi_1.