# Das verrückte Labyrinth Scene Builder



## JavaStarterr (15. Mrz 2021)

Moin Zusammen,
ich bin mit meinem Wirtschaftsinformatikstudium so gut wie fertig. Es fehlt nur noch, dass ich ein Spiel programmieren muss. Leider bin ich total schlecht im Programmieren und verzweifel an dieser letzten Aufgabe. Es soll mit Java und Scene Builder erstellt werden. Vielleicht könnt ihr ein Blick auf die Aufgabe werfen und mir sagen wie groß ungefähr der Aufwand ist und wie ich da vorgehen kann/sollte. Oder jemand hat dieses Spiel zufällig schon programmiert.
Vielen Dank

Aufgabenstellung:

vor Spielbeginn:​
Der Benutzer soll vor Spielbeginn für jeden der vier möglichen Spieler festlegen,
ob er mitspielt
wie er heißt
ob er menschlich oder von der normalen oder erweiterten KI gesteuert wird.
Es muss mindestens ein Spieler spielen, damit das Spiel gestartet wird.
Es können auch ausschließlich KIs gegeneinander spielen.

Um die Spieldauer zu verkürzen, soll auch mit weniger Schatzkarten gespielt werden können. Abweichend von den Regeln wird dafür vor Spielstart außerdem festgelegt, wie viele Schatzkarten jeder Spieler erhält (1..24/Spieleranzahl). Per Default sei die maximal mögliche Anzahl eingestellt.
Spielfelderstellung:
Die unbeweglichen Gängekarten (siehe Spielplan in der Spielanleitung) bestehen in den Spielfeldecken aus L-Stücken in der entsprechenden Rotation, an den Rändern aus mit nach außen geschlossenen T-Stücken und an den mittleren 4 Positionen aus mit jeweils um 90 Grad im Uhrzeigersinn gedrehten T-Stücken, beginnend mit einem aufrechten T rechts oben.
Als frei bewegliche Gängekarten existieren 15 L-Stücke, 13 I-Stücke und 6 T-Stücke. Diese werden in zufälliger Rotation an zufällige freie Positionen auf dem Spielfeld verteilt, eine Gängekarte bleibt übrig.
Abweichend vom fertig gedruckten Brettspiel werden die 24 Schätze beliebigen Gängekarten zugeordnet, lediglich die 4 Eckkarten des Spielfeldes erhalten garantiert keinen Schatz. Ein Schatz muss für die Anzeige nicht wie oben dargestellt zusammen mit seiner Gängekarte gedreht werden, darf es aber.
im Spiel:​
Es beginnt immer der Spieler mit der gelben Spielfigur, wenn dieser nicht mitspielt der erste im Uhrzeigersinn folgende teilnehmende Spieler.
Ist ein menschlicher Spieler am Zug, so kann er über den Tastendruck <H> erfahren, welchen Schatz er als Nächstes aufsuchen soll. Dafür wird die Gängekarte mit dem entsprechenden Schatz während des Tastendrucks hervorgehoben.
Ein menschlicher Spieler kann die freie Gängekarte drehen und dann wählen, an welcher Stelle er sie einschiebt. Gestaltet hierfür eine möglichst intuitiv nutzbare Variante.
Ist ein Mensch am Zug und bewegt den Mauszeiger über eine Gängekarte des Feldes, so erscheint diese leicht grün, wenn ein Weg vom aktuellen Spieler zu dieser Gängekarte existiert, andernfalls leicht rot.
Zum Bewegen der Figur klickt der Mensch die Gängekarte an, auf die seine Figur gesetzt werden soll.
Existiert ein Weg bis zu dieser Position, wird die Figur dort hinbewegt und der nächste Spieler ist am Zug.
Erreicht ein Spieler einen Schatz, den er einsammelt, so wird dieser Schatz von der Gängekarte entfernt.  
Anzeige​Das Spielfeld soll zu jedem Zeitpunkt komplett sichtbar sein. Diese Bilder sollen verwendet werden. Wird das Fenster vergrößert, so vergrößert sich auch das Spielfeld, allerdings bleibt es dabei quadratisch.

Zu jedem Zeitpunkt sollen sichtbar sein


die freie Gängekarte in der aktuellen Rotation
welcher Spieler am Zug ist
wie viele Schätze jeder Spieler noch einsammeln muss.
Über [12.3.: ein Menü] eine Menüleiste soll ein neues Spiel begonnen, ein Spiel geladen, das Spiel gespeichert und das Programm beendet werden können.

Animation​Wird eine Gängekarte eingeschoben, so sollen alle Gängekarten der Reihe/Spalte animiert in diese Richtung bewegt werden.

Die Figur soll sich flüssig animiert von Karte zu Karte durch die Gänge zu der gewählten Postion bewegen.

Die Geschwindigkeit für die Bewegung der Gängekarten und davon unabhängig die Geschwindigkeit für die Bewegung einer Figur soll jeweils über einen Menüpunkt für alle kommenden Animationen frei einstellbar sein. Die Animationen können dadurch auch jeweils komplett deaktiviert werden.

KI​normale KI​Die freie Gängekarte ist so einzuschieben, dass der Spielstein möglichst dicht an das nächste Ziel gesetzt werden kann, im Idealfall direkt zum Ziel. Der Abstand zwischen zwei Gängekarten ist dabei durch horizontale plus vertikale Entfernung zu bestimmen. Eine über die Ecke benachbarte Gängekarte ist also weiter entfernt, als eine mit einer Kante anliegende Gängekarte.

