CS_AI_LEVEL_CREATION_GUIDE - OnlyCook/abitur-elite-code GitHub Wiki
Level Erstellung mit KI
Dieser Guide erklärt dir, wie du künstliche Intelligenz (wie ChatGPT, Claude, Gemini oder DeepSeek) nutzen kannst, um automatisch neue Levels für Abitur Elite Code zu generieren.
Der Guide basiert auf den Strukturen des Landesabiturs Hessen (Praktische Informatik) und den technischen Anforderungen der App.
Inhaltsverzeichnis
- Generische Levels erstellen
- Abitur-konforme Levels erstellen
- Der "Mega-Prompt"
- Wie importiere ich das Level?
- Häufige KI-Fehler
⚠️ Wichtiger Haftungsausschluss
Bitte beachte: Die mit Hilfe von KI generierten Levels werden automatisch erstellt und nicht von einem Lehrer oder Prüfer kontrolliert.
-
Keine Garantie: Es kann nicht garantiert werden, dass die Aufgaben zu 100% korrekt sind oder exakt den Anforderungen des hessischen Abiturs entsprechen.
-
Fehleranfälligkeit: Der generierte Validierungs-Code (der überprüft, ob deine Lösung richtig ist) kann Fehler enthalten. KI tut sich oft schwer, C# Reflection fehlerfrei zu schreiben.
-
Lerneffekt: Diese Levels dienen als Zusatzmaterial. Verlasse dich für deine Abiturvorbereitung primär auf offizielle Aufgaben und den Unterricht.
Teil 1: Generische Levels erstellen (Grundlagen üben)
Wenn du ein bestimmtes Thema (z. B. Arrays, Schleifen oder Listen) üben möchtest, ohne direkt eine komplexe Abituraufgabe zu lösen, ist dies der richtige Weg.
Wie geht das?
-
Kopiere den Mega-Prompt (siehe Teil 3).
-
Füge ihn in die KI deiner Wahl ein (Claude und Gemini sind hierfür empfohlen).
-
Schreibe der KI anschließend einfach, was du üben möchtest.
Beispiel-Eingabe an die KI:
Erstelle mir ein einfaches Level, in dem ich eine while-Schleife nutzen muss, um alle geraden Zahlen bis 20 zu addieren.
Die KI erstellt daraufhin eine .elitelvldraft-Struktur, die du importieren kannst.
Teil 2: Abitur-konforme Levels erstellen
Die App ist spezifisch auf das Landesabitur Hessen (Praktische Informatik) ausgelegt. Um Levels zu erstellen, die sich wie echte Prüfungen anfühlen, musst du der KI Kontext geben.
Formatierungs-Features der App
Die KI wurde im Prompt angewiesen, diese Features zu nutzen:
-
Fetter Text:
**Wichtig** -
Highlight (Blau):
[KlassenName]oder[Methode] -
Code-Block:
{|public void Run()|} -
Hinweise (Nur im Materials-Tab):
start-hint: Titel
Inhalt...
:end-hint
Besonderheiten im Abitur (Hessen)
Der Prompt instruiert die KI, folgende Regeln zu beachten (basierend auf Level.cs):
-
Sprach-Mix: Diagramme nutzen Java-Syntax (z.B.
String,boolean,list.add), der Code ist aber C#. -
Klassendesign:
- Getter/Setter heißen
GetVariable(), keine C# Properties ({ get; set; }). - Listen werden im Konstruktor initialisiert.
- IDs werden oft über
static int autowerthochgezählt.
- Getter/Setter heißen
-
Diagramme:
- Assoziationen zeigen Attribute nur auf der Seite der referenzierten Klasse.
- Listen werden mit
*markiert. - Keine Referenz wird mit
Xmarkiert.
Vorgehensweise mit alten Prüfungen
Du kannst den Text einer alten Abiturprüfung (2023, 2024, 2025) kopieren.
-
Kopiere den Mega-Prompt (siehe unten).
-
Füge ihn in die KI ein (Claude und Gemini sind hierfür empfohlen).
-
Kopiere den Aufgabentext und sage: "Erstelle ein Level basierend auf dieser Aufgabe: [Text einfügen]".
Teil 3: Der "Mega-Prompt"
Kopiere den gesamten folgenden Block in die KI. Er enthält alle Regeln aus dem Quellcode der App.
You are an expert Level Designer for the educational app "Abitur Elite Code".
Target Audience: Students preparing for the "Praktische Informatik" Abitur in Hesse, Germany.
Language: German (unless specified otherwise).
### CORE RULES (Based on Level.cs & LevelTester.cs)
1. **Language Mix:**
- UML Diagrams MUST use **Java** syntax (e.g., `String`, `boolean`, `ArrayList`, `list.add()`).
- Implementation MUST be **C#** (e.g., `string`, `bool`, `List<T>`, `list.Add()`).
- You MUST explain syntax differences in the "Materials" tab using hints.
2. **Progression & Difficulty:**
- If the user asks for multiple levels, scale difficulty: Level 1 is intro/guided, Last Level is a "Mini-Exam".
- **Handholding:**
- Low Levels: Give detailed error messages in `ValidationCode` and many hints.
- Mini-Exams: Give vague error messages (check comprehension) and fewer hints.
3. **Class Design (Abitur Style):**
- Do NOT use C# Properties (`{ get; set; }`). Use explicit methods: `GetVariable()` and `SetVariable()`.
- Constructors must initialize lists/arrays.
- Use `private static int autowert = 0;` logic for ID generation where appropriate.
4. **PlantUML Rules:**
- If a newline character is needed in PlantUML text, use EXACTLY: `\n/` (not just `\n`).
- **Associations:** Attributes for associations go on the side of the *referenced* class.
- **Multiplicities:** Use `*` for lists, `1` for single. Use `X` on the arrow if there is NO reference.
- Do NOT mark `void` return types in methods (Abitur style).
5. **App Formatting Syntax:**
- **Bold:** `**text**`
- **Highlight (Blue):** `[text]` (Use for class names/methods in descriptions)
- **Code Blocks:** `{| code |}` (Use for code snippets)
- **Hints (Materials ONLY):**
start-hint: Title
Content
:end-hint
### OUTPUT FORMAT
Output ONLY valid JSON representing a `.elitelvldraft` file.
Calculate a valid filename based on the "Name" field (e.g., "Mein Level.elitelvldraft").
**JSON Template:**
{
"Name": "Der einfache Rechner",
"Author": "AI Designer",
"Description": "Task description using [Highlights] and **Bold**.\n\nImplement [MethodName].",
"Materials": "start-hint: Java vs C#\nJava: [String] -> C#: [string]\n:end-hint",
"Prerequisites": [ "Integers", "Methods" ],
"StarterCode": "public class Rechner\n{\n // TODO\n}",
"ValidationCode": "private static bool ValidateLevel(Assembly assembly, out string feedback)\n{\n // Use Reflection: assembly.GetType(), Activator.CreateInstance(), MethodInfo.Invoke()\n // Return true if correct, throw Exception if false.\n}",
"TestCode": "public class Rechner { ... full solution ... }",
"PlantUmlSources": [
"@startuml\r\nclass Rechner {\r\n \u002B addiere(a : int, b : int) : int\r\n}\r\n@enduml"
],
"PlantUmlSvgContents": [],
"MaterialDiagrams": [
{
"Name": "Hilfsdiagramm",
"PlantUmlSource": "@startuml\nclass Helper {}\n@enduml",
"PlantUmlSvgContent": ""
}
],
"QuickGenerate": true
}
### INSTRUCTIONS FOR VALIDATION CODE (Roslyn)
- The signature `private static bool ValidateLevel(Assembly assembly, out string feedback)` is MANDATORY.
- You cannot access user classes directly. You MUST use Reflection.
- Example: `Type t = assembly.GetType("Rechner"); object inst = Activator.CreateInstance(t);`
Acknowledge this prompt by saying: "Abitur Elite Code Designer ready. Please tell me what topic or Abitur task to convert."
Wie importiere ich das Level?
Schnellmethode
-
Kopiere den JSON-Code, den die KI generiert hat, in deine Zwischenablage.
-
Klicke in der App oben links im C# Modus auf
LEVEL WÄHLEN, dann auf das Plus-Symbol (+). -
Klicke unten links auf "KI Import Modus".
-
Nutze das Import-Icon (blaues Clipboard-Symbol), um den Code einzufügen.
- Hinweis: Falls links daneben eine Fehlermeldung erscheint, kannst du diese über das Kopier-Icon direkt an die KI zurückgeben, damit sie den Code korrigiert.
-
Klicke auf "Erstellen". Die App erstellt nun automatisch eine
.elitelvldraftDatei imlevelsOrdner. -
Dein Level-Entwurf erscheint nun grün in der Liste. Klicke auf das Zauberstab-Symbol des Entwurfs.
-
Erfolg: Das Level wurde validiert und als fertige
.elitelvlDatei exportiert. Du kannst es sofort starten! -
Bei Fehler: Erscheint ein
!, gab es Probleme beim Export. Nutze die Alternative Methode oder kopiere die Fehlermeldung aus der Konsole für die KI.
Alternative Methode (Manueller Export)
Falls der Zauberstab-Export fehlschlägt oder du den Code im Designer anpassen möchtest:
-
Folge den Schritten 1-5 der Schnellmethode.
-
Klicke auf das Stift-Symbol (
✎) beim Entwurf, um den Designer zu öffnen. -
Scrolle nach unten zur TextBox "Musterlösung / Test-Code" und drücke rechts auf das Pfeil-Symbol, um den Test-Code in den Editor zu laden.
-
Klicke oben rechts auf den grünen Button
▸ AUSFÜHREN. -
Die Konsole sollte anzeigen:
✓ DESIGNER TEST BESTANDEN- Falls ein
KOMPILIERFEHLERerscheint, kopiere diesen für die KI zur Fehlerbehebung.
- Falls ein
-
Sobald der Test bestanden ist, wird der Button "Exportieren" (oben links) aktiv. Klicke darauf.
-
Fertig! Dein Level ist nun als
.elitelvlDatei einsatzbereit.
Häufige KI-Fehler
KIs machen beim Generieren und vorallem beim Erstellen der JSON oder beim Schreiben des Validierungs-Codes oft dieselben Fehler. Hier sind die häufigsten:
1. JSON-Format
Der häufigste Fehler ist das Nichteinhalten des JSON-Formats der .elitelvldraft-Dateien.
Falls im "Eigene Levels"-Menu das von der KI erzeugte Level keinen Autor hat (Unbekannt), ist das JSON-Parsing fehlgeschlagen.
Frage die KI einfach die Datei neu zu erzeugen und diesmal das JSON-Format explizit einzuhalten, da dies davor nicht getan wurde.
2. Fließkommazahlen im String-Vergleich
❌ Falsch:
if (!ergebnis.Contains("599.99"))
{
feedback = "Preis ist falsch!";
return false;
}
Problem: In Deutschland (und anderen Sprachen) werden Fließkommazahlen mit Komma statt Punkt dargestellt: 599,99 statt 599.99. Der String-Vergleich schlägt fehl!
✅ Richtig:
// Option 1: Zahlen numerisch vergleichen
double preis = (double)preisProperty.GetValue(inst);
if (Math.Abs(preis - 599.99) > 0.01)
{
feedback = "Preis ist falsch!";
return false;
}
// Option 2: Kultur-unabhängiger String-Vergleich
string ergebnis = result.ToString();
if (!ergebnis.Contains("599") || !(ergebnis.Contains(",99") || ergebnis.Contains(".99")))
{
feedback = "Preis ist falsch!";
return false;
}
3. Reflection-Fehler bei null-Checks
❌ Falsch:
MethodInfo methode = typ.GetMethod("Berechne");
object result = methode.Invoke(inst, new object[] { 5 });
Problem: Wenn die Methode nicht existiert, ist methode null und Invoke wirft eine NullReferenceException.
✅ Richtig:
MethodInfo methode = typ.GetMethod("Berechne");
if (methode == null)
{
feedback = "Methode [Berechne] nicht gefunden!";
return false;
}
object result = methode.Invoke(inst, new object[] { 5 });
4. Fehlende Typprüfungen
❌ Falsch:
object result = methode.Invoke(inst, new object[] { 5 });
int ergebnis = (int)result; // Crash wenn result ein double ist!
✅ Richtig:
object result = methode.Invoke(inst, new object[] { 5 });
if (result == null || !(result is int))
{
feedback = $"Methode [Berechne] sollte int zurückgeben, nicht {result?.GetType().Name ?? "null"}!";
return false;
}
int ergebnis = (int)result;
Tipp: Wenn du Fehler im ValidationCode findest, kopiere die Fehlermeldung aus der Konsole und sage der KI:
Der ValidationCode hat folgenden Fehler: [Fehlermeldung]. Bitte korrigiere ihn.