design-patterns - 狼人(社会演绎)游戏的设计模式
问题描述
我正在尝试开发像Werewolf (Mafia)这样的社交推理游戏。
在游戏中,有些角色具有可用和被动的能力。在夜间,玩家可以选择 1 个可用能力并选择 0 个或更多目标。到了晚上,所有异能同时发生,隔天异能结果生效。
可用的能力包括:杀死某人,阻止某人当晚使用某个能力,阻止某人对某人使用任何能力。
被动能力可以免疫任何类型的可用能力。
我正在寻找一种可以防止不同能力之间相互依赖的软件设计模式/架构。
对于(也许)一般性的问题,我很抱歉,但我一直在努力解决这个问题。
解决方案
正如您所提到的,这是一个有趣的问题,也非常笼统。据我了解,黑手党的游戏有玩家,每个玩家都有一个指定的角色,每个角色都有一个或多个能力(通常是 1 个)。能力之间没有必要存在依赖关系。我们可以通过两种方式模拟一个玩家使用他的能力来否定或取代其他玩家的能力的场景:
1) 正确排序能力的执行。例如,具有黑手党角色的玩家可以使用能力杀死特定玩家,假设我们将该玩家标记为等待被杀死。但是在同一天晚上,如果有角色医生的玩家救了同一个玩家,我们可以取消标记要杀死的玩家,从而通过调用医生的救人能力比黑手党的杀戮能力“晚”来否定杀戮能力的效果。
2)如果我们不想按正确的顺序执行技能,或者我们有无法完成排序的场景,那么我们也可以这样做。在一个晚上,能力的集合是有限的,可以有多个相同能力的实例(例如,有 3 名玩家被指定为医生),但即使在这种情况下,能力的总实例(在这种情况下是“拯救”能力)是有限的。现在,Ability 类可以有一个公共方法来使自己暂停。例如,如果某个玩家具有某些特殊角色,该角色具有权力并想要阻止黑手党在当晚杀人的能力,它可以通过调用他想要执行此能力的中央 GameController 类上的方法来调用他的该能力他的。
因此,在上述两种能力建模和执行方式中,能力之间没有依赖关系。基本上这个想法是,一个想要被执行的能力,独立于其他能力,将自己注册到中央游戏控制器。GameController 控制执行并在每晚结束时计算最终游戏状态。
在每晚开始时,可以创建每个能力的新实例。如果有跨夜生存的能力,那么可以这样建模。但无论如何,能力的实例都必须是有限的。
此设计中的一些实体是 Player、Role、Ability、GameController、GameState。
希望这可以帮助!
推荐阅读
- javascript - 如何在 React 中对状态(嵌套属性)进行小幅更新?
- java - 通过xml循环获取元素/节点以更新一个元素
- java - 如何通过 Java 使用 CMD 变量?
- angular - 角度 6 事件不会以形式触发
- nginx - Kubernetes Ingress 前的 Nginx 反向代理
- mysql - 使用存储过程将用户添加到数据库
- gcc - Makefile 没有找到可用文件的规则
- sql - 如何使用 sql 在两行之间搜索来搜索日期时间?
- java - Apache Flink 中的空窗口
- php - 我的 WHILE 循环显示来自 mysql 表的视频不起作用。我错过了什么?