由于我需要在不久的将来组织一个系统思维研讨会,所以我需要一个啤酒游戏来开始它。
啤酒游戏本身由四个角色组成:零售商、批发商、分销商和工厂。通过物流的时滞性质来理解系统视角,可以更好地理解系统边界。
由于这是一个几个小时的工作坊,我希望这款啤酒游戏能够实现以下功能。
这是一款多人游戏。
啤酒游戏本身会有很多参与者在供应链中扮演不同的角色,但我希望能够有多个供应链同时竞争,看看谁得分更高。这样,我们就可以同时了解到他们的系统策略。
游戏主机应该能够看到每个人的状态。
由于有多个队伍同时参赛,作为主持人我需要能够看到每个队伍目前的进度和得分。
游戏流程必须简单且易于控制节奏。
正如我一开始所说的,这是一个简短的研讨会,所以我需要让每个人快速上手,并且我需要能够控制每一轮的细节。
此外,每轮开始时玩家的用户界面中都会出现一个计时器,通过倒计时来推进游戏节奏。
能够自定义角色。
经典的啤酒游戏由四个角色组成,但角色越多,游戏时间就越长。所以我想调整一下游戏节奏,最好是三个角色。
经过一番查找,发现无论是开源项目还是已经上线的项目都不能完美满足这些需求。所以,我还是自己做一个吧。
https://github.com/wirelessr/beer_game
主机界面
玩家界面
整个项目是业务驱动开发和测试,覆盖率超过90%,请放心使用。
在项目文件夹中创建一个机密文件。您应该看到我将其复制到 Dockerfile 中。
.streamlit/secrets.toml
[mongo] uri = "<your mongo connection>" [admin] key = "<your admin key>" [player] key = "<your 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进行角色划分。
当参与者加入时,您可以在主持人的屏幕上看到状态。
让我们看看从主持人的角度看完整的迭代会是什么样子。
所有需要操作的组件都在这张图中,每一轮都是按刷新按钮开始,按下周结束。
本轮向所有供应链发送多少订单,由下单触发。
值得一提的是,下单本身是幂等的,所以改变数字再按一次就可以了,会使用最后一个数字。每个参与者界面的下单也将是幂等的。
主人下单后,店铺玩家即可接单。
同样,供应链中的每个角色都以“刷新”开始,以“下订单”结束,商店玩家采取行动,然后零售商玩家采取行动,依此类推。
最后,回到主持人,再次按“刷新”即可查看本轮所有状态,按“下周”即可结束本轮。
刷新期间实际完成了几件事。
由于下订单是幂等的,因此刷新本身也是幂等的。
现在基本上满足了我所有的需求,但还有一些改进的地方。
例如,虽然主持人可以看到所有参与者的状态,但如果有一个图表来显示库存和成本信息随时间的变化会很有帮助,这对于比赛结束后回顾比赛很有用.
还有一个更基本的问题:当前的UI根本没有测试覆盖率,主要是因为当前的游戏流程相当简单。只需在 UI 上点击几下即可涵盖所有 UI 流程,因此我不太依赖自动测试。不过如果有UI修改的话,还是会有点繁琐,所以最好有一个UI单元测试。
总的来说,这些要求是优化,但缺少它们并不影响功能。
如果您有其他想法,也可以提交 Pull Request,欢迎贡献。
以上是回合制多人啤酒游戏的详细内容。更多信息请关注PHP中文网其他相关文章!