Eine kleine Web-Plattform, um auf dem eigenen Handy/Tablet/Notebook gegen einen realen Gegner zu spielen. Du startest eine Partie, bekommst einen 6-stelligen Code und gibst ihn deinem Gegner. Er gibt den Code ein – und ihr spielt gegeneinander, jeder auf seinem eigenen Gerät.
Spiele: Schach, Dame und Mühle.
- Ein einziger Node.js-Server liefert die Web-Oberfläche und wickelt die Echtzeit-Kommunikation per WebSocket ab.
- Der Server ist autoritativ: Er kennt den Spielstand, prüft jeden Zug auf Regelkonformität und schickt jedem Spieler nur dessen erlaubte Züge. Schummeln über manipulierte Clients ist damit nicht möglich.
- Aktive Partien liegen im Arbeitsspeicher. Es wird keine Datenbank benötigt. Bei einem Server-Neustart gehen laufende Partien verloren.
- Trennt sich ein Spieler kurz (z. B. Tunnel), nimmt er die Partie automatisch wieder auf (Sitzungs-Token im Browser). Wurde der Browser versehentlich geschlossen und der Token ist weg, kann er einfach den Code erneut eingeben und seinen Platz zurückerobern – aber nur, solange dieser Platz wirklich getrennt ist. Sind beide Spieler verbunden, wird ein Beitritt mit dem Code abgelehnt. Ein Heartbeat (Ping/Pong) erkennt auch abrupt geschlossene Verbindungen zuverlässig. Inaktive Partien werden nach 60 Minuten aufgeräumt.
Voraussetzung: Node.js (≥ 16).
npm install
npm run build
npm startDann im Browser http://localhost:3000 öffnen. Für das Spielen zu zweit im
selben WLAN: die lokale IP des Rechners verwenden (z. B.
http://192.168.x.y:3000) und auf beiden Geräten öffnen.
Während der Entwicklung mit automatischem Neustart:
npm run devEinfachster Weg (ein Container, kein weiteres Setup):
docker compose up --buildOder direkt mit Docker:
docker build -t online-games-duell .
docker run -p 3000:3000 online-games-duellErreichbar unter http://localhost:3000. Über die Umgebungsvariable PORT
lässt sich der Port ändern.
Hinweis zum öffentlichen Betrieb: Damit Freunde von außerhalb beitreten können, muss der Server über das Internet erreichbar sein (z. B. hinter einem Reverse-Proxy mit HTTPS). Bei HTTPS wird die WebSocket-Verbindung automatisch auf
wss://umgestellt. Der Reverse-Proxy muss WebSocket-Upgrades durchreichen (Standard bei Caddy, Traefik und nginx mitUpgrade-Headern).
src/
server.ts Express + WebSocket-Server, Nachrichten-Protokoll
rooms.ts Verwaltung aktiver Partien, 6-stellige Codes
games/
types.ts Gemeinsame Engine-Schnittstelle
chess.ts Schach (nutzt chess.js)
checkers.ts Dame (eigene Regel-Engine)
morris.ts Mühle (eigene Regel-Engine)
index.ts Spiel-Registry
public/
index.html, styles.css
js/app.js Lobby, Verbindung, Bildschirm-Steuerung
js/games/*.js Darstellung der Bretter + Eingabe
- In
src/games/eine Datei mit einerGameEngineanlegen (siehetypes.ts). - In
src/games/index.tsregistrieren. - In
public/js/app.jsunterGAME_METAundRENDERERSeintragen und inpublic/js/games/einen Renderer ergänzen.
- Schach: vollständige Regeln über
chess.js(Rochade, en passant, Umwandlung, Schachmatt, Patt, Remis-Regeln). - Dame (8×8, an internationale Regeln angelehnt): Schlagzwang, Schlagen in alle Richtungen, Mehrfachschlag, fliegende Dame. Es gilt nicht die Regel, immer die maximale Anzahl schlagen zu müssen.
- Mühle (Nine Men's Morris): Setzen → Ziehen → Springen (bei 3 Steinen), Mühle erlaubt das Entfernen eines gegnerischen Steins (nicht aus einer Mühle, außer alle gegnerischen Steine stehen in Mühlen). Verloren bei < 3 Steinen oder Zugunfähigkeit.
npm testDer Testlauf kompiliert zuerst, prüft dann die Spiel-Engines direkt (Schlagzwang, Mehrfachschlag, fliegende Dame, Mühle-Bildung) und startet anschließend einen echten Server für End-to-End-Tests über WebSocket (Partie erstellen, beitreten, illegale Züge ablehnen, Schachmatt erkennen).
Die Pipeline unter .github/workflows/ci.yml läuft
bei jedem Push und Pull Request:
- build-test:
npm ci,npm run build,npm test. - docker: baut das Container-Image. Bei Push auf
main(oder einemv*-Tag) wird es zusätzlich in die GitHub Container Registry (GHCR) unterghcr.io/<owner>/<repo>veröffentlicht – ohne zusätzliche Secrets, über den eingebautenGITHUB_TOKEN. Bei Pull Requests wird nur gebaut, nicht veröffentlicht.