edu-boardgame-generator/README.md

155 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Edu Boardgame Generator
Web-Baukasten, mit dem Schülerinnen und Schüler eigene Lernbrettspiele zusammenstellen: Spielfeld, Story-Elemente, Quiz-Fragen und Mini-Games. Das fertige Spiel läuft direkt im Browser und lässt sich per Link oder sechsstelligem Kurz-Code teilen.
**Live:** https://franke-lab.de/edu-boardgame-generator
**Kontext:** Pädagogische Hochschule Weingarten, BoysDay / Informatik-Unterricht
## Features
- **Fünf-Schritte-Editor:** Spielidee, Design (Figur, Weltkulisse, Feldanzahl), Spielfeld-Bestückung (Mini-Games pro Feld), Story- und Quiz-Karten, Veröffentlichung.
- **Player:** Würfel, animierte Figur, Konsequenzen (Felder vor/zurück, Leben, Punkte, Zug aussetzen, nochmal), Sieg-/Verlust-Bildschirm.
- **Vierzehn Mini-Games:** Snake, Flappy, Memory, Quiz, Reaction, Basketball, Catch, Maze, Simon, Puzzle, Spot-Diff, Typing sowie 2-Spieler-Varianten von Snake und Flappy.
- **Zwei Wege zum Teilen:** komprimierter URL-Hash (kein Backend nötig) und sechsstelliger Kurz-Code (via API auf dem Server persistiert).
- **Python-Code-Vorschau:** Die Konfiguration wird als lesbarer Python-Pseudocode ausgegeben Bindeglied zwischen Baukasten und Programmierunterricht.
- **PDF-Export** des Spielfelds für den Druck.
- **QR-Code** zum Aufrufen des Spiels vom Handy.
## Architektur
Reines Frontend, keine Build-Kette. Ein kleiner Node-HTTP-Server dient nur zum Ablegen und Ausliefern der Kurz-Codes.
```
Browser
editor.html Editor (Wizard, Vorschau, Sharing)
game.html Player
play/ Landing-Seite für Kurz-Code-Aufruf
|
| fetch /api/boardgame-play/{code}
v
nginx (franke-lab.de) --> Node.js :3009 --> play/codes/{code}.json
```
- Der Editor speichert Zwischenstände in `localStorage`.
- Beim Teilen wird die Konfiguration mit pako gzip-komprimiert und base64-kodiert. Kleine Spiele passen in einen URL-Fragment (`#z:…`), größere werden über den Kurz-Code-Endpunkt abgelegt.
- Der Player liest wahlweise Hash-Fragment oder holt sich das JSON per Kurz-Code.
## Verzeichnisstruktur
```
edu-boardgame-generator/
index.html Weiterleitung auf editor.html
editor.html Editor-Grundgerüst
editor.css
game.html Player-Grundgerüst
game.css
codegen.js Python-Code-Vorschau
js/
state.js globaler Editor-Zustand + localStorage
data.js Konstanten (Figuren, Welten, Mini-Game-IDs), esc()
wizard.js Schritt-Navigation, Validierung
board.js Spielfeld-Editor, Drag&Drop, Story-Karten
quiz.js Quiz-Editor
world.js Canvas-Rendering des Spielbretts
share.js Serialisierung, URL-Hash, Kurz-Code-Request
minigame-test.js Testlauf einzelner Mini-Games im Editor
tour.js erste Nutzer-Tour
game.js Player-Logik (Würfel, Bewegung, Konsequenzen)
minigames/
_api.js MGAPI: onResult, Farb-Themes
snake.js, snake2p.js
flappy.js, flappy2p.js
memory.js, quiz.js, reaction.js
basketball.js, catch.js, maze.js
simon.js, puzzle.js, spotdiff.js
typing.js
play/
index.html Landing für /play/{CODE}
codes/*.json persistierte Spiel-Konfigurationen
```
## Kurz-Code-API
Node-HTTP-Server, hört auf `127.0.0.1:3009`, wird von nginx unter
`/api/boardgame-play/*` durchgereicht.
| Route | Methode | Beschreibung |
|---|---|---|
| `/api/boardgame-play` | POST | Nimmt eine JSON-Konfiguration entgegen, vergibt einen freien Kurz-Code und antwortet mit `{code}` |
| `/api/boardgame-play/{code}` | GET | Liefert die zugehörige JSON-Konfiguration |
- **Alphabet:** `23456789ABCDEFGHJKLMNPQRSTUVWXYZ` (verwechslungsarm, ohne 0/O/1/I/L)
- **Code-Länge:** 6 Zeichen
- **Nutzlast:** maximal 50 KB pro Spiel
- **Speicherort:** flache JSON-Dateien unter `play/codes/`
## Abhängigkeiten
**Backend:** Node.js (nur Standardbibliothek: `http`, `fs`, `path`) - kein `package.json`, keine externen Pakete.
**Frontend (über CDN eingebunden):**
- pako 2.1.0 - Komprimierung für URL-Hash-Sharing
- qrcodejs 1.0.0 - QR-Code zum Spiel
- jsPDF 2.5.1 - PDF-Export des Spielfelds
## Entwicklung
Es gibt keine Build-Schritte und keine Bundler. Direkt am Live-Server oder lokal editieren.
```bash
# statisch servieren (im Projektordner)
python3 -m http.server 8000
# Kurz-Code-Server lokal
node server.js
```
Für Test mit lokalem Backend die API-Basis in `js/share.js` anpassen.
## Deployment (Produktions-Setup)
Datei-Ablage:
```
/var/www/franke-lab/edu-boardgame-generator/ Frontend
/opt/boardgame-play/server.js Kurz-Code-Server
```
systemd-Unit `boardgame-play.service`:
```
[Service]
ExecStart=/usr/bin/node /opt/boardgame-play/server.js
WorkingDirectory=/opt/boardgame-play
```
nginx-Snippet:
```
location ~ ^/api/boardgame-play(/.*)?$ {
proxy_pass http://127.0.0.1:3009$1;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
```
## Sicherheit
- Nutzer-Eingaben (Name, Story-Texte, Quiz-Fragen/Antworten, Feld-IDs) werden beim Laden in `sanitizeCfg` gegen Whitelists geprüft und Länge/Bereich geklemmt.
- Rendering im Player nutzt `textContent` bzw. `esc()` statt roher `innerHTML`-Interpolation.
- Kurz-Code-Endpunkt akzeptiert nur Codes im definierten Alphabet und lehnt Payloads > 50 KB ab.
## Roadmap
Kurzfristig geplant (aus Nutzer-Beobachtungen 7./8. Klasse):
- Startseite mit „Meine Spiele", Vorlagen und Kurz-Tutorial
- Zwei-Spieler-Modus für den kompletten Spielablauf (bislang nur pro Mini-Game)
- Melde-Funktion für problematische Inhalte, IP-Log am Kurz-Code-Endpunkt, Wort-Filter
- Optionales Nutzerkonto zur Verwaltung eigener Spielcodes
## Lizenz
Interne Nutzung, PH Weingarten. Klärung mit den Autoren vor Weitergabe.