{
"llm" : {
"feedback" : "# Exercise: todo\n\n### Correctness\n- Die drei geforderten Methoden `listTasks(boolean all)`, `addTask(String description)` und `markTaskDone(int id)` sind noch nicht implementiert.\n- Es fehlt das geforderte `Task`-Modell (Klasse mit mindestens ID, Beschreibung und “done”-Status inkl. `toString()`), das für die Ausgabe per `IO.println(task);` nötig ist.\n- Es fehlt das geforderte Array für `Task`-Objekte in `ToDoApp`, in dem die Tasks gespeichert werden (damit `add`, `list`, `mark done` überhaupt wirken können).\n\n### Suggestion\n- Lege in `ToDoApp` ein Feld an, das ein `Task[]` enthält, und überlege dir zusätzlich, wie du festhältst, wie viele Plätze davon schon benutzt sind (oder wie du den “ersten freien Platz” findest).\n- Implementiere eine `Task`-Klasse mit den Attributen, die in der Aufgabenbeschreibung vorkommen (ID/Index, Description, Done-Flag) und überschreibe `toString()` so, dass `IO.println(task)` genau die gewünschte Darstellung liefern kann.\n- In `listTasks(all)`: Iteriere nur über die tatsächlich vorhandenen Tasks und gib je nach `all` entweder alle oder nur die nicht-erledigten aus; falls nichts ausgegeben wurde, musst du explizit `(No tasks)` drucken.\n- In `markTaskDone(id)`: Nutze, dass die ID dem Array-Index entspricht, aber prüfe zuerst, ob an dieser Stelle wirklich ein Task existiert; sonst gib die geforderte Fehlermeldung aus.\n\n### Code Style\n- In deinem Abgabe-Stand sind noch alle `// TODO`-Platzhalter vorhanden; entferne diese bzw. ersetze sie durch die Implementierungen, bevor du abgibst.\n\n\n# Exercise: energymeter\n\n### Correctness\n- Es fehlen die beiden Attribute `capacity` und `level`.\n- Es fehlt der Konstruktor `EnergyMeter(double capacity)`.\n- Es fehlen die Methoden `fill(double energy)`, `consume(double intensity, double duration)` und `percentFull()`.\n- Damit kann der vorgegebene Client-Code (Unit-Tests) die Klasse nicht wie gefordert verwenden.\n\n### Suggestion\n- Lege zuerst die zwei Attribute an, damit du Kapazität und aktuellen Füllstand überhaupt speichern kannst.\n- Implementiere dann den Konstruktor so, dass er die Kapazität setzt und den Start-Füllstand sinnvoll initialisiert.\n- Baue danach `fill` und `consume`, sodass sie den `level` entsprechend erhöhen/verringern und dabei an den Grenzen (nicht über Kapazität, nicht unter 0) „abklemmen“.\n- Implementiere zuletzt `percentFull()`: Überlege, wie du den Prozentsatz aus `level` und `capacity` berechnest und was passieren soll, wenn die Kapazität 0 ist (das wird typischerweise in Tests abgefragt).\n\n### Code Style\n- Aktuell ist nur ein `// TODO` vorhanden; ersetze das durch die geforderten Member (Attribute/Konstruktor/Methoden), damit die Klasse vollständig ist.\n\n\n# Exercise: pong\n\n### Correctness\n- Es fehlen die geforderten Klassen `Player` und `Ball` (inkl. der geforderten Attribute wie Position, Balkenlänge/Punktestand bzw. Geschwindigkeit).\n- In `PongGame` werden keine zwei `Player`-Objekte und kein `Ball`-Objekt erstellt/initialisiert (Ball in der Mitte, zufällige Geschwindigkeit).\n- In der Spielschleife werden weder Spieler noch Ball tatsächlich bewegt (die Key-States werden zwar gelesen, aber nicht verwendet).\n- Kollisionen mit oberen/unteren Wänden (für Ball und Begrenzung der Player-Balken) sind nicht implementiert.\n- Kollisionen Ball↔Balken sowie Punktevergabe bei Verlassen über die Seitenwände inkl. Neustart/Reset des Balls sind nicht implementiert.\n- Punktestand wird nicht gezeichnet.\n- Erweiterung auf mehrere Bälle (Ball-Array, periodisches Hinzufügen, Entfernen bei Verlassen) ist nicht umgesetzt.\n\n### Suggestion\n- Lege zuerst `Player` und `Ball` als eigene Klassen an und überlege, welche Methoden du brauchst (z.B. `move()`, `draw(gui)`, `up()/down()`, evtl. eine Methode, um eine Treffer-/Kollisionsfläche zu bekommen).\n- Initialisiere in `PongGame` zwei Spieler links/rechts und den Ball in der Mitte; für die “zufällige Geschwindigkeit” hilft ein `Random`, achte dabei darauf, dass `vx` nicht 0 wird und das Vorzeichen zufällig ist.\n- Verwende die abgefragten Tasten (`w/s` und `up/down`) wirklich, um die `py`-Position der Spieler pro Frame zu verändern.\n- Für Wandkollisionen oben/unten: prüfe nach dem Bewegen, ob Ball (inkl. Radius) über die Grenzen hinausgeht; dann Position korrigieren und die `vy`-Richtung umdrehen. Bei den Spielern clampst du `py` in den erlaubten Bereich.\n- Für Ball↔Schläger: baue eine einfache Überschneidungsprüfung (z.B. Rechteck des Schlägers gegen Kreis/Bounding-Box des Balls). Wenn getroffen, kehre die `vx`-Richtung um und schiebe den Ball ggf. aus dem Schläger heraus, damit er nicht “kleben” bleibt.\n- Für Punkte: sobald der Ball links/rechts raus ist, gib dem gegenüberliegenden Spieler einen Punkt und setze den Ball wieder in die Mitte (mit neuer zufälliger Geschwindigkeit).\n- Für mehrere Bälle: verwalte ein Array + Zähler “aktive Bälle” und halte die Invariante, dass die aktiven Bälle immer kompakt in den ersten `n` Feldern liegen; beim Entfernen kannst du den letzten aktiven Ball in die entfernte Position kopieren. Für das periodische Hinzufügen bietet sich ein Frame-Counter oder Timer-Countdown an.\n\n### Code Style\n- Die TODO-Kommentare und das Beispiel-Zeichnen (`fillRect`, `fillCircle`) sind aktuell nur Platzhalter; sobald du deine Objekte hast, wäre es sauberer, das Zeichnen über Methoden wie `player.draw(gui)` / `ball.draw(gui)` zu kapseln, statt harte Zahlen im Game-Loop zu lassen.\n- Die Variablen `p1Up` und `p2Up` werden derzeit nicht verwendet; entweder nutzen (für Bewegung) oder entfernen, sobald du direkt in `if (gui.isKeyPressed(...))` arbeitest.\n\n\n# Exercise: stepstats\n\n### Correctness\n- `minSteps` und `maxSteps` werden vor der Schleife nie sinnvoll initialisiert; dadurch bleibt `minSteps` typischerweise bei `0` (und `maxSteps` ggf. auch), was die Minimum-/Maximum-Berechnung verfälscht, sobald alle Schrittzahlen positiv sind.\n- In der Aufgabenstellung wird die Verwendung über die Attribute `averageSteps`/`successDays`/`minSteps`/`maxSteps` gezeigt, aber für den Durchschnitt wird dort `avgSteps` verwendet; mit deinem Attributnamen passt das nicht zu der geforderten Beispiel-Verwendung.\n\n### Suggestion\n- Überlege dir, welche Startwerte `minSteps` und `maxSteps` haben müssen, damit `Math.min`/`Math.max` beim ersten Element korrekt “greifen” können (Tipp: Extremwerte oder initial mit dem ersten Array-Element).\n- Prüfe die geforderte Attributbezeichnung für den Durchschnitt in der Aufgabenbeschreibung (und ggf. im restlichen Template/Tests): wenn dort `avgSteps` erwartet wird, musst du dein Feld entsprechend benennen oder die Nutzung anpassen.\n\n### Code Style\n- Die auskommentierte alte `computeStatistics`-Methode ist toter Code; besser entfernen, sobald die OO-Version funktioniert.\n- In `StepTracker` wirken die zusätzlichen Leerzeichen vor Punkten in den Ausgaben (`\" .\"`/`\" .\"` etc.) unabsichtlich; das macht die Ausgabe unnötig “schmutzig”.\n- `StepTracker` ist nicht als `public class StepTracker` mit `public static void main(String[] args)` strukturiert (sondern als freies `void main()`); je nach Vorgabe/Projektsetup kann das zu Problemen beim Starten/Kompatibilität führen.\n",
"status" : "SUCCESS"
}
}