AD Teaching Wiki:

Projektspezifikation

Abgabefrist für das Projekt ist Dienstag, der 11. August um 12:00 Uhr. Die Abgabefrist kann auf begründeten Antrag verlängert werden. Schreiben Sie dazu bitte eine Mail an Claudius Korzen, mit Cc an Ihren Tutor und Prof. Bast. Wir empfehlen aber sehr, das Projekt sobald wie möglich fertig zu stellen. Die Erfahrung vergangener Jahre zeigt, dass man im Programmieren schnell aus der Übung kommt und es sehr viel mehr Arbeit ist, nach einer längeren Pause wieder anzufangen.

Es gibt drei Projekte zur Auswahl:

Projekt 1: 2048 (Das Spiel)

Projekt 2: 2048 (Automatischer Löser)

Projekt 3: Ein Projekt eigener Wahl (nur für Fortgeschrittene)

Im Folgenden werden wir zunächst das Spielprinzip von 2048 erklären und danach die drei Projekte detaillierter beschreiben.

Spielprinzip von 2048

Projekt 1: 2048 (das Spiel)

Implementieren Sie das Spiel 2048 mit Konsolengrafik (verwenden Sie hierfür ncurses).

Anforderungen (Minimum)

Folgende Anforderungen müssen Sie mindestens erfüllen, um volle Punktzahl zu erreichen.

Anforderungen (Optional)

Wenn Sie möchten, können Sie ihr Spiel um beliebige Funktionalitäten erweitern (müssen es aber nicht, um volle Punktzahl zu bekommen). Hier sind einige Ideen:

Projekt 2: 2048 (Automatischer Löser)

Implementieren Sie ein Programm, das 2048 automatisch so spielt, dass ein möglichst großer Wert für die größte Kachel (und damit auch eine möglichst hohe Punktzahl) erreicht wird. Als Hilfe stellen wir Ihnen zwei statische Bibliotheken libgame2048.a und libgame2048_main.a und die Header-Dateien Game2048Strategy.h, Game2048State.h und Game2048Drawer.h zur Verfügung. Sie finden die Dateien auf dem SVN unter public/code/projekt. Hier eine kurze Erklärung dazu:

1. Die Datei Game2048Strategy.h enthält die Deklaration einer einfachen abstrakten Klasse Game2048Strategy. Ihr Solver muss eine Unterklasse dieser Klasse sein und eine Methode selectMove bereitstellen, die für ein gegebenes Objekt der Klasse Game2048State (siehe nächster Punkt) den nächsten Zug berechnet.

2. Die Datei Game2048State.h enhält die Deklaration einer Klasse Game2048State. Ein Objekt dieser Klasse repräsentiert einen Zustand des Spiels. Die Klasse stellt diverse Methoden für Ihren Solver zur Verfügung. Einige davon brauchen Sie auf jeden Fall (die Methoden dieser Klasse sind Ihre einzige Möglichkeit, den Zustand des Spieles zu verändern), andere sind optional (zum Beispiel getColumn und getRow, die eine Zeile bzw. Spalte als uint16_t zurückliefern, was für eine besonders effiziente Implementierung mittels table lookup interessant sein kann).

3. Die Datei Game2048Drawer.h enthält die Deklaration einer Klasse Game2048Drawer mit einer Methode drawGameState, die einen gegebenen Zustand schön darstellt. Sie müssen diese Methode nicht benutzen, sie könnte aber beim Debuggen oder beim Testen Ihrer Strategie hilfreich sein.

4. Die Bibliothek libgame2048.a liefert die Implementierung für die Methoden aus den Klassen Game2048State und Game2048Drawer. Sie können Sie wie eine .o Datei einfach dazulinken oder mit -L. -lgame2048 (siehe Vorlesung 2).

5. Die Bibliothek libgame2048_main.a liefert die Implementierung einer main Funktion, mit der Sie Ihre Strategie auf 100 von uns vorgegebenen Benchmarks laufen lassen können. Sie müssen dazu in einer Ihrer .o Dateien die globale Funktion Game2048Strategy* getStrategy() implementieren. Achtung: diese Bibliothek muss bei Linken *vor* der libgame2048.a kommen.

Die main Funktion aus Punkt 5 visualiert den Zustand des Spiels (Sie werden es sehen, wenn Sie das Ü11 bearbeiten). Mit der Leertaste lässt sich die Visualisierung anhalten und wieder fortsetzen. Mit der Taste s (für step) können Sie sich langsam einen Zug nach dem anderen anschauen. Mit dem ersten Argument der Kommandozeile können Sie die Anzahl Benchmarks kontrollieren (Sie können auch mehr als 100 laufen lassen, für die Wertung zählen aber nur die ersten 100).

Anforderungen (Minimum)

Folgende Anforderungen müssen Sie erfüllen, um volle Punktzahl zu erreichen.

Tipp

Es gibt viele Möglichkeiten und Strategien für dieses Spiel. Hier ist eine relativ naheliegende: Überlegen Sie sich eine nicht-triviale heuristische Funktion, die bewertet, wie gut ein Zustand ist. Schreiben Sie eine Methode, die einige Züge simuliert und einen Zug in die Richtung des bestmöglichen Zustandes macht. Behandeln Sie dabei die zufällige Kachel als den Gegner (siehe Vorlesung 11) und simulieren Sie auch verschiedene (bzw. alle) Züge des Gegners, um den Erwartungswert zu approximieren (bzw. zu berechnen) (siehe Expectimax).

Projekt 3: Ein Projekt Ihrer Wahl

Alternativ zu den beiden oben beschriebenen Projekten können Sie auch ein Projekt Ihrer Wahl, das in Umfang und Komplexität vergleichbar zu den beiden Projekten ist, wählen.

Anforderungen (Minimum)

AD Teaching Wiki: ProgrammierenCplusplusSS2020/Projekt (last edited 2020-08-04 17:06:23 by adpult)