{
"llm" : {
"feedback" : "# Exercise: parking\n\n### Correctness\n- `FlatRateCard` liefert mit `cost()` immer 150 CHF, auch wenn gar nie geparkt wurde; für den geforderten Gesamtumsatz (156.75 CHF) passt das so sehr wahrscheinlich nicht, weil dadurch immer mindestens 150 CHF Umsatz entstehen würden (unabhängig von Nutzung/Abrechnungszeitpunkt).\n- In `GroupCard` ist `HOURLY_RATE` als `static` definiert; dadurch teilen sich alle `GroupCard`-Objekte denselben Tarif, was bei mehreren Gruppenkarten mit unterschiedlicher Personenzahl zu falschen Kosten führt.\n\n### Suggestion\n- Überlege bei der `FlatRateCard`, wann genau die Monatskosten in deinem System anfallen sollen (z.B. nur einmal pro Abrechnungsperiode/seit letztem `reset()`), und wie `reset()` dabei wirken muss, damit der Umsatz nicht bei jedem `calculateRevenueAndReset()` immer wieder pauschal 150 CHF enthält.\n- Schau dir bei `GroupCard` an, ob der Tarif wirklich eine Klassen-Eigenschaft (für alle gleich) sein soll oder ob er pro Karte (pro Instanz, abhängig vom Konstruktor-Parameter) gespeichert werden muss.\n\n### Code Style\n- In `GroupCard` sollten Felder wie `PersonenAnzahl` und Konstuktorparameter `i` sprechender benannt werden (z.B. konsistent Englisch oder Deutsch, aber nicht gemischt, und camelCase für Variablen).\n- In `FlatRateCard` wird `totalTime` gesammelt, aber nirgends für die Preisberechnung verwendet; das wirkt wie unnötiger Zustand und macht die Klasse verwirrend.\n\n\n# Exercise: labyrinth\n\n### Correctness\n- In `TryStraightFirst` drehst du bei `pathToTheLeft()` bzw. `pathToTheRight()` nur, machst aber **keinen Schritt nach vorne** im selben Schleifendurchlauf; gefordert ist: wenn geradeaus nicht geht, dann links/rechts **versuchen und dann gehen**.\n- In `BacktrackingAlgorithm` fehlt eine Strategie gegen das erneute Betreten bereits besuchter Positionen/Orientierungen; dadurch kann die Rekursion in Labyrinthen mit Zyklen sehr leicht **unendlich laufen** bzw. extrem lange dauern, statt “allgemein” zu funktionieren.\n- In `LabyrinthApp` hast du die vorgegebenen `MAPS` aus der Aufgabe durch eigene Maps ersetzt; damit testest du nicht mehr die Levels, die die Aufgabe eigentlich lösen lassen will.\n\n### Suggestion\n- Überlege bei `TryStraightFirst`: Was soll in einem Iterationsschritt passieren, wenn links (oder rechts) frei ist? Du brauchst typischerweise „drehen + vorwärts“ als zusammengehörige Aktion, sonst stehst du nach dem Drehen noch auf dem gleichen Feld und prüfst im nächsten Durchlauf andere Bedingungen als beabsichtigt.\n- Für `BacktrackingAlgorithm`: Backtracking wird erst “allgemein”, wenn du erkennst, ob du einen Zustand schon mal hattest. Ein “Zustand” ist hier nicht nur `(row, col)`, sondern häufig auch die Richtung (`dir`). Denk an eine Datenstruktur (z.B. Set), in die du solche Zustände beim Betreten einträgst, und die verhindert, dass du sie erneut rekursiv erkundest.\n- Für `LabyrinthApp`: Lass die Original-`MAPS` aktiv und teste darauf. Wenn du eigene Maps willst, kannst du sie zusätzlich machen, aber die Bewertung/Erwartung bezieht sich auf die mitgelieferten Levels.\n\n### Code Style\n- Methoden-/Variablennamen wie `rückwärtsLeft` enthalten Umlaute; das funktioniert je nach Encoding/Tooling nicht immer zuverlässig. Einheitlich ASCII (z.B. `backwardLeft`) ist meist robuster.\n- `BacktrackingAlgorithmWithMemory` ist leer und wirkt wie ein unbenutztes Artefakt; entweder entfernen oder sinnvoll füllen.\n- In `BacktrackingAlgorithm` sind `navigateRec` und die Rückwärts-Hilfsmethoden package-private ohne ersichtlichen Grund; mach Hilfsmethoden eher `private`, um die öffentliche API klein zu halten.\n\n\n# Exercise: swissmap\n\n### Correctness\n- In `SwissMapApp` ist die `main`-Methode als `void main()` deklariert; so wird sie als Programmeinstieg typischerweise nicht erkannt (üblich ist eine `public static void main(String[] args)`-Signatur).\n- In `Mountain.draw` verwendest du einen absoluten Dateipfad zu `mountain.png`; dadurch wird das Bild in der vorgegebenen Umgebung/bei Abgabe sehr wahrscheinlich nicht gefunden (es sollte wie bei `SwissMap`/`Lake` über den Ressourcenpfad geladen werden).\n- Die Hover-Anzeige soll laut Aufgabe die **Beschreibung** anzeigen; bei `City`, `Lake`, `Mountain` zeichnest du aktuell nur `name` (nicht den Text aus `toString()` mit den Zusatzinfos).\n- Deine `getInteractiveArea`-Rechtecke sind nicht um das Objekt zentriert: du startest beim Koordinatenpunkt als linke obere Ecke, obwohl du beim Zeichnen (z.B. City-Punkt) um den Punkt herum zeichnest. Das führt dazu, dass Hover nicht mit der sichtbaren Position übereinstimmt.\n\n### Suggestion\n- Schau dir an, welche Methodensignatur Java als Einstiegspunkt erwartet, und passe die `main`-Methode entsprechend an (Stichworte: `public`, `static`, Parameter).\n- Vergleiche, wie `SwissMap` und dein `Lake` das Bild per Ressourcen-String laden, und mache es bei `Mountain` genauso (kein lokaler Rechnerpfad).\n- Überlege, welche Zeichenkette du beim Hover anzeigen willst: du hast bereits in allen Klassen eine Methode, die genau die gewünschte Beschreibung zusammensetzt.\n- Leite die interaktive Fläche von der tatsächlichen gezeichneten Fläche ab: Wenn du z.B. ein Icon/Punkt um `(x,y)` herum zeichnest, sollte auch das Rechteck um `(x,y)` herum liegen (also mit einem passenden Offset nach links/oben).\n\n### Code Style\n- Unnötige Imports: z.B. `java.awt.*` in `City`, `javax.swing.*` und `java.awt.*` in `ModeButton`, sowie doppelte Imports von `Rectangle`/`Shape` in `ModeButton`.\n- Magische Zahlen (z.B. `50,50,150,50` beim Button; `50,50` beim Hover-Rechteck; Punktgröße `6`) könntest du als Konstanten benennen, damit klar ist, wofür sie stehen und du sie zentral ändern kannst.\n- `ModeButton`-Konstruktor ist package-private (`ModeButton(SwissMap map)`); wenn die Klasse von außen instanziierbar sein soll, wäre ein `public`-Konstruktor konsistenter.\n\n\n# Exercise: visualizer\n\n### Correctness\n- Das `DataPoint`-Interface ist noch leer und erfüllt damit nicht die Aufgabe, eine Schnittstelle zwischen Datensatzklassen und `Visualizer` zu definieren (inkl. Javadoc-Dokumentation).\n- In `Visualizer` sind alle `DUMMY_DOUBLE`/`DUMMY_STRING`-Stellen noch unverändert; damit werden weder Min/Max korrekt berechnet, noch Punkte korrekt geplottet, noch Hover/Legend korrekt angezeigt.\n- `Movie`, `Country` und `Processor` implementieren das `DataPoint`-Interface nicht, wodurch sie nicht als `DataPoint[]` an den `Visualizer` übergeben werden können.\n- In `VisualizerApp` wird weiterhin `new DataPoint[0]` verwendet statt einen der Loader (`loadMovies()`, `loadCountries()`, `loadProcessors()`) als Datensatz zu übergeben; dadurch kann keine Visualisierung der geforderten Daten stattfinden.\n\n### Suggestion\n- Schau dir an, welche Infos der `Visualizer` an den Stellen mit `DUMMY_DOUBLE`/`DUMMY_STRING` jeweils braucht: für die Punktposition (x/y), für Gruppierung/Farbe (Legendeneinträge), und für den Text im Hover (Titel + Detailzeilen). Leite daraus die Methoden im Interface ab.\n- Ersetze anschließend jede Dummy-Stelle in `Visualizer` gezielt durch einen Methodenaufruf auf dem passenden `DataPoint`-Objekt (im jeweiligen Loop also auf `point`, beim Highlight auf `closest`).\n- Mach zuerst nur einen Datensatz (Movies) lauffähig: `Movie` soll `DataPoint` implementieren und für x/y die im Text geforderten Werte liefern (Budget/Raging). Erst wenn das klappt, ziehst du das gleiche Prinzip für `Country` und `Processor` durch.\n- Wenn du `VisualizerApp` umstellst: Achte darauf, dass der Rückgabetyp der Loader-Methoden auch wirklich in ein `DataPoint[]` passt (das ist ein Hinweis darauf, dass die Datensatz-Klassen `DataPoint` implementieren müssen).\n\n### Code Style\n- Viele `TODO`/Dummy-Platzhalter sind noch im Code; sobald du implementierst, entferne die DUMMY-Konstanten bzw. nutze sie nicht mehr, damit klar ist, dass echte Daten verwendet werden.\n- In `VisualizerApp` ist die `main()`-Methode nicht `static` und hat keine `String[] args`-Parameter; falls das bei euch als Einstiegspunkt dienen soll, prüfe die Vorgabe/Projektkonvention (sonst lässt es sich evtl. nicht direkt starten).\n",
"status" : "SUCCESS"
}
}