{
"llm" : {
"feedback" : "# Exercise: todo\n\nLlm Evaluation ist für diese Aufgabe deaktiviert. Entferne die .llmignore Datei vom Package der Aufgabe.\n\n\n# Exercise: energymeter\n\n### Correctness\n- Der Konstruktor setzt `level` nicht explizit auf `0`. Auch wenn es bei `double` als Default so ist, verlangen die Tests/Anforderung typischerweise, dass der Startzustand (Füllstand) sauber initialisiert wird.\n- In `consume(double capacity, double duration)` heisst der erste Parameter bei dir `capacity`, laut Aufgabe aber „Kapazität (`double`), Dauer (`double`)“. Semantisch wird damit aber „Intensität“ gemeint (wie im Beispiel). Mit der aktuellen Benennung ist das leicht missverständlich und kann zu falscher Verwendung führen.\n\n### Suggestion\n- Initialisiere den Füllstand im Konstruktor bewusst auf den gewünschten Startwert (und überlege auch, ob du sonst noch etwas beim Erzeugen des Objekts festlegen willst).\n- Überlege dir bei `consume`, welche Bedeutung der erste Parameter für den Verbrauch haben soll (z.B. „Intensität“) und benenne ihn so, dass klar ist, dass es **nicht** die Meter-Kapazität (`this.capacity`) ist.\n\n### Code Style\n- `capacity` und `level` sind `public`. Üblicherweise kapselt man den Zustand (z.B. `private`) und lässt Zugriffe über Methoden laufen, damit niemand von aussen ungültige Zustände setzen kann.\n- In `fill` ist der Parametername `level` verwirrend, weil es bereits ein Feld `level` gibt; ein Name wie `energy` wäre eindeutiger.\n- Du verwendest teils `IllegalArgumentException` und teils `java.lang.IllegalArgumentException`; einheitlich bleiben (das fully-qualified ist hier nicht nötig).\n- In `consume` berechnest du `consumption`, verwendest später aber nochmal `capacity * duration` statt die Variable zu nutzen; das macht den Code unnötig redundant.\n\n\n# Exercise: pong\n\n### Correctness\n- Du hast die geforderten Klassen `Player` und `Ball` nicht erstellt (Teil a).\n- In `PongGame` werden keine zwei `Player`-Objekte und kein `Ball`-Objekt erzeugt/initialisiert und gespeichert (Teil a).\n- Der Ball startet nicht in der Mitte und hat keine zufällige Anfangsgeschwindigkeit (Teil a).\n- In der Spielschleife werden Ball und Balken nicht aus deinen Objekten gezeichnet, sondern es werden nur fixe Beispiel-Formen gezeichnet (Teil b).\n- Es fehlt die Bewegung der Balken basierend auf Tastatureingaben sowie die Bewegung des Balls basierend auf `(vx, vy)` (Teil c).\n- Kollisionen mit oberer/unterer Wand (Ball abprallen, Spieler im Feld bleiben) sind nicht implementiert (Teil d).\n- Kollisionen Ball↔Balken, Punktevergabe bei seitlichem Verlassen, Reset des Balls und Anzeige des Punktestands fehlen (Teil e).\n- Mehrere Bälle (Array mit Maximalanzahl), periodisches Hinzufügen, Entfernen beim Verlassen und effiziente Verwaltung fehlen (Teil f).\n\n### Suggestion\n- Starte mit minimalen Datenstrukturen: Gib `Player` Felder für Position, Balkenlänge und Punkte; `Ball` Felder für Position und Geschwindigkeit. Überlege dir, welche Werte du im Konstruktor setzt und welche sich pro Frame ändern.\n- Ersetze die beiden Beispiel-Zeichenaufrufe durch Methoden wie `player.draw(gui)` / `ball.draw(gui)` (oder zeichne aus den Objekt-Feldern), damit du wirklich deine Spielobjekte siehst.\n- Für die Bewegung in (c): Nutze die booleans von `isKeyPressed(...)` wirklich, indem du bei gedrückten Tasten `py` des jeweiligen Players änderst; den Ball pro Frame um `vx/vy` weiterzählen.\n- Für (d): Prüfe beim Ball nach dem Bewegen, ob er oben/unten “über die Grenze” geht, und kehre dann nur `vy` um (y-Geschwindigkeit invertieren). Bei den Players clampst du `py` so, dass der Balken nie aus dem Fenster ragt.\n- Für (e): Arbeite mit einer einfachen Kollisionsprüfung zwischen Ball und Paddle (z.B. Rechteck-überlappt-Rechteck über eine Bounding Box). Bei Kollision soll die x-Richtung des Balls umkehren (und ggf. die Position leicht korrigieren, damit er nicht “stecken bleibt”). Bei links/rechts raus: Punkt beim Gegner erhöhen und Ball neu in die Mitte setzen (inkl. neuer Zufallsgeschwindigkeit).\n- Für (f): Lege ein `Ball[]` und einen Zähler für “aktive Bälle” an. Eine hilfreiche Invariante ist: alle aktiven Bälle liegen kompakt in `balls[0..active-1]`. Beim Entfernen kannst du den letzten aktiven Ball in die Lücke kopieren und `active--`. Für “alle 1–2 Sekunden” kannst du mit einem Frame-Counter oder einer Restzeit in Frames arbeiten (bei 50 FPS sind 50–100 Frames etwa 1–2s).\n\n### Code Style\n- Im aktuellen Stand sind `p1Up` und `p2Up` unbenutzt; entweder verwenden oder entfernen, sobald du die Bewegung implementierst.\n- Viele `TODO`/Kommentar-Blöcke sind noch aus der Vorlage; sobald du umsetzt, lohnt es sich, die Kommentare zu aktualisieren oder zu kürzen, damit der Code lesbarer bleibt.\n\n\n# Exercise: stepstats\n\n### Correctness\n- Die Klasse soll gemäss Aufgabenstellung so verwendbar sein, dass man nach dem Konstruktor direkt über Attribute wie `stats.successDays`, `stats.averageSteps`, `stats.minSteps`, `stats.maxSteps` zugreifen kann. In deinem Code sind diese Felder `private` und damit von aussen nicht zugreifbar.\n- `successDays` ist bei dir als `double` deklariert, obwohl es eine Anzahl Tage ist (also ganzzahlig). Das weicht von der geforderten Verwendung als `int successDays` ab.\n- In der Aufgabenbeschreibung heissen die Felder `averageSteps`, `minSteps`, `maxSteps`; dein Client-Code nutzt stattdessen `printStatistics()`. Damit erfüllst du die geforderte Verwendung (Zugriff über Attribute) nicht.\n\n### Suggestion\n- Überlege, welche Sichtbarkeit die Ergebnis-Felder haben müssen, damit `StepTracker` sie direkt lesen kann (ohne extra Methode), wie im vorgegebenen Verwendungsbeispiel gezeigt.\n- Prüfe die Datentypen der Ergebniswerte: Welche davon sind Zähler (ganze Zahlen) und welche müssen Kommazahlen sein?\n- Passe `StepTracker` so an, dass er die Werte ausgibt, indem er sie direkt aus dem `StepStatistics`-Objekt liest, statt eine eigene Ausgabemethode in `StepStatistics` aufzurufen.\n\n### Code Style\n- `printWelcomeMessage()` und `printStatistics()` gehören eher in den Client (`StepTracker`) als in die Statistik-Klasse; `StepStatistics` sollte sich auf Berechnung/Datenspeicherung konzentrieren (Single Responsibility).\n- Du speicherst `steps` und `goal` als Felder, obwohl sie nach der Berechnung nicht mehr zwingend gebraucht werden; das erhöht unnötig den Zustand der Klasse.\n- `totalSteps` ist ein Feld, wird aber nur innerhalb der Berechnung benötigt; als lokale Variable wäre es klarer und vermeidet Seiteneffekte, falls `calculateSteps()` jemals erneut aufgerufen wird.\n- `successDays` als `double` wirkt auch stilistisch irritierend, weil es semantisch ein Zähler ist.\n",
"status" : "SUCCESS"
}
}