AutoFeedback API

Result 2708b17e-1328-4f6a-b404-4dafa9375ed6

{
  "llm" : {
    "feedback" : "# Exercise: parking\n\n### Correctness\n- `ParkingCard` ist nicht als `public interface` deklariert; gemäss Aufgabenstellung soll das Interface genau so (öffentlich) definiert sein, damit es wie vorgesehen von überall im Projekt verwendet werden kann.\n- `FlatRateCard.cost()` liefert immer 150, unabhängig davon, ob überhaupt geparkt wurde; damit wird beim Beispielablauf ein Umsatz erzeugt, selbst wenn die Karte nie benutzt worden wäre (Abo-Kosten sollten typischerweise nur einmal pro Abrechnungsperiode zählen, nicht automatisch pro “Revenue berechnen”-Aufruf).\n\n### Suggestion\n- Schau dir die Sichtbarkeit von `ParkingCard` an: Wenn andere Packages/Tests darauf zugreifen sollen, brauchst du die passende Modifier-Kombination am Interface (und die Datei muss dazu passen).\n- Überlege beim Abo (`FlatRateCard`), wann genau die 150 CHF anfallen sollen: pro Monat/Periode oder jedes Mal wenn `calculateRevenueAndReset()` aufgerufen wird. Du könntest dafür intern einen Zustand speichern, ob die Monatsgebühr für die aktuelle Periode schon verrechnet wurde, und diesen Zustand ggf. bei `reset()` passend behandeln.\n\n### Code Style\n- In `GroupCard` fehlt beim Konstruktor der `public`-Modifier; wenn die Klasse von ausserhalb des Packages instanziert werden soll (oder die Vorgabe es so erwartet), ist das schnell ein Stolperstein.\n- In `FlatRateCard` sind `park()` und `reset()` leer; auch wenn das fachlich evtl. ok ist, wäre ein kurzer Kommentar hilfreich, warum diese Methoden absichtlich nichts tun bzw. wie das Abomodell gedacht ist.\n\n\n# Exercise: labyrinth\n\n### Correctness\n- `BacktrackingAlgorithm` implementiert keinen Backtracking-Ansatz im Sinne der Aufgabe (kein Merken von Kreuzungen/Entscheidungen und kein gezieltes Zurückgehen an die letzte offene Verzweigung), sondern eine reine „linke-Hand-Regel“/Greedy-Wall-Following-Strategie.\n- Wenn links/vorne/rechts kein Pfad ist, drehst du nur um (`turnRight()` zweimal), machst aber keinen Schritt zurück; dadurch ist das Verhalten bei Sackgassen nicht das, was unter Backtracking verstanden wird (Rückweg entlang des zuletzt genommenen Pfads).\n\n### Suggestion\n- Überlege dir, was „Backtracking“ hier konkret bedeutet: Du brauchst typischerweise einen Speicher darüber, welche Abzweigungen du schon ausprobiert hast (z.B. eine Historie/Stack von Entscheidungen oder Position+Richtung), damit du nach einem Fehlschlag systematisch zur letzten offenen Alternative zurück kannst.\n- In einer Sackgasse reicht „umdrehen“ nicht als Backtracking-Schritt: Prüfe, wie du sicherstellst, dass du tatsächlich den Gang zurückläufst und nicht nur weiter nach lokalen Regeln „irgendwohin“ läufst.\n- Teste dein `BacktrackingAlgorithm` gedanklich/mit eigenen Maps, die Schleifen (Ringe) oder Inseln haben: In solchen Fällen zeigt sich schnell, ob du wirklich systematisch alle Möglichkeiten abarbeitest oder ob du nur einer Wand folgst.\n\n### Code Style\n- Der Kommentar `// @LLM: ...` ist für Abgaben unüblich; ersetze ihn lieber durch eine fachliche Begründung (oder entferne ihn), sonst wirkt es wie eine Notiz statt Dokumentation.\n- Du hast in der Abgabe viele Template-Dateien (Figure, Labyrinth, LabyrinthGame, …) unverändert mitkopiert; falls das nicht verlangt ist, gib normalerweise nur die Dateien ab, die du tatsächlich ändern/neu schreiben solltest (Algorithmen + die kleine Änderung in `LabyrinthApp`).\n\n\n# Exercise: swissmap\n\n### Correctness\n- In `City.getInteractiveArea`, `Lake.getInteractiveArea`, `Mountain.getInteractiveArea` und `ModeButton.getInteractiveArea` verwendest du `new Rectangle(...)`, aber importierst/benutzt dabei nicht die vorgegebene `gui.component.Rectangle`-Klasse, sondern deine eigene `ch.fhnw.prog1.exercise.swissmap.Rectangle`. Das ist zwar erlaubt, aber dann muss sichergestellt sein, dass die interaktive Fläche korrekt zu deinem gezeichneten Objekt passt – bei dir ist das teilweise nicht der Fall (siehe nächste Punkte).\n- `City.getInteractiveArea(...)`: Du gibst ein Rechteck mit `radiusNoHover*2` Breite/Höhe zurück, aber beim Hover zeichnest du einen grösseren Kreis (`radiusHover`). Dadurch kann es passieren, dass man über dem sichtbaren (grossen) Kreis ist, aber kein Hover ausgelöst wird.\n- `Lake.getInteractiveArea(...)` und `Mountain.getInteractiveArea(...)`: Die zurückgegebene Rechteckgrösse passt nicht zu dem, was du zeichnest. Du zeichnest zentriert mit `drawImageCentered(...)` und skaliert (`scaleNoHover/scaleHover`), aber deine `getInteractiveArea` nutzt fixe Werte wie `picWidth/2` und `picHeight/2` ohne konsistenten Bezug zur tatsächlichen Bildgrösse *und* zum verwendeten Scale. Dadurch wird Hover/Klick-Fläche sichtbar “daneben” oder zu klein/gross sein.\n- `ModeButton.onRightClick(...)`: Laut Aufgabenhinweis darf `onRightClick` leer bleiben; bei dir toggelt Rechtsklick aber ebenfalls den Modus. Das entspricht nicht dem beschriebenen Verhalten (“bei einem Klick … und bei erneutem Klick wieder…”, gemeint ist links klicken).\n\n### Suggestion\n- Überlege bei jeder Komponente: Soll die interaktive Fläche das Objekt im Normalzustand treffen oder auch im Hover-Zustand? Falls auch im Hover-Zustand, muss `getInteractiveArea` zur grösseren Darstellung passen (z. B. grösserer Radius / grösseres Bounding-Box-Rechteck).\n- Bei `drawImageCentered(...)`: Mach dir klar, welche Breite/Höhe das Bild *auf dem Bildschirm* tatsächlich hat (Originalpixel * Scale) und dass “centered” bedeutet, dass du für ein Rechteck die Mitte als Zentrum nimmst. Daraus kannst du eine konsistente Rechteckfläche ableiten.\n- Entscheide, ob Rechtsklick überhaupt etwas machen soll. Wenn nicht: implementiere `onRightClick` wirklich als No-Op, damit dein Verhalten exakt zur Aufgabenbeschreibung passt.\n\n3. Code Style:\n- `mouseOver` ist in mehreren Klassen package-private (kein Modifier). Mach es `private`, damit der Zustand wirklich gekapselt bleibt.\n- In `City`, `Lake`, `Mountain` baust du den Info-Text manuell statt `toString()` zu verwenden; das ist doppelte Logik (und macht Formatierungen inkonsistent). Besser wäre, eine zentrale Darstellung zu nutzen.\n- Deine eigene Klasse `Rectangle` hat denselben Namen wie die im Auftrag erwähnte vordefinierte `Rectangle`-Klasse. Das ist leicht verwirrend beim Lesen/Importen; ein anderer Name (oder konsequente Nutzung der Library-Klasse) würde Missverständnisse vermeiden.\n- Viele “magic numbers” (Fontsize, Padding, Bildgrössen) sind sinnvoll als Konstanten ausgelagert (das hast du teils gemacht), aber die Werte sollten konsistent genutzt werden (z. B. dieselben Breiten/Höhen/Scales sowohl fürs Zeichnen als auch für `getInteractiveArea`).\n\n\n# Exercise: visualizer\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\n",
    "status" : "SUCCESS"
  }
}