{
"llm" : {
"feedback" : "# Exercise: todo\n\n### Correctness\n- Du hast die `Task`-Klasse noch nicht implementiert (inkl. Felder wie `id`, `description`, `done` und `toString()`), obwohl sie für die Ausgabe/Modellierung der To-dos gefordert ist.\n- In `ToDoApp` fehlt das Array für `Task`-Objekte, in dem die Tasks gespeichert werden sollen.\n- Die drei vorgegebenen Methoden `listTasks(boolean all)`, `addTask(String description)` und `markTaskDone(int id)` sind noch nicht implementiert.\n- Ohne die obigen Implementationen kann die App keine Tasks hinzufügen, auflisten oder als erledigt markieren und erfüllt damit die geforderte Funktionalität nicht (inkl. „(No tasks)“-Ausgabe und „Task with ID XX not found“).\n\n### Suggestion\n- Schau dir an, welche Informationen ein Task laut Aufgabenbeschreibung braucht, und überlege dann, welche Attribute die `Task`-Klasse minimal enthalten muss und wie `toString()` die Darstellung für `IO.println(task)` liefern soll.\n- Lege im `ToDoApp`-Objekt ein `Task[]` an (mit fixer Größe) und überlege dir zusätzlich, wie du festhältst, wie viele Plätze bereits belegt sind bzw. wo der „erste freie Platz“ ist.\n- Für `addTask`: Arbeite Schritt für Schritt nach Kommentar: freien Index finden → neue `Task` mit genau dieser ID erzeugen → im Array speichern.\n- Für `listTasks`: Iteriere über die gespeicherten Tasks und entscheide je nach `all`-Parameter, ob du einen Task ausgibst; behalte dabei im Blick, wann gar nichts ausgegeben wurde, um dann „(No tasks)“ zu drucken.\n- Für `markTaskDone`: Nutze die ID als Array-Index, aber prüfe vorher, ob an dieser Stelle überhaupt ein Task existiert bzw. ob die ID im gültigen Bereich liegt; nur dann den `done`-Status ändern, sonst die geforderte Fehlermeldung ausgeben.\n\n### Code Style\n- In deinem Abgabeausschnitt stehen noch überall `// TODO`-Platzhalter; sobald du implementierst, achte darauf, dass du nicht doppelt Logik in `main()` und den Methoden verteilst (die Methoden sollen die Arbeit kapseln).\n- Einheitlichkeit: Du verwendest `IO.println/IO.print`; bleib dann auch in deinen Implementationen konsequent bei `IO` (statt gemischt `System.out`).\n\n\n# Exercise: energymeter\n\n### Correctness\n- Die Klasse enthält noch keine Attribute `capacity` und `level`, die laut Aufgabe vorhanden sein müssen.\n- Es fehlt der Konstruktor `EnergyMeter(double capacity)`.\n- Es fehlen die Methoden `fill(double energy)`, `consume(double capacity, double duration)` und `percentFull()` mit den geforderten Rückgabetypen.\n\n### Suggestion\n- Lege zuerst die beiden Attribute an und überlege dir, welche Werte sie direkt nach dem Erzeugen eines `EnergyMeter`-Objekts haben sollen.\n- Implementiere dann den Konstruktor so, dass er die Kapazität übernimmt und einen passenden Startwert für den Füllstand setzt.\n- Ergänze `fill` und `consume` als Zustandsänderungen am Objekt: beide sollen den `level` verändern und dabei sinnvolle Grenzen einhalten (nicht über Kapazität, nicht unter 0).\n- Für `percentFull()` überlege, wie du den aktuellen Füllstand als Prozentwert der Kapazität berechnest und was passieren soll, wenn die Kapazität 0 ist (Unit-Tests erwarten hier typischerweise ein definiertes Verhalten).\n\n### Code Style\n- Aktuell besteht die Datei nur aus einem `// TODO`; entferne das, sobald du die Elemente implementiert hast, damit die Klasse nicht “leer” wirkt.\n\n\n# Exercise: pong\n\n### Correctness\n- Es fehlen die Klassen `Player` und `Ball`, obwohl sie in a) explizit erstellt werden sollen.\n- In `PongGame` werden keine `Player`- und `Ball`-Objekte erzeugt, gespeichert und sinnvoll initialisiert (Ball in der Mitte, zufällige Geschwindigkeit).\n- In b) werden nicht die tatsächlich verwalteten Spielobjekte gezeichnet, sondern nur die vorgegebenen Beispiel-Formen mit festen Koordinaten.\n- In c) werden Tastatureingaben zwar abgefragt, aber daraus folgt keine Bewegung der Balken; der Ball wird ebenfalls nicht bewegt.\n- In d) sind keine Kollisionen mit oberer/unterer Wand umgesetzt (weder für Ball-Abprallen noch für Begrenzung der Player-Balken).\n- In e) fehlen Kollisionen Ball–Balken, Erkennung von Ball-Verlassen links/rechts, Punktevergabe und Ball-Reset in die Mitte.\n- In f) fehlt die Erweiterung auf mehrere Bälle (Array/Verwaltung, periodisches Hinzufügen, Entfernen beim Verlassen des Feldes).\n\n### Suggestion\n- Starte mit a): Lege zwei kleine Klassen an, die genau die geforderten Zustände als Felder halten (Position/Größe/Punkte bzw. Position/Geschwindigkeit). Überlege dir, welche Werte beim Erzeugen gesetzt werden müssen, damit du in der Spielschleife nur noch “update” und “draw” brauchst.\n- Ersetze in b) die festen `fillRect`/`fillCircle`-Aufrufe durch Zeichnen basierend auf den aktuellen Feldern deiner Objekte (damit du direkt siehst, ob Initialwerte stimmen).\n- Für c): Nutze die Key-Flags (`w/s`, `up/down`) um die y-Position der Player pro Frame um einen festen Schritt zu verändern; den Ball pro Frame um `(vx, vy)` verschieben.\n- Für d): Prüfe nach dem Bewegen, ob Ball oben/unten “über den Rand” geraten ist; dann nur die y-Geschwindigkeit umdrehen und die Position wieder in den erlaubten Bereich schieben. Bei den Balken: y nach oben/unten begrenzen, damit sie im Feld bleiben.\n- Für e): Verwende eine einfache Überlappungsprüfung (z.B. Rechteck-Rechteck über Bounding-Boxen) zwischen Ball und Balken und drehe dann die x-Geschwindigkeit passend um. Bei linker/rechter Seitenwand: Punktestand des anderen Players erhöhen und den Ball wieder mittig neu starten (mit neuer zufälliger Geschwindigkeit).\n- Für f): Denke an eine Invariante wie “die ersten `n` Array-Einträge sind aktive Bälle, der Rest ist `null`”. Dann kannst du beim Entfernen einen Ball durch den letzten aktiven ersetzen, statt alles zu verschieben. Für das periodische Hinzufügen: zähle Frames oder Zeit mit einem Counter herunter (bei 50 FPS sind 1–2 Sekunden ca. 50–100 Frames).\n\n### Code Style\n- Viele `TODO`-Kommentare und der Beispielcode sind noch 1:1 drin; sobald du eigene Logik hast, entferne/ersetze die Beispiele, damit klar ist, was wirklich zum Spiel gehört.\n- Die abgefragten Variablen `p1Up` und `p2Up` werden aktuell nicht benutzt; entweder direkt in `if`-Bedingungen einsetzen oder löschen, wenn du anders vorgehst.\n- Die Methode ist als `void main()` geschrieben; in Java ist normalerweise `public static void main(String[] args)` erforderlich (prüfe, was in eurer Vorlage erwartet ist), sonst startet das Programm u.U. nicht über den Standard-Java-Launcher.\n\n\n# Exercise: stepstats\n\n1. Correctness \n- In der Aufgabenbeschreibung soll das Attribut `averageSteps` heissen, in deinem `StepStatistics` ist es als `avgSteps` benannt; Client-Code, der genau wie im Aufgabenstatement gezeigt zugreifen will, würde so nicht funktionieren.\n\n2. Suggestion \n- Richte die Attributnamen exakt nach der geforderten Verwendung aus (insbesondere `averageSteps` statt `avgSteps`), damit der Zugriff wie im vorgegebenen Beispiel möglich ist.\n\n3. Code Style \n- Die auskommentierte alte `computeStatistics`-Methode ist toter Code und sollte entfernt werden, sobald du auf die OO-Version umgestellt hast. \n- Die Attribute sind alle `public`; üblich wäre es, diese zu kapseln (z.B. `private`) und über Getter freizugeben, falls ihr das in der Vorlesung bereits so handhabt.\n",
"status" : "SUCCESS"
}
}