{
"llm" : {
"feedback" : "# Exercise: todo\n\n### Correctness\n- Die `Task`-Klasse ist nicht implementiert (inkl. Felder wie `id`, `description`, `done` und `toString()`), obwohl die Aufgabe explizit verlangt, Tasks als Objekte zu modellieren und `IO.println(task)` zu ermöglichen.\n- Es gibt kein `Task[]`-Array in `ToDoApp`, obwohl gefordert ist, ein Array für `Task`-Objekte zu erstellen.\n- Die drei geforderten Methoden `listTasks`, `addTask` und `markTaskDone` sind noch nicht implementiert (stehen weiterhin auf `// TODO`), dadurch kann die App die verlangten Funktionen nicht ausführen.\n- In `markTaskDone(int id)` fehlt die geforderte Ausgabe `\"Task with ID XX not found\"`, falls keine Task unter dieser ID existiert.\n\n### Suggestion\n- Implementiere zuerst eine `Task`-Klasse so, dass `IO.println(task)` genau die gewünschte Darstellung ausgibt (das passiert über `toString()`); überlege dir dafür auch, wie du den Haken für erledigte Tasks in der Ausgabe abbildest.\n- Lege in `ToDoApp` ein Array `Task[]` mit fixer Größe an und überlege dir zusätzlich, wie du dir merkst, wie viele Plätze bereits belegt sind (oder wie du den “ersten freien Platz” findest).\n- `addTask(description)`: Suche den ersten freien Index im Array (oder nutze einen Zähler, falls du immer nur hinten anhängst) und verwende genau diesen Index auch als ID beim Erzeugen des neuen `Task`-Objekts.\n- `listTasks(all)`: Iteriere über die vorhandenen Tasks und gib nur diejenigen aus, die passen (alle vs. nur nicht erledigte). Denke daran, dass du `(No tasks)` ausgeben musst, wenn in dieser Ansicht nichts gedruckt wurde.\n- `markTaskDone(id)`: Prüfe, ob die ID überhaupt auf einen gespeicherten Task zeigt (Index im gültigen Bereich und Slot nicht leer). Nur dann auf “done” setzen, sonst die Fehlermeldung ausgeben.\n\n### Code Style\n- In der Abgabe sind noch viele `// TODO`-Platzhalter; achte darauf, vor dem Einreichen alle Aufgabenstellen vollständig zu ersetzen.\n- Stelle sicher, dass `main` in der üblichen Java-Form vorhanden ist (`public static void main(String[] args)`), falls euer Grundgerüst das verlangt; `void main()` ist je nach Setup sonst kein gültiger Einstiegspunkt.\n\n\n# Exercise: energymeter\n\n1. Correctness \n- Der Konstruktor und die Methoden sind bei dir `public`, in der Aufgabenbeschreibung sind sie ohne Modifier aufgeführt; falls die Unit-Tests package-private Sichtbarkeit erwarten, kann das zu Testfehlschlägen führen.\n\n2. Suggestion \n- Schau dir genau an, wie die Tests die Klasse instanziieren und die Methoden aufrufen: Wenn sie im gleichen Package sind und ohne `public`-Zugriff arbeiten, sollten deine Signaturen (inkl. Sichtbarkeit) exakt dazu passen.\n\n3. Code Style \n- Du hast bei `IllegalArgumentException` einmal eine Message und sonst nicht; entscheide dich konsistent für eine Variante.\n\n\n# Exercise: pong\n\n### Correctness\n- Du hast die geforderten Klassen `Player` und `Ball` nicht erstellt (Teil a), daher fehlen auch Position, Balkenlänge, Punktestand sowie Geschwindigkeit des Balls.\n- In `PongGame` werden keine zwei `Player`-Objekte und kein `Ball`-Objekt erzeugt und sinnvoll initialisiert (Teil a); der Ball startet dadurch nicht in der Mitte und hat keine zufällige Anfangsgeschwindigkeit.\n- Es werden weiterhin nur die Beispiel-Formen (`fillRect`, `fillCircle`) mit festen Koordinaten gezeichnet statt die tatsächlichen Spielobjekte zu rendern (Teil b).\n- Die Bewegungslogik fehlt: Tastatureingaben werden zwar abgefragt, aber nicht verwendet, um die Spieler zu bewegen, und der Ball wird nicht anhand seiner Geschwindigkeit aktualisiert (Teil c).\n- Kollisionen mit oberen/unteren Wänden (Ball abprallen, Spieler im Feld halten) sind nicht implementiert (Teil d).\n- Kollisionen Ball–Balken, Punktvergabe bei Seitenwandkontakt und Neustart/Reset des Balls fehlen (Teil e).\n- Die Erweiterung auf mehrere Bälle inkl. periodischem Hinzufügen und Entfernen sowie Verwaltung in einem Array fehlt (Teil f).\n\n### Suggestion\n- Fang mit Teil a) an: Überlege dir, welche Felder `Player` und `Ball` mindestens brauchen und welche Methoden sinnvoll sind (z.B. „move“, „draw“, „up/down“, „addPoint“), damit `PongGame` nur noch diese Methoden aufruft.\n- Für die zufällige Ballgeschwindigkeit: Wähle sinnvolle Betragsbereiche für `vx`/`vy` und randomisiere zusätzlich das Vorzeichen, damit der Ball in unterschiedliche Richtungen starten kann.\n- Für Teil b): Ersetze die fixen `fillRect`/`fillCircle`-Koordinaten durch Zeichnen basierend auf den gespeicherten Objekt-Positionen (am einfachsten über eine `draw(gui)`-Methode pro Objekt).\n- Für Teil c): Nutze die abgefragten Keys, um `py` der Spieler zu verändern, und addiere pro Frame `vx`/`vy` auf `px`/`py` des Balls.\n- Für Teil d): Beim Ball reicht bei Kollision mit oben/unten das Invertieren von `vy` und ggf. ein „Zurücksetzen“ auf die Grenze, damit er nicht in der Wand „stecken bleibt“. Bei den Spielern clampst du `py` in den erlaubten Bereich.\n- Für Teil e): Arbeite mit einfachen Rechteck-Kollisionschecks (Bounding Boxes) zwischen Ball und Balken. Bei Treffer spiegelt sich die x-Richtung (typisch: `vx` umdrehen) und du solltest den Ball aus der Überschneidung heraussetzen, sonst gibt’s Mehrfach-Kollisionen in aufeinanderfolgenden Frames.\n- Für Teil f): Lege ein Array mit Maximalgröße an und halte eine Invariante wie „alle aktiven Bälle sind in den ersten n Feldern“. Beim Entfernen kannst du dann effizient ein Element durch das letzte aktive ersetzen statt alles zu verschieben. Einen Timer/Zähler pro Frame kannst du verwenden, um alle ~50–100 Frames einen neuen Ball zu spawnen.\n\n### Code Style\n- Dein `main` hat nicht die übliche Java-Signatur (`public static void main(String[] args)`); falls das Projekt/Template echte Java-Klassen erwartet, wird das so nicht starten.\n- Die Variablen `p1Up`/`p2Up` werden zwar gesetzt, aber nicht weiter verwendet; entweder direkt in Bewegungslogik einbauen oder weglassen, sobald du die Steuerung implementierst.\n- Viele TODO-Kommentare und Beispielaufrufe sind noch unverändert; sobald du deine Objektstruktur hast, lohnt es sich, diese Beispiele zu entfernen/zu ersetzen, damit klar ist, was „echter“ Spielcode ist.\n\n\n# Exercise: stepstats\n\n### Correctness\n- In der Aufgabenstellung sollen die Resultate über die Attribute `averageSteps`, `minSteps`, `maxSteps` und `successDays` zugreifbar sein; du hast das Attribut für den Durchschnitt `avgSteps` genannt statt `averageSteps`, wodurch der geforderte Zugriff `stats.averageSteps` nicht funktioniert.\n- In der Aufgabenstellung ist der Zugriff als `double avgSteps = stats.averageSteps;` gezeigt; bei dir heißt das Feld anders, und damit passt die Verwendung nicht zur Spezifikation.\n\n### Suggestion\n- Richte die Attributnamen exakt nach der geforderten Verwendung aus (insbesondere der Durchschnitt): Schau dir die vier Zeilen im Aufgabentext an und übernimm die Feldnamen 1:1, damit der Client-Code wie gefordert schreiben kann.\n\n### Code Style\n- In `StepTracker` fehlen im gezeigten Versuch wichtige Dinge, die in einer normalen Java-Datei erwartet werden (z. B. `package`-Deklaration, `public class StepTracker { ... }`, korrekte `public static void main(String[] args)`-Signatur und Imports für `Scanner`/`IO`), sonst kompiliert das je nach Vorlage nicht sauber.\n- Deine Felder in `StepStatistics` sind `public`; falls ihr im Kurs Kapselung übt, wäre es typischer, Felder nicht direkt öffentlich zu machen (auch wenn die Aufgabe hier “über die Attribute zugreifen” sagt).\n",
"status" : "SUCCESS"
}
}