Schulduell
Erscheinungsbild

- Beim „Schulduell“ spielen deutschsprachige Schüler:innen rund um den Globus in Echtzeit gegeneinander.
- Jede Partie besteht aus zwei Spieler:innen (Duell).
- Ein zentraler Spielserver verwaltet bis zu 15 parallele Duelle oder mehr.
- Die Spieler:innen verbinden sich über eine Domain (z. B. ‘’quiz.schulduell.de’’) und spielen im Browser.
- Die Plattform unterstützt Fächerwahl, Schwierigkeitsgrad, verschiedene Quizzes und einen Schnelligkeitsmodus mit 10‑Sekunden‑Timer.
- Zusatzquizze lassen sich einfach integrieren, indem man eine JSON‑Datei in einen Quiz‑Ordner kopiert.
- Ein Hitlisten‑/Ranking‑System zeigt Best Scores und Highscores.
- Alle Abläufe sind mehrsprachig erweiterbar (Startversion auf Deutsch).
- **Zentrales Server-Back‑End**
- Eine dedizierte Webanwendung (z. B. Node.js mit Express + Socket.IO oder Python mit FastAPI + WebSockets) läuft auf dem Server der Domain. - Der Server hält alle Spielzustände, Räume, Timer und Ranglisten im Speicher und persistiert Daten in einer Datenbank (z. B. PostgreSQL oder MongoDB). - Jeder Spielraum (Room) hat eine eindeutige ID, hält zwei Spielerplätze und speichert Quiz, aktuelle Frage, Punkte und Timer. - Ein Realtime‑Layer (WebSockets) sendet Fragen, Antworten und Punktestände in Millisekunden an die Browser, um Schnelligkeit zu gewährleisten.
- **Front‑End**
- HTML5, CSS3 und JavaScript (React/Vue/Vanilla) liefern eine responsive Web-App für Smartphones und Desktops. - Die Web-App enthält Seiten für Login, Raumwahl, Quizauswahl, Spiel, Ranking und Administration. - Das Front‑End kommuniziert per WebSocket (z. B. Socket.IO) mit dem Server, um Latenzen gering zu halten.
- **Quizdaten als Dateien**
- Alle Quizsets liegen als JSON‑Dateien in einem Ordner (`quizzes/`). - Beim Start liest der Server alle JSON‑Dateien, indexiert sie nach Fach, Schwierigkeitsgrad und Titel. - Lehrkräfte und Entwickler:innen können neue Quizsets ergänzen, indem sie eine neue Datei ablegen – ohne den Code zu ändern.
- **Optionale Hardware (ESP32)**
- Für den Arduino‑Bezug kann ein ESP32 als Anzeige‑ oder Effektgerät dienen (z. B. LED-Streifen, Buzzer, LCD), der über WLAN mit dem Server verbunden ist. - Das ESP32 zeigt den aktuellen Spitzenreiter an oder signalisiert Rundenbeginn/-ende über LEDs und Ton.
- **Domain**
- Registrieren Sie eine einprägsame Domain (z. B. quiz.schulduell.de). - Konfigurieren Sie DNS-Einträge (A/AAAA) auf den Hosting-Server.
- **Server**
- Mieten Sie einen virtuellen Server oder nutzen Sie einen Cloud-Dienst (z. B. Hetzner, DigitalOcean, AWS EC2) mit Linux. - Mindestausstattung: 2 CPU‑Kerne, 4 GB RAM, SSD‑Speicher; skaliert nach erwarteter Nutzerzahl. - Installieren Sie eine Runtime (Node.js LTS oder Python 3.10+). - Installieren Sie einen Webserver/Proxy (z. B. Nginx) vor Ihrer Anwendung für HTTPS‑Terminating und statische Dateien.
- **Sicherheit**
- Aktivieren Sie HTTPS mit TLS (z. B. Let’s Encrypt). - Verwenden Sie sichere HTTP‑Header (Content‑Security‑Policy, X-Frame-Options, Strict‑Transport‑Security). - Sanitisieren Sie Benutzereingaben gegen XSS, CSRF und Injection. - Speichern Sie keine personenbezogenen Daten (nur Pseudonyme), um datenschutzkonform zu bleiben (DSGVO). - Implementieren Sie Ratelimits, um DDoS‑Angriffe zu erschweren.
- **Skalierbarkeit**
- Für bis zu 15 Duelle reicht ein einzelner Server. - Bei hoher Last können Sie horizontale Skalierung (mehrere Instanzen) verwenden; Socket.IO unterstützt Sticky Sessions via Redis. - Nutzen Sie Docker/Kubernetes für Portabilität und Skalierung in der Cloud.
- Die Spieler:innen öffnen die Domain im Browser.
- Sie geben einen Spitznamen ein (Option: Authentifizierung via OAuth/Schulzugang).
- Sie wählen einen Raum oder erstellen einen neuen Raum (maximal zwei Personen pro Raum).
- Jedes Duell erhält eine eindeutige URL (z. B. quiz.schulduell.de/room/abc123), die sich über QR‑Code teilen lässt.
- Sobald beide Spieler:innen im Raum sind, sehen sie:
- Fachwahl (z. B. Mathematik, Geografie, Medienbildung). - Schwierigkeitsgrad (leicht/mittel/schwer). - Verfügbare Quiztitel (aus dem Ordner `quizzes/`, z. B. Multiplikation, Hauptstädte).
- Ein:e Spieler:in wählt Quiz und bestätigt. (Optional: Lehrkraft wählt Quiz zentral für alle Räume.)
- Der Server lädt die zugehörige JSON‑Datei und startet das Spiel.
- Das Spiel besteht aus 10 Fragen; jede Frage bietet 4 Antwortmöglichkeiten.
- Der Server startet für jede Frage einen 10‑Sekunden‑Timer.
- Beide Spieler:innen sehen die Frage und Antworten gleichzeitig.
- Sie tippen ihre Antwort; die Nachricht enthält Spieler-ID, Raum-ID und Antwort-ID.
- Der Server bewertet:
- War die Antwort innerhalb der Zeit? - Ist sie richtig? - War sie die schnellste richtige Antwort?
- Der schnellste korrekte Spieler erhält einen Punkt (Fehler/zu spät = 0 Punkte).
- Nach Ablauf oder nach der ersten richtigen Antwort schließt der Server die Frage, sendet die Lösung und startet die nächste.
- Nach der 10. Frage sendet der Server das Duell-Endergebnis an beide.
- Der Server speichert jedes Duell: Raum-ID, Datum/Zeit, Quiz, Schwierigkeit, Spieler-Namen, Punkte und durchschnittliche Antwortzeit.
- Eine Hitliste sortiert Ergebnisse nach Siegen, Punkten, Best Score (maximale Punktzahl), Reaktionszeit oder Mischung.
- Rankings lassen sich nach Fach/Schwierigkeitsgrad filtern.
- Die Best Scores können anonymisiert (Spitzname) angezeigt werden.
- Eine separate Rangliste für Schulklassen oder Regionen ist möglich.
- Lehrkräfte/Moderator:innen haben Zugriff auf ein Dashboard mit:
- Übersicht aller Räume (bereit, im Spiel, fertig). - Aktuelle Frage und Punktestand pro Raum. - Möglichkeit, Quizzes zentral zu starten, zu beenden oder Räume zu schließen. - Einsicht in Hitliste und Best Scores.
- Administrator:innen können Quizdateien hochladen/löschen, Räume sperren, Spieler melden/entfernen.
- Option: Export der Ergebnisse als CSV/JSON für pädagogische Auswertung.
```json {
"id": "multiplikation_leicht",
"subject": "Mathematik",
"difficulty": "leicht",
"title": "Multiplikation bis 10",
"questions": [
{
"question": "Was ist 2 x 3?",
"answers": ["4", "5", "6", "8"],
"correct": 2,
"explanation": "2 mal 3 ergibt 6." // optional
},
...
]
}