Syntax Saga: neues Spiel (server-autoritativ) + 34 Seed-Missionen
Drittes Mindflux-Spiel: interaktive IT-Geschichten, in denen man den fehlenden Code (Schlüsselwörter, Operatoren, ganze Zeilen) in eine kleine Story tippt. Freitext-Eingabe, drei wählbare Stufen (Junior/Professional/ Senior), mehrere Lücken je Codeblock und mehrere gültige Antworten je Lücke (optional case-insensitive). Prüfung und Score ausschließlich serverseitig – die Lösungen verlassen nie das Backend (Anti-Cheat wie TechTacular/MindMatch). Fehler-Mechanik: bis zu 3 Versuche mit Hinweis, dann Auflösung; kein Game-Over. Inhalte DB-gestützt und im Admin pflegbar (/admin/syntaxsaga); 34 Seed- Missionen (Java/SQL/Bash/Git/HTML/Python) aus syntaxsaga/content.json. - Entities SyntaxSagaMission/Gap/Solution + Flyway V7__syntax_saga.sql - SyntaxSagaService (Story ohne Lösung / serverseitige Prüfung / Score-Recompute) - API /api/syntaxsaga (CSRF-ausgenommen) + Admin-CRUD - Frontend syntaxsaga.html/js/css (Prefix ss-, theme.css-Tokens) - Dashboard-Kachel aktiv (vorher "coming soon") Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,424 @@
|
||||
{
|
||||
"missions": [
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Hello World",
|
||||
"language": "java",
|
||||
"narrative": "Dein erster Tag als Praktikant. Der Serverraum ist still, das Terminal reagiert nicht – es fehlt der Einstiegspunkt des Programms.",
|
||||
"dialog": null,
|
||||
"code": "public class Main {\n public static void {{1}}(String[] args) {\n System.out.println(\"Hello World\");\n }\n}",
|
||||
"successText": "Das Terminal erwacht zum Leben und begrüßt dich: \"Hello World\".",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Methodenname", "hint": "Der Einstiegspunkt jeder Java-Anwendung.", "solutions": ["main"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Die verschwundene Variable",
|
||||
"language": "java",
|
||||
"narrative": "Ein Kunde meldet einen Fehler: Auf dem Bildschirm soll die Anzahl der Leben erscheinen – doch da steht nichts.",
|
||||
"dialog": null,
|
||||
"code": "int lives = 3;\nSystem.out.println({{1}});",
|
||||
"successText": "Die Zahl 3 leuchtet auf dem Monitor. Der Kunde atmet auf.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Variable", "hint": "Welche Variable soll ausgegeben werden?", "solutions": ["lives"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Der flackernde Monitor",
|
||||
"language": "java",
|
||||
"narrative": "Der Serverraum ist dunkel. Nur ein Monitor flackert und wartet auf eine Eingabe, die er nicht lesen kann.",
|
||||
"dialog": "Bitte… repariere mich…",
|
||||
"code": "Scanner sc = new {{1}}(System.in);",
|
||||
"successText": "Eingaben sind wieder möglich. Der Monitor beruhigt sich.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Klassenname", "hint": "Dieselbe Klasse wie links vom Gleichheitszeichen.", "solutions": ["Scanner"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Zehn Server",
|
||||
"language": "java",
|
||||
"narrative": "Zehn Server müssen der Reihe nach geprüft werden – aber die Schleife, die sie durchläuft, fehlt.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} (int i = 0; i < 10; i++) {\n check(server[i]);\n}",
|
||||
"successText": "Alle zehn Server melden nacheinander: OK.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Die Zählschleife mit Start, Bedingung und Schritt.", "solutions": ["for"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Der Virus",
|
||||
"language": "java",
|
||||
"narrative": "Eine Schadsoftware hat eine Bedingung verdreht. Das Achievement schaltet nicht mehr frei, wenn der Score 100 erreicht.",
|
||||
"dialog": null,
|
||||
"code": "if (score {{1}} 100) {\n unlockAchievement();\n}",
|
||||
"successText": "Bei 100 Punkten schaltet das Achievement wieder frei. Der Virus ist neutralisiert.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "Mindestens 100 – größer oder gleich.", "solutions": [">="] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Die Datenbank",
|
||||
"language": "sql",
|
||||
"narrative": "Die KI hat alle Datensätze durcheinandergebracht. Du brauchst nur die volljährigen Nutzer – die Filter-Klausel fehlt.",
|
||||
"dialog": null,
|
||||
"code": "SELECT * FROM users\n{{1}} age > 18;",
|
||||
"successText": "Nur noch die passenden Datensätze erscheinen in der Liste.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Die SQL-Klausel zum Filtern von Zeilen.", "solutions": ["WHERE"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Netzwerk",
|
||||
"language": "bash",
|
||||
"narrative": "Du musst einen Server wieder erreichbar machen. Ein Ping soll zeigen, ob der lokale Rechner überhaupt antwortet.",
|
||||
"dialog": null,
|
||||
"code": "ping {{1}}",
|
||||
"successText": "Reply… reply… reply. Die Verbindung steht wieder.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Host / IP", "hint": "Die Adresse des eigenen Rechners – als Name oder als IP.", "solutions": ["localhost", "192.168.0.1", "127.0.0.1"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Der Dauerdienst",
|
||||
"language": "java",
|
||||
"narrative": "Ein Hintergrunddienst soll laufen, solange er aktiv ist. Das Schleifen-Schlüsselwort wurde gelöscht.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} (running) {\n handleRequests();\n}",
|
||||
"successText": "Der Dienst nimmt wieder Anfragen entgegen.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Kopfgesteuerte Schleife mit nur einer Bedingung.", "solutions": ["while"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Was zurückkommt",
|
||||
"language": "java",
|
||||
"narrative": "Eine Methode soll die Summe zweier Zahlen liefern – doch das Ergebnis kommt nie beim Aufrufer an.",
|
||||
"dialog": null,
|
||||
"code": "int sum(int a, int b) {\n {{1}} a + b;\n}",
|
||||
"successText": "Die Methode liefert endlich ihren Wert zurück.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Beendet die Methode und gibt einen Wert zurück.", "solutions": ["return"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Die leere Liste",
|
||||
"language": "java",
|
||||
"narrative": "Eine Namensliste soll angelegt werden, aber die konkrete Implementierung der Liste fehlt.",
|
||||
"dialog": null,
|
||||
"code": "List<String> namen = new {{1}}<>();",
|
||||
"successText": "Die Liste ist bereit, Namen aufzunehmen.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Klasse", "hint": "Die gängigste List-Implementierung (dynamisches Array).", "solutions": ["ArrayList"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Ins Log-Verzeichnis",
|
||||
"language": "bash",
|
||||
"narrative": "Um den Fehler zu finden, musst du in das Verzeichnis mit den Logdateien wechseln.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} /var/log",
|
||||
"successText": "Du stehst jetzt mitten in den Logs.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Befehl", "hint": "\"change directory\" – Verzeichnis wechseln.", "solutions": ["cd"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Sicher im Verlauf",
|
||||
"language": "bash",
|
||||
"narrative": "Deine Änderung ist fertig. Sichere sie mit einer Nachricht im Git-Verlauf.",
|
||||
"dialog": null,
|
||||
"code": "git {{1}} -m \"fix: login\"",
|
||||
"successText": "Der Stand ist im Verlauf festgehalten.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Git-Befehl", "hint": "Schreibt die vorgemerkten Änderungen in die Historie.", "solutions": ["commit"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Der tote Link",
|
||||
"language": "html",
|
||||
"narrative": "Auf der Kundenseite zeigt ein Link ins Leere – das Attribut für die Zieladresse fehlt.",
|
||||
"dialog": null,
|
||||
"code": "<a {{1}}=\"/home\">Start</a>",
|
||||
"successText": "Der Link führt jetzt sauber zur Startseite.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Attribut für die Zieladresse eines Links.", "solutions": ["href"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Sortierte Ware",
|
||||
"language": "sql",
|
||||
"narrative": "Die Produktliste des Shops kommt wild durcheinander. Sie soll nach Preis absteigend sortiert werden.",
|
||||
"dialog": null,
|
||||
"code": "SELECT * FROM produkte\n{{1}} preis DESC;",
|
||||
"successText": "Das teuerste Produkt steht jetzt oben.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Klausel", "hint": "Sortiert das Ergebnis (zwei Wörter).", "solutions": ["ORDER BY"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Das stumme Skript",
|
||||
"language": "python",
|
||||
"narrative": "Im Wartungsskript des Kunden soll nach dem Backup eine Meldung erscheinen – der Ausgabebefehl fehlt.",
|
||||
"dialog": null,
|
||||
"code": "{{1}}(\"Backup fertig\")",
|
||||
"successText": "\"Backup fertig\" erscheint im Terminal.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Funktion", "hint": "Pythons Standard-Ausgabefunktion.", "solutions": ["print"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "junior",
|
||||
"title": "Der Türcode",
|
||||
"language": "java",
|
||||
"narrative": "Die Sicherheitstür soll nur öffnen, wenn der eingegebene PIN exakt stimmt – der Vergleich fehlt.",
|
||||
"dialog": null,
|
||||
"code": "if (pin {{1}} 1234) {\n openDoor();\n}",
|
||||
"successText": "Bei richtigem PIN öffnet die Tür – und nur dann.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "Vergleich auf Gleichheit (nicht die Zuweisung).", "solutions": ["=="] }
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Die halbe Schleife",
|
||||
"language": "java",
|
||||
"narrative": "Ein Praktikant hat die Schleife halb fertig gelassen: Sowohl die Abbruchbedingung als auch der Zählschritt fehlen.",
|
||||
"dialog": null,
|
||||
"code": "for (int i = 0; i {{1}} 10; i{{2}}) {\n process(i);\n}",
|
||||
"successText": "Die Schleife läuft sauber von 0 bis 9 durch.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Bedingung", "hint": "Solange i kleiner als 10 ist.", "solutions": ["<"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Schritt", "hint": "i um eins erhöhen.", "solutions": ["++"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Fehler abfangen",
|
||||
"language": "java",
|
||||
"narrative": "Ein Dateizugriff lässt das Programm abstürzen. Du sollst den Fehler abfangen, statt alles crashen zu lassen.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} {\n readFile(\"daten.txt\");\n} {{2}} (IOException e) {\n log(e);\n}",
|
||||
"successText": "Der Fehler wird sauber protokolliert – kein Absturz mehr.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Block", "hint": "Der Block, der den riskanten Code umschließt.", "solutions": ["try"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Block", "hint": "Der Block, der die Exception auffängt.", "solutions": ["catch"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Neuer Eintrag",
|
||||
"language": "sql",
|
||||
"narrative": "Ein neuer Nutzer soll angelegt werden, aber das INSERT-Statement ist an zwei Stellen unvollständig.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} INTO users (name, age)\n{{2}} ('Alice', 28);",
|
||||
"successText": "Alice ist jetzt in der Datenbank gespeichert.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Mit welchem Befehl fügt man eine Zeile ein?", "solutions": ["INSERT"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Leitet die einzufügenden Werte ein.", "solutions": ["VALUES"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Durch die Liste",
|
||||
"language": "java",
|
||||
"narrative": "Jeder Eintrag der Liste soll ausgegeben werden. In der erweiterten for-Schleife fehlen Trenner und Ausgabe.",
|
||||
"dialog": null,
|
||||
"code": "for (String s {{1}} liste) {\n System.out.{{2}}(s);\n}",
|
||||
"successText": "Alle Einträge der Liste laufen über den Bildschirm.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Trenner", "hint": "Trennt in der for-each-Schleife Variable und Sammlung.", "solutions": [":"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Methode", "hint": "Gibt eine Zeile mit Zeilenumbruch aus.", "solutions": ["println"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Das Fließband",
|
||||
"language": "java",
|
||||
"narrative": "Eine Auto-Klasse braucht ihren Bauplan. Klassen-Schlüsselwort und der Verweis aufs eigene Objekt fehlen.",
|
||||
"dialog": null,
|
||||
"code": "public {{1}} Auto {\n String marke;\n Auto(String marke) {\n {{2}}.marke = marke;\n }\n}",
|
||||
"successText": "Vom Fließband rollt das erste Auto-Objekt.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Leitet die Definition eines Bauplans ein.", "solutions": ["class"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Referenz", "hint": "Verweis auf das aktuelle Objekt.", "solutions": ["this"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Bestellungen verknüpfen",
|
||||
"language": "sql",
|
||||
"narrative": "Nutzer und ihre Bestellungen sollen zusammengeführt werden – die Verknüpfung und ihre Bedingung fehlen.",
|
||||
"dialog": null,
|
||||
"code": "SELECT * FROM users u\n{{1}} orders o {{2}} u.id = o.user_id;",
|
||||
"successText": "Jede Bestellung steht jetzt neben ihrem Nutzer.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Verbindet zwei Tabellen.", "solutions": ["JOIN", "INNER JOIN"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Leitet die Verknüpfungsbedingung ein.", "solutions": ["ON"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Auf Fehlersuche",
|
||||
"language": "bash",
|
||||
"narrative": "Im riesigen Logfile sollst du nur die Fehlerzeilen sehen. Verbinde die Ausgabe mit dem Suchwerkzeug.",
|
||||
"dialog": null,
|
||||
"code": "cat app.log {{1}} {{2}} ERROR",
|
||||
"successText": "Nur noch die ERROR-Zeilen rauschen über den Schirm.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Zeichen", "hint": "Leitet die Ausgabe an den nächsten Befehl weiter (Pipe).", "solutions": ["|"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Befehl", "hint": "Filtert Zeilen nach einem Muster.", "solutions": ["grep"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Ungültiges Alter",
|
||||
"language": "java",
|
||||
"narrative": "Ein negatives Alter darf nicht durchrutschen. Bedingung und das Auslösen der Ausnahme fehlen.",
|
||||
"dialog": null,
|
||||
"code": "{{1}} (alter < 0) {\n {{2}} new IllegalArgumentException(\"negativ\");\n}",
|
||||
"successText": "Negative Werte werden jetzt sofort abgewiesen.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Prüft eine Bedingung.", "solutions": ["if"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Wirft eine Exception aktiv aus.", "solutions": ["throw"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Die Summe im Array",
|
||||
"language": "java",
|
||||
"narrative": "Alle Zahlen eines Arrays sollen aufsummiert werden. Die Längenabfrage und die Aufsummierung fehlen.",
|
||||
"dialog": null,
|
||||
"code": "int sum = 0;\nfor (int i = 0; i < zahlen.{{1}}; i++) {\n sum {{2}} zahlen[i];\n}",
|
||||
"successText": "Die Summe steht – ohne ein einziges Element zu verpassen.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Eigenschaft", "hint": "Die Anzahl der Elemente eines Arrays.", "solutions": ["length"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "sum um zahlen[i] erhöhen (Kurzform).", "solutions": ["+="] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "professional",
|
||||
"title": "Das Login-Formular",
|
||||
"language": "html",
|
||||
"narrative": "Das Anmeldeformular schickt nichts ab und zeigt das Passwort im Klartext. Versandart und Feldtyp fehlen.",
|
||||
"dialog": null,
|
||||
"code": "<form action=\"/login\" {{1}}=\"post\">\n <input {{2}}=\"password\">\n</form>",
|
||||
"successText": "Das Formular sendet sicher per POST, das Passwort bleibt verdeckt.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Legt die HTTP-Methode des Formulars fest.", "solutions": ["method"] },
|
||||
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Bestimmt die Art des Eingabefeldes.", "solutions": ["type"] }
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Stille Konsole",
|
||||
"language": "java",
|
||||
"narrative": "Vom Logging-Modul ist nur noch eine halbe Zeile übrig. Rekonstruiere den kompletten Ausgabebefehl.",
|
||||
"dialog": null,
|
||||
"code": "{{1}}(\"Hallo\");",
|
||||
"successText": "\"Hallo\" erscheint in der Konsole. Das Logging lebt wieder.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Anweisung", "hint": "Der vollständige Standard-Ausgabebefehl in Java (Objektkette).", "solutions": ["System.out.println"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Der Einstiegspunkt",
|
||||
"language": "java",
|
||||
"narrative": "Eine Schadroutine hat die komplette Signatur der Hauptmethode gelöscht – nur Klammern blieben übrig. Stell die ganze Zeile wieder her.",
|
||||
"dialog": null,
|
||||
"code": "public class App {\n {{1}} {\n run();\n }\n}",
|
||||
"successText": "Die App findet ihren Einstiegspunkt wieder und startet.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Signatur", "hint": "Sichtbarkeit, static, Rückgabetyp void, Name und String-Array-Parameter.", "solutions": ["public static void main(String[] args)", "static public void main(String[] args)", "public static void main(String args[])"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Geburtstag in der DB",
|
||||
"language": "sql",
|
||||
"narrative": "Alice hat Geburtstag und ist jetzt 29. Schreibe die komplette UPDATE-Zeile, die ihr Alter setzt (ohne die WHERE-Bedingung).",
|
||||
"dialog": null,
|
||||
"code": "{{1}}\nWHERE name = 'Alice';",
|
||||
"successText": "Alices Alter ist aktualisiert. Herzlichen Glückwunsch!",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": false, "placeholder": "ganze Zeile", "hint": "UPDATE <tabelle> SET <spalte> = <wert>", "solutions": ["UPDATE users SET age = 29"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Der Bauplan des Roboters",
|
||||
"language": "java",
|
||||
"narrative": "Die Klassendeklaration des Roboters wurde gelöscht – nur der Rumpf blieb. Schreib die komplette öffentliche Klassenzeile (Klasse: Roboter).",
|
||||
"dialog": null,
|
||||
"code": "{{1}} {\n // Roboter-Logik\n}",
|
||||
"successText": "Der Roboter hat wieder einen Bauplan und kann gebaut werden.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "Sichtbarkeit + Schlüsselwort + Name der Klasse.", "solutions": ["public class Roboter"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Eingabe von vorn",
|
||||
"language": "java",
|
||||
"narrative": "Die komplette Initialisierung der Tastatureingabe wurde gelöscht. Stell die ganze Zeile wieder her (Variable: sc).",
|
||||
"dialog": null,
|
||||
"code": "{{1}};",
|
||||
"successText": "Die Tastatureingabe ist wieder bereit.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "Deklaration + Zuweisung eines neuen Scanners auf System.in.", "solutions": ["Scanner sc = new Scanner(System.in)"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Jede Zahl zählt",
|
||||
"language": "java",
|
||||
"narrative": "Die erweiterte for-Schleife über das Array 'zahlen' fehlt komplett. Rekonstruiere sie (Variable n, Typ int).",
|
||||
"dialog": null,
|
||||
"code": "{{1}} {\n summe += n;\n}",
|
||||
"successText": "Jede Zahl des Arrays fließt in die Summe ein.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "for ( <Typ> <Variable> : <Array> )", "solutions": ["for (int n : zahlen)", "for(int n : zahlen)"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Alte Logs entsorgen",
|
||||
"language": "sql",
|
||||
"narrative": "Uralte Logeinträge sollen gelöscht werden. Schreibe die komplette DELETE-Zeile (Tabelle: logs), die WHERE-Bedingung steht schon.",
|
||||
"dialog": null,
|
||||
"code": "{{1}}\nWHERE created < '2020-01-01';",
|
||||
"successText": "Die alten Logs sind Geschichte – die Platte atmet auf.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": false, "placeholder": "ganze Zeile", "hint": "DELETE FROM <tabelle>", "solutions": ["DELETE FROM logs"] }
|
||||
]
|
||||
},
|
||||
{
|
||||
"difficulty": "senior",
|
||||
"title": "Die Methode zurückbauen",
|
||||
"language": "java",
|
||||
"narrative": "Von einer Additions-Methode ist nur der Rumpf übrig. Schreibe die komplette Signatur (public, gibt int zurück, heißt add, nimmt int a und int b).",
|
||||
"dialog": null,
|
||||
"code": "{{1}} {\n return a + b;\n}",
|
||||
"successText": "Die Methode add ist wiederhergestellt und liefert die Summe.",
|
||||
"gaps": [
|
||||
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Signatur", "hint": "<Sichtbarkeit> <Rückgabetyp> <Name>(<Parameter>)", "solutions": ["public int add(int a, int b)", "public int add(int a,int b)"] }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user