AutoFeedback API

Result 3ed3d65b-95ae-4bae-8169-9a5ef44d0193

{
  "llm" : {
    "feedback" : "# Exercise: todo\n\n### Correctness\n- Deine `Task.toString()`-Ausgabe entspricht nicht dem im Beispiel gezeigten Format: Dort wird mit einem Häkchen `✓` für erledigt und mit Einrückung für nicht erledigt gearbeitet (und nicht mit `[X]`/`[ ]`).\n- In `ToDoApp` fehlt ein `public static void main(String[] args)` als Programmeinstieg (im Gerüst ist `void main()` nicht als Java-Startpunkt geeignet, falls nicht anders vorgegeben).\n- Die Fehlermeldung bei `markTaskDone` weicht von der geforderten Ausgabe ab: verlangt ist genau `\"Task with ID XX not found\"`, du gibst `\"Task with ID \" + id + \" not found\"` aus.\n\n### Suggestion\n- Schau dir die Beispiel-Session genau an und passe die String-Darstellung eines Tasks so an, dass sie exakt gleich aussieht (insbesondere: Häkchen/Leerzeichen, Klammern, Position der ID).\n- Prüfe, welche Main-Signatur Java als Einstieg erwartet und wie das im restlichen Übungsgerüst vorgesehen ist (evtl. gibt es schon eine `main` im Projekt, die deine `ToDoApp` starten soll).\n- Übernimm die Fehlermeldung für “Task nicht gefunden” exakt wie in der Aufgabenbeschreibung (inkl. Platzhalter/Format), weil in solchen Aufgaben oft auf exakte Ausgabe getestet wird.\n\n### Code Style\n- `import ch.fhnw.prog1.exercise.todo.Task;` ist im selben Package redundant und kann weg.\n- Kleine Formatierung: In `Task` steht `this. isDone = false;` mit Leerzeichen nach dem Punkt; das wirkt wie ein Tippfehler und sollte konsistent formatiert werden.\n- Deine Felder in `Task` sind privat, aber es gibt keinen Getter für `id`/`description`; aktuell ok, aber falls du später außerhalb der Klasse darauf zugreifen musst, plane saubere Zugriffsmethoden (statt direkte Feldmanipulation).\n\n\n# Exercise: energymeter\n\n### Correctness\n- Die Sichtbarkeit von Konstruktor und Methoden ist bei dir `public`, während in der Aufgabenbeschreibung/Beispiellösung keine `public`-Modifier vorgesehen sind; falls die Unit-Tests package-private Zugriff erwarten, führt das zu einem Mismatch der geforderten Signaturen.\n\n### Suggestion\n- Prüfe, welche Modifier in der Aufgabenstellung wirklich gefordert sind (insbesondere ob Konstruktor/Methoden ohne `public` deklariert werden sollen) und orientiere dich an den Signaturen, die die Tests voraussichtlich aufrufen.\n\n### Code Style\n- Du verwendest bei `IllegalArgumentException` einmal eine Message und sonst nicht; entscheide dich konsistent für eine Variante.\n- In `percentFull()` ist `capacity <= 0` etwas breiter als nötig, weil negative Kapazitäten durch den Konstruktor bereits verhindert werden; `== 0` wäre klarer, wenn du genau diesen Spezialfall meinst.\n\n\n# Exercise: pong\n\n### Correctness\n- Es fehlen die Klassen `Player` und `Ball` komplett (Position/Grösse/Punktestand bzw. Position/Geschwindigkeit), obwohl sie in a) gefordert sind.\n- In `PongGame` werden keine `Player`- und `Ball`-Objekte erstellt, initialisiert und gespeichert (Ball in der Mitte + zufällige Startgeschwindigkeit).\n- In der Spielschleife wird weder anhand der Tastatureingaben bewegt (c), noch bewegt sich der Ball gemäss Geschwindigkeit (c).\n- Kollisionen mit oberen/unteren Wänden (d) sind nicht umgesetzt (Ball abprallen, Balken im Spielfeld halten).\n- Kollisionen Ball↔Balken und Ball↔Seitenwände inkl. Punktevergabe und Ball-Reset (e) fehlen.\n- Anzeige der echten Spielobjekte (b) fehlt; aktuell werden nur feste Beispiel-Primitive gezeichnet, unabhängig vom Spielzustand.\n- Erweiterung auf mehrere Bälle mit Hinzufügen alle 1–2 Sekunden und Entfernen beim Verlassen des Feldes via Array (f) ist nicht umgesetzt.\n\n### Suggestion\n- Fang mit a) an: Definiere erst minimale Daten für `Player` und `Ball` (Pixelpositionen; beim Player zusätzlich Balkenlänge + Punkte, beim Ball zusätzlich vx/vy).\n- Lege in `main` Variablen für zwei Player und (zunächst) einen Ball an; setze den Ball auf `(WIDTH/2, HEIGHT/2)` und wähle vx/vy zufällig mit sinnvoller Mindestgeschwindigkeit, damit er nicht „steht“.\n- Für b): Ersetze die fixen `fillRect`/`fillCircle`-Aufrufe durch Zeichnen basierend auf den gespeicherten Objekt-Positionen (idealerweise über `draw`-Methoden in den Klassen).\n- Für c): Nutze `isKeyPressed` nicht nur für „up“, sondern auch für „down“ je Spieler, und ändere damit `py`; beim Ball pro Frame `px += vx`, `py += vy`.\n- Für d): Prüfe beim Ball, ob er oben/unten die Grenze erreicht (unter Berücksichtigung des Radius), und kehre dann nur `vy` um; bei den Balken nach dem Bewegen `py` auf den gültigen Bereich begrenzen.\n- Für e): Überlege dir eine einfache Kollisionsprüfung Ball↔Balken (z.B. über Rechteck-Überlappung mit Ball-Bounding-Box) und spiegle dann `vx`; bei Treffer an der linken/rechten Wand Punkte erhöhen und den Ball neu in die Mitte setzen (oder neu erzeugen).\n- Für f): Verwende ein Array fester Maximalgrösse plus Zähler „aktive Bälle“; halte eine Invariante wie „aktive Bälle liegen in den ersten n Feldern“ ein, damit Hinzufügen/Entfernen ohne Lücken einfach bleibt. Timer für „neuer Ball“ in Frames mitzählen (50 FPS → 1–2 Sekunden ≈ 50–100 Frames).\n\n### Code Style\n- Der Code besteht praktisch nur aus der Vorlage mit TODO-Kommentaren und Beispiel-Zeichenaufrufen; sobald du implementierst, achte darauf, die Beispiel-Primitive zu entfernen, damit nur noch aus dem Spielzustand gezeichnet wird.\n- Es werden Variablen (`p1Up`, `p2Up`) angelegt, aber nicht verwendet; entweder direkt in Steuerlogik einsetzen oder weglassen.\n- `void main()` ist unüblich in Java (meist `public static void main(String[] args)`); richte dich nach dem erwarteten Setup deiner Vorlage/Umgebung, damit es sicher startbar ist.\n\n\n# Exercise: stepstats\n\n### Correctness\n- `StepTracker` entspricht nicht der vorgegebenen/üblichen Java-Struktur: Es fehlt die `StepTracker`-Klasse und eine `public static void main(String[] args)`-Methode (statt `void main()` auf Top-Level), was je nach Template sonst nicht kompiliert.\n- In `StepTracker` fehlen die nötigen Imports (mindestens `java.util.Scanner`), sodass der Code so nicht kompilieren würde (außer das Template importiert es implizit, was unüblich ist).\n- Falls `steps.length == 0` bleibt `minSteps` auf `Integer.MAX_VALUE` und `maxSteps` auf `Integer.MIN_VALUE`, trotzdem werden diese Werte ausgegeben; das liefert dann offensichtlich falsche Resultate für „least/most steps“.\n\n### Suggestion\n- Orientiere dich beim Client-Code daran, wie in der Vorlage/Beispiellösung eine Java-Anwendung gestartet wird: eine Klasse `StepTracker` mit einer `main`-Signatur, die der Java-Runtime bekannt ist.\n- Prüfe, welche Klassen du tatsächlich verwendest (z. B. `Scanner`) und ob sie im File korrekt importiert sind.\n- Überlege dir, was dein Programm sinnvollerweise ausgeben soll, wenn die Anzahl Tage 0 ist: Entweder Eingabe verhindern oder die Statistikwerte in diesem Fall speziell behandeln, damit keine Sentinel-Werte ausgegeben werden.\n\n### Code Style\n- In `StepStatistics` sind alle Attribute `public`; in OOP-Design wäre es üblicher, Felder zu kapseln (z. B. `private`) und gezielt Zugriff zu erlauben. Wenn die Aufgabe aber explizit direkten Zugriff verlangt, ist das zumindest nachvollziehbar.\n- Einrückungen/Formatierung im `for`-Loop sind teils uneinheitlich (z. B. `successDays++` und die folgenden Zeilen), das erschwert das Lesen.\n- In `StepTracker` wirkt `IO.println/IO.print` wie eine spezielle Hilfsklasse; achte darauf, dass das konsistent zur restlichen Projektvorlage ist (sonst mischst du zwei Ein-/Ausgabe-APIs).\n",
    "status" : "SUCCESS"
  }
}