6859
Comment:
|
7203
|
Deletions are marked like this. | Additions are marked like this. |
Line 31: | Line 31: |
Implementieren Sie das Spiel ''2048'' mit Konsolengrafik ('''TODO''': ist ncurses verpflichtend?). | Implementieren Sie das Spiel ''2048'' mit Konsolengrafik ['''TODO''': ist ncurses verpflichtend?]. |
Line 33: | Line 33: |
=== '''Anforderungen''' (Minimum) === | {{{ #!html <div style="font-size: 12pt;font-weight: bold;margin:15px 0 5px 0">Anforderungen (Minimum)</div> }}} |
Line 36: | Line 39: |
* Korrekte Implementierung der oben beschriebenen Spiellogik. | * Korrekte Implementierung der oben beschriebenen Spiellogik. ['''TODO''': Hinweise zu den Pitfalls geben] |
Line 38: | Line 41: |
* '''Pfeil links, Pfeil rechts, Pfeil oben, Pfeil unten''': Zug in die entsprechende Richtung durchführen * '''ESC''': Spiel beenden * '''n''': Spiel neu starten |
* ''Pfeil links/rechts/oben/unten'': Zug in die entsprechende Richtung durchführen * ''ESC'': Spiel beenden * ''n'': Spiel neu starten |
Line 51: | Line 54: |
* Achten Sie selbstverständlich auf alles, was Sie in der Vorlesung gelernt haben: gutes und sinnvolles Klassendesign, Trennung in .h und .cpp Dateien, Einteilung in public/private/protected, Tests für jede nicht-triviale Methode (außer für die Grafik-Methoden), const correctness, valgrind, und allgemein die [[https://ad-wiki.informatik.uni-freiburg.de/teaching/ProgrammierenCplusplusSS2020/Regeln|10 Gebote]]. | * Achten Sie selbstverständlich auf alles, was Sie in der Vorlesung gelernt haben: gutes und sinnvolles Klassendesign, Trennung in ''.h'' und ''.cpp'' Dateien, Einteilung in ''public''/''private''/''protected'', Tests für jede nicht-triviale Methode (außer für die Grafik-Methoden), ''const'' correctness, ''valgrind'', und allgemein die [[https://ad-wiki.informatik.uni-freiburg.de/teaching/ProgrammierenCplusplusSS2020/Regeln|10 Gebote]]. |
Line 53: | Line 56: |
=== Anforderungen (Optional) === | {{{ #!html <div style="font-size: 12pt;font-weight: bold;margin:15px 0 5px 0">Anforderungen (Optional)</div> }}} |
Line 65: | Line 71: |
'''Kurzbeschreibung:''' Implementieren Sie ein Programm, das versucht 2048 automatisch zu lösen. | Implementieren Sie ein Programm, das versucht 2048 automatisch zu lösen. |
Line 67: | Line 73: |
'''Hintergund:''' | {{{ #!html <div style="font-size: 12pt;font-weight: bold;margin:15px 0 5px 0">Anforderungen (Minimum)</div> }}} |
Line 69: | Line 78: |
'''Anforderungen (Minimum):''' '''Anforderungen (Optional):''' |
{{{ #!html <div style="font-size: 12pt;font-weight: bold;margin:15px 0 5px 0">Anforderungen (Optional)</div> }}} |
Line 76: | Line 86: |
'''Kurzbeschreibung:''' 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. | 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. |
Line 78: | Line 88: |
'''Hintergrund:''' Ist Ihnen überlassen. '''Anforderungen (Minimum):''' |
{{{ #!html <div style="font-size: 12pt;font-weight: bold;margin:15px 0 5px 0">Anforderungen (Minimum)</div> }}} |
Projektspezifikation
Contents
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
- Das Spiel wird auf einem Spielbrett mit 4x4 Feldern gespielt.
Auf jedem Feld kann sich eine Kachel befinden, die mit einer Zweierpotenz (2, 4, 16, 32, ...) beschriftet ist.
Zu Beginn des Spiels befinden sich zwei Kacheln auf zwei zufällig gewählten Feldern des Spielbretts. Diese Kacheln sind jeweils mit 90% Wahrscheinlichkeit mit dem Wert 2 und mit 10% Wahrscheinlichkeit mit dem Wert 4 beschriftet.
- Mit den Pfeiltasten (rechts, links, oben, unten) können die Kacheln in die jeweilige Richtung bewegt werden. Jede Kachel bewegt sich dabei so weit, bis sie entweder auf eine Kachel mit einem anderen Wert oder auf den Spielbrettrand stoßen.
- Stoßen bei einem Zug zwei Kacheln mit demselben Wert aufeinander, werden sie zu einer Kachel verschmolzen. Der Wert dieser Kachel ist die Summe der beiden Kacheln.
Mit jedem Zug wird eine neue Kachel an einer zufälligen, leeren Position des Spielbretts hinzugefügt. Der Wert dieser Kachel ist entweder 2 (mit 90% Wkeit) oder 4 (mit 10% Wkeit).
- Die Punktzahl des Spiels ist zu Beginn 0 und erhöht sich bei jedem Verschmelzen zweier Kacheln um den Wert der resultierenden Kachel.
Das Spiel ist gewonnen, sobald eine Kachel mit dem Wert 2048 beschriftet ist.
- Das Spiel ist verloren, wenn kein Zug mehr möglich ist.
Projekt 1: 2048 (das Spiel)
Implementieren Sie das Spiel 2048 mit Konsolengrafik [TODO: ist ncurses verpflichtend?].
Folgende Anforderungen müssen Sie mindestens erfüllen, um volle Punktzahl zu erreichen:
Korrekte Implementierung der oben beschriebenen Spiellogik. [TODO: Hinweise zu den Pitfalls geben]
- Bedienung des Spiels mit folgenden Tasten:
Pfeil links/rechts/oben/unten: Zug in die entsprechende Richtung durchführen
ESC: Spiel beenden
n: Spiel neu starten
- Anzeige der aktuellen Punktzahl.
- Anzeige der Anzahl bisher durchgeführter Züge.
- Anzeige einer Nachricht, wenn das Spiel gewonnen wurde (das Spiel soll aber weiter spielbar bleiben).
- Anzeige einer Nachricht, wenn das Spiel verloren wurde.
- Anforderungen an die Grafik:
- Farbliche Markierung der Kacheln (Kacheln mit unterschiedlichen Werten sollen unterschiedlich farblich hervorgehoben werden).
- Darstellung der Kacheln mit einem geeigneten Abstand zueinander (die Kacheln sollen nicht aneinander "kleben").
- Einheitliche Darstellung der Kacheln: alle Kacheln sollen im gesamten Spielverlauf die gleiche Größe haben. Achten Sie insbesondere darauf, dass Sie genug Platz für alle möglichen Beschriftungen einer Kachel einplanen. Das Erscheinungsbild des Spiels darf im Verlauf des Spiels unter keinen Umständen beeinträchtigt werden (z.B. durch zu lange Beschriftungen einer Kachel, o.ä.).
- Trennung von Spiellogik und Grafik. Alle Funktionalitäten, die mit Ein- bzw. Ausgabe zu tun haben, sollen von der Spiellogik getrennt in eigenen Methoden und/oder Klassen stehen.
Achten Sie selbstverständlich auf alles, was Sie in der Vorlesung gelernt haben: gutes und sinnvolles Klassendesign, Trennung in .h und .cpp Dateien, Einteilung in public/private/protected, Tests für jede nicht-triviale Methode (außer für die Grafik-Methoden), const correctness, valgrind, und allgemein die 10 Gebote.
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:
- Variable Spielfeldgröße, die als Kommandozeilenargument übergeben werden kann.
- Animierte Bewegungen der Kacheln.
Undo Funktion, mit der man X Züge rückgängig machen kann, wobei X als Kommandozeilenargument übergeben wird.
Shuffle Mode: Alle vorhandenen Kacheln zufällig auf dem Spielbrett verteilen.
Evil Mode: Zusätzliche "Evil-Kacheln", die keinen Wert haben (oder einen Wert, der keine Zweierpotenz ist) aber trotzdem ein Feld auf dem Spielbrett belegen (und somit mit keiner normalen Kachel verschmolzen werden können). Wenn zwei Evil-Kacheln aufeinander stoßen, lösen sich beide wieder auf.
- Optimalen Zug vorschlagen lassen.
Projekt 2: 2048 (Automatischer Löser)
Implementieren Sie ein Programm, das versucht 2048 automatisch zu lösen.
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.
- Ein Projekt eigener Wahl ist nur für diejenigen Kursteilnehmer*innen gedacht, die in den bisherigen Übungsblättern fast volle Punktzahl erreicht haben und die das bisher vermittelte Wissen relativ problemlos durchdrungen haben.
- Das Projekt muss in Umfang und Komplexität vergleichbar zu den beiden oben beschriebenen Projekten sein.
- Sie müssen in der Lage sein, das Projekt selbstständig durchzuführen und bei eventuellen Problemen eigenständig Lösungsstrategien zu erarbeiten. Sie können bei Problemen natürlich gerne im Forum nachfragen; Sie müssen aber damit rechnen, dass wir Ihnen nicht bei jedem einzelnen Problem weiterhelfen können.
- Sind diese Voraussetzungen erfüllt, schreiben Sie bitte bis spätestens Sonntag, den 26. Juli 2020, eine kurze Mail an Ihren Tutor (mit Cc an Claudius Korzen und Hannah Bast) mit einer kurzen Beschreibung Ihres Projektes (ein Absatz) und einer kurzen Begründung, warum es in Umfang und Komplexität mit Projekt 1 oder 2 vergleichbar ist (ebenfalls ein Absatz). Wir werden die bis Sonntag eingegangenen Mails dann am Montag, den 27. Juli 2020 besprechen und Ihnen dann anschließend Bescheid geben, ob wir einverstanden sind.
- Sollten wir einverstanden sein, sind Sie nicht verpflichtet, dieses Projekt auch tatsächlich zu bearbeiten. Sie können jederzeit wieder zu Projekt 1 oder Projekt 2 wechseln (z.B. wenn Sie merken, dass Ihr Projekt doch zu umfangreich/schwierig/langweilig ist).