”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 回合制多人啤酒游戏

回合制多人啤酒游戏

发布于2024-11-16
浏览:854

由于我需要在不久的将来组织一个系统思维研讨会,所以我需要一个啤酒游戏来开始它。

啤酒游戏本身由四个角色组成:零售商、批发商、分销商和工厂。通过物流的时滞性质来理解系统视角,可以更好地理解系统边界。

由于这是一个几个小时的研讨会,我希望这款啤酒游戏能够实现以下功能。

这是一款多人游戏

啤酒游戏本身会有很多参与者在供应链中扮演不同的角色,但我希望能够让多个供应链同时竞争,看看谁得分更高。这样,我们就可以同时了解他们的系统策略。

游戏主机应该能够看到每个人的状态

由于有多支队伍同时参赛,作为主持人我需要能够看到每支队伍目前的进展和得分情况。

游戏流程必须简单且易于控制节奏

正如我一开始所说的,这是一个简短的研讨会,所以我需要让每个人快速上手,并且我需要能够控制每一轮的细节。

此外,每轮开始时玩家的UI中都会出现一个计时器,通过倒计时来推进游戏节奏。

可以自定义人物.

经典的啤酒游戏由四个角色组成,但角色越多,游戏时间就越长。所以我想调整一下游戏节奏,最好是三个角色。

经过一番查找,发现无论是开源项目还是已经上线的项目都不能完美满足这些需求。所以,我最好自己做一个。

啤酒游戏项目

https://github.com/wirelessr/beer_game

Turn Based Multiplayer Beer Game
主机用户界面

Turn Based Multiplayer 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进行角色划分。

参会者加入时,您可以在主持人屏幕上看到参会者的状态。
Turn Based Multiplayer Beer Game

让我们从主持人的角度看一下完整的迭代会是什么样子。

Turn Based Multiplayer Beer Game

所有需要操作的组件都在这张图中,每回合按刷新按钮开始,按下周结束。

至于本轮向所有供应链发送多少订单,将由下单触发。

值得一提的是,下单本身是幂等的,所以改变数字再按一次就可以了,会使用最后一个数字。每个参与者界面的下单也将是幂等的。

主人下单后,店铺玩家即可接单。

Turn Based Multiplayer Beer Game

同样,供应链中的每个角色都以“刷新”开始,以“下订单”结束,商店玩家采取行动,然后零售商玩家采取行动,依此类推。

最后回到主持人,再次按“刷新”即可查看本轮所有状态,按“下周”即可结束本轮比赛。

游戏详情

刷新期间实际完成了几件事。

  1. 它根据四个星期前的订单从​​下游补充库存。
  2. 它接收来自上游的订单。
  3. 根据可销售的库存决定销售量。

由于 Place Order 是幂等的,因此 Refresh 本身也是幂等的。

未来的工作

现在基本上满足了我所有的需求,但还有一些改进的地方。

例如,虽然主持人可以看到所有参与者的状态,但如果有一个图表来显示库存和成本信息随时间的变化,这将有助于游戏结束后回顾比赛.

还有一个更基本的问题:当前的UI根本没有测试覆盖率,主要是因为当前的游戏流程相当简单。只需在 UI 上点击几下即可涵盖所有 UI 流程,因此我不太依赖自动测试。不过如果有UI修改的话,还是会有点繁琐,所以最好还是有一个UI单元测试。

总的来说,这些需求是优化,但缺少它们并不影响功能。

如果您有其他想法,也可以提交 Pull Request,欢迎贡献。

