**Dies ist eine alte Version des Dokuments!**
Rundenbasierter Gameserver mit REST-API
1. Organisation
Alle Talenta/EF Schüler:innen bilden zusammen eine Projektorganisation, um einen Game-Server zu realisieren. Die Lehrperson hat dabei zwei Rollen: einerseits vertritt sie die Auftraggeberin, die JungleState Inc, andererseits fungiert sie als Projekt-Coach.
2. Ablauf
Die Umsetzung folgt der Entwicklung in einer Software-Firma:
- Kick-off (1w):
- Der Auftraggeber stellt das Projekt und die Requirements vor.
- Die Projektgruppe definiert ihre Projektorganisation und erstellt ein Proposal.
- Einreichung des Proposals inkl. Komponentenplanung und Zeitplan
- Implementierungsphase (5w)
- Umsetzung gemäss Proposal
- Alle Artefakte werden in Github abgelegt:
- Quellcode
- Dokumentation (als Markdown)
- Issues (Implementierungseinheiten)
- Milestones (jede Woche einer)
- Nach jeder Woche erwartet die Auftraggeberin einen kurzen Email-Report mit folgendem Inhalt:
- Projektfortschritt
- Ist vs. Soll: Wo steht das Projekt im Vergleich zum Zeitplan?
- Aufgewendete Zeit: Wieviel Zeit wurde für jede Komponente verwendet?
- Abgabe Projekt (3w)
- Begutachtung durch Auftraggeber
- Allfällige Gewährleistungsarbeiten
- Reflektion
- Was hat gut funktioniert was nicht?
- Organisation
- Planung
- Implementierung
3. Requirements
Es wird ein Game-Server implementiert, der remote Clients in einem rundenbasierten Game gegeneinander spielen lässt.
3.1 Spielbeschrieb
Das Spiel besteht aus dem Urwald und Affen, die sich gegenseitig mit Kokosnüssen bewerfen.
3.1.1 Spielfeld
Der Urwald besteht aus einer zweidimensionalen Matrix mit diskreten Feldern. Jedes Feld kann durch einen eindeutigen Zustand beschrieben werden, zum Beispiel
- frei
- Dickicht (undurchdringlich)
- Affe
- Tokens wie Banane, Kokosnuss, ev. weitere Tokens
3.1.2 Spielablauf
Jeder Affe erhält zu Beginn der Runde seinen einsehbaren Teilbereich des Urwalds. Dieser beträgt typischerweise 5×5 Felder um die Position des Affen. Der Affe entscheidet sich für eine Aktion, entweder MOVE
oder THROW_COCONUT
in einer der 8 Richtungen. Kokosnüsse fliegen nur ein Feld weit.
Wird ein Affe von einer Kokosnuss getroffen, wird seine Lebensenergie um eine bestimmte Menge verringert. Fällt die Lebensenergie eines Affen auf null, fällt er ohnmächtig vom Ast und scheidet aus1).
Kollidieren zwei Affen oder ein Affe und der Dickicht, verringert sich die Lebensenergie ebenfalls, die Affen bleiben auf ihrem Feld stehen.
Findet ein Affe eine Banane, wird die Lebensenergie erhöht. Gefundene Kokosnüsse erhöhen den Munitionsvorrat. Sowohl Lebensenergie als auch Kokosnussvorrat sind begrenzt.
3.1.3 Punkte, Spielende, Gewinn
Affen erhalten Punkte für gewisse Aktionen:
- Treffen von Gegnern
- Eliminieren von Gegnern
- ev. Finden von bestimmten Tokens (Ananas?)
Das Spiel endet wenn weniger als zwei Affen übrig bleiben, oder nach einer definierten Zeit.
Gewinner ist der Affe mit den meisten Punkten. Eventuell könnte man den Gewinner auch nur aus den wachen Affen auswählen - allerdings schafft dies einen Anreiz, sich möglichst lange zu verstecken und am Schluss auf den letzten Überlebenden loszugehen…
3.2 Technische Vorgaben
Die Umsetzung folgt der Client-Server-Architektur.
3.2.1 Server
Der Server wird als REST-API definiert und implementiert. Das API soll mit der Anfangsanfrage mitgeliefert werden (HATEOS).
- Die Abfrage des Spielzustands soll mittels Long-Polling (ev. Websockets) umgesetzt werden: der Client fragt den Zustand an, die Antwort erfolgt erst, wenn die Runde zuende ist.
- Der Server unterstützt zusätzlich zum Client-Zugang über einen privilegierten Zugang, um das gesamte Spielfeld zu visualisieren.
- Es werden verschiedene Spielfelder unterstützt (default, Testumgebung, Schwierigkeitsgrade…).
- Ein Spiel soll von bis zu 50 Clients gleichzeitig gespielt werden können.
3.2.2 Client
Clients greifen ausschliesslich über das REST-API auf ein Spiel zu. Zum Lieferumfang gehören:
- Ein Beispiel-Client auf C#-Basis, der einen einfachen Affen-Agenten implementiert (z.B. einer, der jede zweite Runde in einer zufälligen Richtung geht und auf alles in der Umgebung schiesst).
- Ein Konsolen- oder Web-Client-Programm für Testzwecke, das die manuelle Steuerung eines Affen erlaubt.
- Die Steuerung soll über Tastatureingabe erfolgen.
- Eine Visualisierung als Web-App, die das gesamte Spielfeld abbildet, um Spiele live verfolgen zu können.
- Die App soll den Namen Dschungelcamp tragen.
3.3 Proposal
Die Gruppe erarbeitet ein Proposal um die obigen Requirements umzusetzen. Das Proposal beinhaltet die folgenden zwei Teile:
Design
Das Design wird als Markdown-Dokument auf Github gestellt. Es beinhaltet:
- Aufteilung des Systems in Komponenten:
- Server: Spiel-Management, Gameplay, Benutzeridentifizierung
- Client: Beispiel-Client, API-Code für andere Schüler
- Visualisierung: UI, Schnittstellen…
- Diagramm der Hauptbestandteile
- zu implementierende REST-Endpunkte mit folgenden Angaben:
- Ressourcenname mit allen Parametern (z.B.
/gamestate/game123
) - HTTP-Methode (z.B.
GET
) - Rückgabe-Wert und Format (meist JSON)
- Schnittstellenbeschreibung zwischen Komponenten (z.B. JSON-Format).
- Technologie-Stack auf Server und Client:
- Vorgeschlagene Technologie / Plattform
- ev. Abwägung von verschiedenen Möglichkeiten.
Ausführungsplan
Die Umsetzung wird in kleinere Einheiten, sogenannte Tasks aufgeteilt, die typischerweise in einer Woche umsetzbar sein sollten. Für jede Woche wird in Github ein Milestone erstellt, und für jeden Task wird ein Github Issue erstellt. Zumindest für die ersten Wochen sollten die Tasks auf den passenden Milestone eingeteilt werden.
Gibt es Abhängigkeiten zwischen den Tasks? Wie gross sind die Tasks (1, 2, 3, 5 Stunden)?
Beispiel-Tasks:
- Git Repo einrichten und Projekt-Layout definieren.
- JSON-Schnittstelle für ein Game definieren.
- Game-Logik in Python implementieren.
- Einfache Game-Verwaltung mit Sessions implementieren.
- …
Materialien
- Optionale Features:
- Skinning: Statt Urwald-Affen kann dasselbe Spiel mit anderer Oberfläche gespielt werden (Panzer, Pacman…)
- Benutzerverwaltung: Benutzer müssen sich identifizieren (wie?), es werden Ranglisten gespeichert.
- Handicap: gute Spieler erhalten ein Handicap (z.B. werden sie in jeder Runde mit Wahrscheinlichkeit p ausgelassen, p korreliert mit der Spielstärke).
- ML-Schnittstelle: erlaubt es, eine ML-Learner zu trainieren, der die optimale Spielstrategie herausfindet (entweder mit Zielwert-Learning oder mittels Generative Adversarial Networks)
- Randomisierung: Kokosnüsse treffen nur mit Wahrscheinlichkeit x < 1 - damit wird das Spiel etwas weniger deterministisch.