Heim > Artikel > Backend-Entwicklung > Rundenbasiertes Mehrspieler-Bierspiel
Da ich in naher Zukunft einen Workshop zum Systemdenken organisieren muss, brauche ich zum Start ein Bierspiel.
Das Bierspiel selbst besteht aus vier Charakteren: Einzelhändler, Großhändler, Händler und Fabrik. Durch die zeitverzögerte Natur der Logistik können Sie die Systemperspektive verstehen und die Systemgrenzen besser verstehen.
Da es sich um einen mehrstündigen Workshop handelt, möchte ich, dass dieses Bierspiel die folgenden Funktionen erfüllt.
Es ist ein Multiplayer-Spiel.
Beim Bierspiel selbst werden viele Teilnehmer verschiedene Rollen in der Lieferkette spielen, aber ich würde gerne mehrere Lieferketten gleichzeitig konkurrieren lassen, um zu sehen, wer besser abschneidet. So können wir gleichzeitig etwas über ihre Systemstrategien erfahren.
Der Spielhost sollte den Status aller sehen können.
Da mehrere Teams gleichzeitig gegeneinander antreten, muss ich als Gastgeber in der Lage sein, zu sehen, wie jedes Team im Moment Fortschritte macht und punktet.
Der Spielablauf muss einfach und leicht zu kontrollieren sein..
Wie ich zu Beginn sagte, ist dies ein kurzer Workshop, daher muss ich alle schnell auf den neuesten Stand bringen und in der Lage sein, die Details jeder Runde zu kontrollieren.
Darüber hinaus erscheint zu Beginn jeder Runde ein Timer in der Benutzeroberfläche des Spielers, der das Spieltempo durch Herunterzählen erhöht.
Sie können die Charaktere anpassen.
Ein klassisches Bierspiel besteht aus vier Charakteren, aber je mehr Charaktere es sind, desto länger dauert das Spiel. Deshalb möchte ich das Spieltempo so anpassen, dass es besser ist, drei Charaktere zu haben.
Nachdem ich mich umgesehen hatte, stellte ich fest, dass weder Open-Source-Projekte noch Projekte, die bereits online sind, diese Anforderungen perfekt erfüllen können. Also mache ich lieber selbst eins.
https://github.com/wirelessr/beer_game
Host-Benutzeroberfläche
Spieler-Benutzeroberfläche
Das gesamte Projekt wurde geschäftsorientiert entwickelt und mit einer Abdeckung von über 90 % getestet. Sie können es also gerne nutzen.
Erstellen Sie eine Datei für Geheimnisse im Projektordner. Sie sollten sehen, wie ich es in die Docker-Datei kopiere.
.streamlit/secrets.toml
[mongo] uri = "<your mongo connection>" [admin] key = "<your admin key>" [player] key = "<your player key>"
Da dieses Projekt MongoDB verwendet, müssen Sie den Link mit Ihrem Kontopasswort ausfüllen. Darüber hinaus entsprechen admin.key und player.key den Schlüsselfeldern auf der Benutzeroberfläche.
Schließlich lade ich die App in die öffentliche Cloud hoch und benötige daher noch einen grundlegenden Authentifizierungsmechanismus. Wenn Sie nur lokal arbeiten und die Authentifizierung problematisch ist, können Sie den entsprechenden Quellcode entfernen.
Diesem Projekt ist eine Docker-Datei beigefügt, sodass es direkt mit Docker ausgeführt werden kann.
docker build -t beer_game . docker run --rm --name beer -p 8501:8501 beer_game
Für die Entwicklung sollte zusätzlich zu requiremnts.txt auch require-test.txt installiert werden, das die Unit-Tests ausführt. Dann können Sie alle Unit-Tests über das Makefile ausführen.
pip install -r requiremnts.txt pip install -r requirements-test.txt make test
Das gesamte Spiel ist in einen Host-Modus und einen Teilnehmermodus unterteilt, die den Optionen in der oberen Ecke der Benutzeroberfläche entsprechen.
Der Host weist zunächst eine Game_ID zu, um das Spiel zu erstellen, und alle Teilnehmer müssen das Player_Game mit dieser ID ausfüllen.
Alle Spieler in derselben Lieferkette müssen dieselbe Spieler-ID verwenden, daher wird diese ID auch als Lieferketten-ID bezeichnet und Teilnehmer mit derselben Spieler-ID werden durch Spielerrolle in Rollen unterteilt.
Sie können den Status auf dem Bildschirm des Gastgebers sehen, wenn ein Teilnehmer beitritt.
Sehen wir uns an, wie eine vollständige Iteration aus Sicht des Hosts aussehen würde.
Alle Komponenten, die manipuliert werden müssen, sind in diesem Bild zu sehen, und jede Runde beginnt mit dem Klicken auf die Schaltfläche „Aktualisieren“ und endet mit dem Drücken auf „Nächste Woche“.
Wie viele Bestellungen in dieser Runde an alle Lieferketten gesendet werden sollen, wird durch „Bestellung aufgeben“ ausgelöst.
Es ist erwähnenswert, dass die Bestellung selbst idempotent ist. Es ist also kein Problem, die Nummer zu ändern und erneut zu drücken. Die letzte Nummer wird verwendet. Die Platzierungsreihenfolge der Schnittstelle jedes Teilnehmers ist ebenfalls idempotent.
Sobald der Gastgeber die Bestellung aufgegeben hat, kann der Shop-Spieler die Bestellung annehmen.
In ähnlicher Weise beginnt jede Rolle in der Lieferkette mit „Aktualisieren“ und endet mit „Bestellung aufgeben“, wobei der Shop-Spieler die Aktion durchführt, gefolgt vom Einzelhändler-Spieler und so weiter.
Abschließend zurück zum Gastgeber, der erneut auf „Aktualisieren“ klicken kann, um alle Status für die Runde anzuzeigen, und auf „Nächste Woche“, um die Runde zu beenden.
Während der Aktualisierung werden tatsächlich einige Dinge erledigt.
Da „Order platzieren“ idempotent ist, ist auch „Aktualisieren“ selbst idempotent.
Im Grunde erfüllt es jetzt alle meine Bedürfnisse, aber es gibt einige Verbesserungen, die vorgenommen werden könnten.
Obwohl der Gastgeber beispielsweise den Status aller Teilnehmer sehen kann, wäre es hilfreich, ein Diagramm zu haben, das die Veränderung des Inventars und die Kosteninformationen im Laufe der Zeit zeigt, was für die Überprüfung des Spiels nach dem Ende nützlich wäre .
Es gibt auch ein grundlegenderes Problem: Die aktuelle Benutzeroberfläche bietet überhaupt keine Testabdeckung, hauptsächlich weil der aktuelle Spielablauf recht einfach ist. Nur ein paar Klicks auf der Benutzeroberfläche reichen aus, um den gesamten Benutzeroberflächenfluss abzudecken, daher verlasse ich mich nicht so sehr auf automatische Tests. Wenn jedoch eine UI-Änderung vorgenommen wird, ist dies immer noch etwas mühsam, daher wäre es besser, einen UI-Unit-Test durchzuführen.
Insgesamt handelt es sich bei diesen Anforderungen um Optimierungen, deren Fehlen jedoch keinen Einfluss auf die Funktionalität hat.
Wenn Sie weitere Ideen haben, können Sie auch einfach einen Pull-Request einreichen, Beiträge sind willkommen.
Das obige ist der detaillierte Inhalt vonRundenbasiertes Mehrspieler-Bierspiel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!