版本声明 本文转载于:https://dev.to/lazypro/turn-based-multiplayer-beer-game-3n5k?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-17
  • 您是否应该异步加载脚本以提高站点性能?
    您是否应该异步加载脚本以提高站点性能?
    异步脚本加载以提高网站性能在当今的 Web 开发领域,优化页面加载速度对于用户体验和搜索引擎优化至关重要。提高性能的一种有效技术是异步加载脚本,使浏览器能够与其他页面元素并行下载脚本。传统方法是将脚本标签直接放置在 HTML 文档中,但这种方法常常会造成瓶颈因为浏览器必须等待每个脚本完成加载才能继续...
    编程 发布于2024-11-17
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-17
  • 如何将 Python 日期时间对象转换为自纪元以来的毫秒数?
    如何将 Python 日期时间对象转换为自纪元以来的毫秒数?
    在 Python 中将日期时间对象转换为自纪元以来的毫秒数Python 的 datetime 对象提供了一种稳健的方式来表示日期和时间。但是,某些情况可能需要将 datetime 对象转换为自 UNIX 纪元以来的毫秒数,表示自 1970 年 1 月 1 日协调世界时 (UTC) 午夜以来经过的毫秒...
    编程 发布于2024-11-17
  • 如何在 Python 中使用特定前缀重命名目录中的多个文件
    如何在 Python 中使用特定前缀重命名目录中的多个文件
    使用Python重命名目录中的多个文件当面临重命名目录中文件的任务时,Python提供了一个方便的解决方案。然而,处理错综复杂的文件重命名可能具有挑战性,特别是在处理特定模式匹配时。为了解决这个问题,让我们考虑一个场景,我们需要从文件名中删除前缀“CHEESE_”,例如“CHEESE_CHEESE_...
    编程 发布于2024-11-17
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-17
  • Java中的同步静态方法如何处理线程同步?
    Java中的同步静态方法如何处理线程同步?
    Java 中的同步静态方法:解锁对象类困境Java 文档指出,在同一对象上多次调用同步方法不会交错。但是,当涉及静态方法时会发生什么?静态方法不与具体对象关联,那么synchronized关键字是指对象还是类呢?分解答案根据Java语言规范(8.4.3.6),同步方法在执行之前获取监视器。对于静态方...
    编程 发布于2024-11-16
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-16
  • 如何使用 Python 获取目录中按创建日期排序的文件列表?
    如何使用 Python 获取目录中按创建日期排序的文件列表?
    使用 Python 获取按创建日期排序的目录列表导航目录时,经常需要获取排序后的内容列表根据特定标准,例如创建日期。在Python中,这个任务可以轻松完成。建议方法:为了实现这一点,Python内置的文件系统操作模块和排序功能的组合是受雇。下面的代码片段说明了这个过程:import glob imp...
    编程 发布于2024-11-16
  • 如何在初始页面加载后动态加载 Less.js 规则?
    如何在初始页面加载后动态加载 Less.js 规则?
    动态加载Less.js规则将Less.js合并到网站中可以增强其样式功能。然而,遇到的一个限制是需要在 Less.js 脚本之前加载所有 LESS 样式表。当某些样式需要在初始页面加载后动态加载时,这可能会带来挑战。当前限制目前,Less.js 规定加载外部的顺序样式表和脚本起着至关重要的作用。颠倒...
    编程 发布于2024-11-16
  • 如何在 PHP 中清除浏览器缓存?
    如何在 PHP 中清除浏览器缓存?
    在 PHP 中清除浏览器缓存您可能会遇到需要清除浏览器缓存以强制浏览器重新加载最新版本的情况您的网页。当您开发 Web 应用程序并且希望确保用户看到您所做的最新更改时,这尤其有用。清除浏览器缓存的 PHP 代码要使用PHP清除浏览器缓存,可以使用以下代码:header("Cache-Con...
    编程 发布于2024-11-16
  • 如何在 MySQL PDO 查询中正确使用 LIKE 和 BindParam?
    如何在 MySQL PDO 查询中正确使用 LIKE 和 BindParam?
    在 MySQL PDO 查询中正确使用 LIKE 和 BindParam当尝试在 MySQL PDO 查询中使用 BindParam 执行 LIKE 搜索时,必须使用正确的语法以确保准确的结果。优化语法要使用bindParam匹配以“a”开头的用户名,正确的语法是:$term = "a%&...
    编程 发布于2024-11-16
  • 如何使用 Selenium 和 Python 更改 Chrome 中的用户代理?
    如何使用 Selenium 和 Python 更改 Chrome 中的用户代理?
    使用 Selenium 更改 Chrome 中的用户代理在自动化需要特定浏览器配置的任务时,更改 Chrome 中的用户代理至关重要。这可以通过使用 Selenium 和 Python 来实现。要启用用户代理开关,请修改选项设置:from selenium import webdriver from...
    编程 发布于2024-11-16
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-16
  • .then(function(a){ return a; }) 是 Promises 的 No-Op 吗?
    .then(function(a){ return a; }) 是 Promises 的 No-Op 吗?
    .then(function(a){ return a; }) 是 Promises 的 No-Op 吗?在 Promise 领域,就出现了 .then(function(a){ return a; }) 是否为空操作的问题。让我们阐明这个奇怪的查询:是的,它通常是一个无操作。相关代码接收前一个承诺...
    编程 发布于2024-11-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3