#acl Claudius Korzen:read,write -All:read = Projektspezifikation = <> 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 == * [[https://play2048.co/|Online spielen]] * 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?]. {{{ #!html
Anforderungen (Minimum)
}}} 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. * 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, quadratische 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 [[https://ad-wiki.informatik.uni-freiburg.de/teaching/ProgrammierenCplusplusSS2020/Regeln|10 Gebote]]. {{{ #!html
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: * 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. {{{ #!html
Anforderungen (Minimum)
}}} {{{ #!html
Anforderungen (Optional)
}}} == 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. {{{ #!html
Anforderungen (Minimum)
}}} * 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).