Kann der Spieler (Computer) durch keine Einschubvariante einen Weg erzeugen, die ihn näher an das Ziel bringt als bisher, so verschiebt er eine Spalte oder Reihe mit dem Ziel oder mit dem Spielstein. Befinden sich Schatz und Spieler auf einer nicht verschiebbaren Gängekarte, so wird ein beliebiger Schiebevorgang vorgenommen.

Beschreibt in der Dokumentation, wie Eure KI vorgeht, wenn mehrere gleichwertige Positionen oder Schiebeaktionen möglich sind.

erweiterte KI​Erstellt eine erweiterte KI, die sowohl bei Positionierung als auch bei mehreren möglichen gleichwertigen Schiebeaktionen ein von Euch definiertes schlaueres Vorgehen aufweist als Eure normale KI. Beispielsweise ist bei Nicht-Erreichbarkeit des Schatzes eine Position "über Eck" meist sinnvoller als eine an der Kante benachbarte Position, da dann der Schatz im nächsten Schiebevorgang erreichbar wird.
Beschreibt dieses Vorgehen in der Dokumentation gut und erstellt Spielstandsdateien (siehe unten), mit denen man das korrekte Vorgehen dieser KI prüfen kann.



Log​Damit der Programmierer im Falle einer unerwarteten Programmreaktion die Schritte nachvollziehen kann, wird in eine Datei ein Log geschrieben. Diese Datei wird bei jedem Spielstart überschrieben bzw. neu erstellt.
Zu Spielbeginn werden die vorgenommenen Initialisierungen dokumentiert, nach jedem Zug die vorgenommene Schiebe- und Positionierungsaktion. Der Text darf ausführlicher gestaltet werden, als folgend angegeben.
Beispiel:

player0 is human, has treasures 1, 9, 2, 7 
player1 is AI 1, has treasures 6, 5, 24 
player2 not involved
player3 not involved 
player0 shifts row 1 right with waycard {L, rot 1, treasure 0} 
player0 collects treasure 1, next treasures are 9, 2, 7 
... 
Der Text darf in der Logik erstellt werden, da er nicht der Kommunikation mit dem Benutzer dient.
Nach jedem Schreibvorgang muss die Datei geschlossen werden, damit im Falle eines Fehlers keine Information verloren geht.

Spielstandsdatei​Immer, wenn ein Mensch am Zug ist, soll er den aktuellen Spielstand in einem frei gewählten Verzeichnis speichern oder sich den Spielstand aus einer frei gewählten Datei laden können.
Eine Spielstandsdatei ist im json-Format abgelegt und enthält folgende Elemente:


das Feld bestehend aus 7 Spalten mit jeweils 7 Zellen
jede der 49 Zellen hat eine Angabe für
Typ der Gängekarte (I = 0, L = 1 und T = 2)
Rotation der Gängekarte in 90-Grad-Schritten im Uhrzeigersinn (0..3), die nicht rotierte Gängekarte entspricht dem Schriftbild ihres Buchstabens
Nummer des Schatzes (1..24) und 0 für keinen Schatz

freie Gängekarte mit Typ, Rotation, Schatznummer und Position.
Die Position ist zu Spielbeginn (-1, -1), nach einem Schiebevorgang liegt sie an der herausgeschobenen Position, also ist dann entweder die x- oder die y-Koordinate um eins kleiner bzw. größer als eine Koordinatenangabe im Spielfeld
den aktuellen Spieler (0..3), Spieler 0 ist immer der gelbe Spieler
für jeden der vier Spieler die Angaben
nimmt teil
Name
gesteuert von Mensch = 0, AI normal = 1, AI erweitert = 2
Position (0,0 definiert links oben)
die Nummern der einzusammelnden Schätze (1..24) in der Reihenfolge, in der sie aufgesucht werden müssen

Diese Spielstandsdatei enthält das Spielfeld wie oben abgebildet.

Die Datei soll auch geladen und gespielt werden können, wenn eine von der Vorgabe abweichende Anzahl von I-, L- oder T-Gängekarten gespeichert wurden (z.B. gar keine I-Gängekarten) oder die unbeweglichen Gängekarten anders belegt sind als vorgegeben.

Bei der Bewertung werden Spielstandsdateien genau in diesem Format eingesetzt und müssen gelesen werden können. Enthält eine Spielstandsdatei Fehler, so muss dieser möglichst präzise an den Benutzer gemeldet werden.


----------



## httpdigest (15. Mrz 2021)

Das klingt halt wie eine semesterfüllende/-begleitende Praktikums-/Übungsaufgabe. Schätze mal, dass die vom Aufwand her so angelegt ist, dass du die innerhalb von einem Semester schaffen sollst/kannst, wenn man davon ausgeht, dass du eben auch noch andere Termine/Vorlesungen/Übung imselben Semester hast. Wenn das deine letzte Leistung im Semester ist, dann solltest du das ja locker schaffen.
Solche Übungen trainieren nicht nur das Programmieren, sondern viel mehr ein Selbst-/Zeitmanagement und die Fähigkeit, Aufwände abschätzen zu können, was genauso wichtig ist.
Setze dich also hin, und versuche erstmal, Meilensteine zu definieren. Welche Funktionalität kann man in welchen Abständen mit welchen Abhängigkeiten fertigstellen?
Solche Übungen zielen darauf, dass man das eben _üben_ soll. Programmieren (und alles, was dazugehlört) lernt man, indem man programmiert.


----------

