由於我需要在不久的將來組織一個系統思維研討會,所以我需要一個啤酒遊戲來開始它。
啤酒遊戲本身由四個角色組成:零售商、批發商、經銷商和工廠。透過物流的時滯性質來理解系統視角,可以更好地理解系統邊界。
由於這是一個幾個小時的研討會,我希望這款啤酒遊戲能夠實現以下功能。
這是一款多人遊戲。
啤酒遊戲本身會有很多參與者在供應鏈中扮演不同的角色,但我希望能夠讓多個供應鏈同時競爭,看看誰得分更高。這樣,我們就可以同時了解他們的系統策略。
遊戲主機應該能夠看到每個人的狀態。
由於有多隊同時參賽,身為主持人我需要能夠看到每支隊伍目前的進展和得分情況。
遊戲流程必須簡單且易於控制節奏。
正如我一開始所說的,這是一個簡短的研討會,所以我需要讓每個人快速上手,並且我需要能夠控制每一輪的細節。
此外,玩家在每輪開始時的UI中都會出現一個計時器,透過倒數計時來推進遊戲節奏。
可以自訂人物.
經典的啤酒遊戲由四個角色組成,但角色越多,遊戲時間就越長。所以我想調整一下遊戲節奏,最好是三個角色。
經過一番查找,發現無論是開源專案或是已經上線的專案都無法完美滿足這些需求。所以,我最好自己做一個。
https://github.com/wirelessr/beer_game
主機使用者介面
播放器使用者介面
整個專案是業務驅動開發和測試,覆蓋率超過90%,請放心使用。
在專案資料夾中建立一個機密文件。您應該看到我將其複製到 Dockerfile 中。
.streamlit/secrets.toml
[mongo] uri = "" [admin] key = " " [player] key = " "
由於該項目使用MongoDB,因此您必須在連結中填寫您的帳戶密碼。另外,admin.key和player.key對應UI上的關鍵欄位。
畢竟我是將應用程式上傳到公有雲,所以我仍然需要一個基本的身份驗證機制。如果您僅在本地運行並且覺得身份驗證很麻煩,您可以刪除相應的原始程式碼。
該專案附加了Dockerfile,因此可以直接使用docker運行。
docker build -t beer_game . docker run --rm --name beer -p 8501:8501 beer_game
對於開發,除了requiremnts.txt之外,還應該安裝運行單元測試的requirements-test.txt。然後你可以透過Makefile來執行所有的單元測試。
pip install -r requiremnts.txt pip install -r requirements-test.txt make test
整個遊戲分為主持人模式和參與者模式,分別對應UI右上角的選項。
主持人創作遊戲時先分配一個game_id,所有參與者都要用這個id填入player_game。
同一供應鏈上的所有玩家需要使用相同的player_id,因此這個id也稱為供應鏈ID,具有相同player_id的參與者透過player_role進行角色劃分。
當參加者加入時,您可以在主持人畫面上看到與會者的狀態。
讓我們從主持人的角度看完整的迭代會是什麼樣子。
所有需要操作的元件都在這張圖中,每回合按刷新按鈕開始,按下週結束。
至於本輪向所有供應鏈發送多少訂單,將由下單觸發。
值得一提的是,下單本身是冪等的,所以改變數字再按一次就可以了,會使用最後一個數字。每個參與者介面的下單也將是冪等的。
主人下單後,店舖玩家即可接單。
同樣,供應鏈中的每個角色都以「刷新」開始,以「下訂單」結束,商店玩家採取行動,然後零售商玩家採取行動,依此類推。
最後回到主持人,再次按下「刷新」即可查看本輪所有狀態,按「下週」即可結束本輪比賽。
刷新期間實際完成了幾件事。
由於 Place Order 是冪等的,因此 Refresh 本身也是冪等的。
現在基本上滿足了我所有的需求,但還有一些改進的地方。
例如,雖然主持人可以看到所有參與者的狀態,但如果有一個圖表來顯示庫存和成本資訊隨時間的變化,這將有助於遊戲結束後回顧比賽.
還有一個更基本的問題:目前的UI根本沒有測試覆蓋率,主要是因為目前的遊戲流程相當簡單。只需在 UI 上點擊幾下即可涵蓋所有 UI 流程,因此我不太依賴自動測試。不過如果有UI修改的話,還是會有點繁瑣,所以最好還是有一個UI單元測試。
總的來說,這些需求是優化,但缺少它們並不影響功能。
如果您有其他想法,您也可以提交 Pull Request,歡迎貢獻。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3