从概念上讲,人们如何制定游戏的规则/约束(不是图形/物理)引擎


16

我想制作一个类似于自己选择冒险书籍的简单游戏。向玩家显示一个叙述文字,并从一系列可能性中选择其动作。反过来,这导致了新的叙述性文本无穷大。唯一要注意的是,根据先前的某些决定,可能性列表可能会有所不同。

乍一看,这听起来像是if-else语句的负载,因此暗示规则引擎将就位。但是,对我来说,这听起来也像是一台有限状态机。

我打算用Java或Groovy编写。目前,我对概念性问题更感兴趣,即应该如何在广义上进行操作(无论如何,人们如何实施国际象棋或纸牌游戏?),但也欢迎在特定库中提供一些建议。

显然,标题中的“游戏引擎”不是指碰撞检测或其他物理/图形力学,而是决定玩家给出的情况及其当前状态的选择的逻辑。


1
这个问题更适合gamedev吗?
Uwe Plonus

2
@Uwe Plonus认为了这一点,但我不这么认为。我的问题纯粹是概念性的,与图形库,3D和主导游戏开发的其他主题无关。试想一下,这个问题与游戏本身无关...但是不确定如何更好地为其命名。
kaqqao

棋牌游戏是非常的冒险不同。
鹿猎人(

1
您的问题似乎也涵盖了专家系统开发。每次选择的答案都会限制后续问题和可能的诊断的范围。也许这就是寻找更多“输入”的原因?
Marjan Venema

Answers:


7

根据您在评论中所说的,这就是我的处理方式:

将故事实现为有限状态机,但要有所作为。每个州是故事的一页,每个过渡是从一页到另一页的链接。但是每个过渡也都有条件。条件可以为空,在这种情况下,“过渡”始终显示为可用选项,但如果不存在,则必须在页面显示时对它们进行评估,如果评估返回False,则过渡不会显示。

您可以通过两种基本方式来实现条件。首先是在游戏内部设置一个成熟的脚本引擎,然后“条件”如下所示return player.inventory.contains(GUN)。最初设置起来比较复杂,但是允许使用更高级的脚本。

第二个是将可能的条件硬编码到某种对象中。它可能有一个RequiredItem字段,如果该字段有值,则检查是否满足条件。该系统更易于设置。它限制了您可以执行的功能远超过脚本编写,但是如果您不需要脚本引擎提供的灵活性,则可能更容易使用。


1
实际上,我们在完全与游戏无关的网络应用中使用了类似的方法。用户具有多个州,并且可以用代码触发任何数量的事件,其中预设了许多事件以将用户从一个州转换到另一个州。我认为对于所描述问题的情况,使用某种基本的脚本语言(或像Python / Lua这样的完整脚本语言)来定义条件/触发器也将有所帮助。
Katana314 2013年

我相当喜欢这种方法。谢谢!将会进一步调查。您有机会知道有用的图书馆吗?
kaqqao

@veggen:不,对不起。不是Java开发人员。
梅森惠勒

@MasonWheeler:您如何看待拉撒路
罗伯特·哈维

1
由于此问题已成为今天的热门问题列表,因此我将报告说,我完全按照我在上一条评论中所说的那样实施了此问题。我做了一个不错的DSL并亲自实现了FSM逻辑,因为它真的非常简单。对解决方案再满意不过了。@MasonWheeler再次感谢您的宝贵建议!
kaqqao 2015年

5

我认为答案就在标题中:您需要一个规则引擎。如果您打算使用Java编写应用程序,那么您当然可以按照Gilbert Le Blanc的建议编写自己的应用程序,或者您可能想看看规则引擎Drools

玩家给出了什么选择以及当前的状态

实际上,使用Drools或任何其他规则引擎,您可以定义一个参数化的情况,该情况输出可能的操作列表。您可以编码简单的规则,例如:

  • 播放器位于pageX:

    • 选择1:标题:“向左走”,动作:“第45页”
    • 选择2:标题:“正确”,操作:“ page56”
    • 如果玩家拥有火球法杖,那么选择3:标题“发射火球”,动作:“ page32”
    • 如果玩家的感知技能为10,则选择4:标题“检查墙上的文字”,动作:“ page67”

Drools的有趣之处在于,您可以将所有规则编码为Excel文件,然后在游戏开始时,让Drools读取该文件。之后,所有内容都已存储在内存中,您只需要考虑用户界面。

以下是一些资源,可帮助您开始使用Drools:


一般而言-寻找在您喜欢的任何规则引擎中实现的Rete算法。
鹿猎人(

是的,Drools是我开始的事情之一。我必须进行更多调查,以查看一次是否只能评估一个规则包,因为这对我而言很重要。谢谢!
kaqqao

@veggen很高兴为您提供帮助!
Jalayn


2

从概念上讲,您的游戏非常简单。在psudeocode中,它看起来像这样:

while not at end of adventure story
    display text
    get response

现在,将所有文本链接在一起以使它从一个动作流到下一个动作是困难的部分。您可以使用关系数据库。您可以使用一棵树。

在不知道您要使用哪种计算机语言的情况下,要变得更加具体是有点困难的。自从您提到Java之后,我将更倾向于树结构。

创建一个包含一个响应和一个文本类链接的响应类。

创建一个文本类,其中包含冒险文本,以及一个响应列表,作为响应类的实例。

编辑以回答评论:

您不会基于此模型进行任何计算。在您的示例中,树看起来像这样,其中T是文本,A是一个动作选择:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

是的,文本有些重复,但是通过遵循这一链条,未来的行动可以考虑过去的决定。这是一个巨大的决策树。


我的问题是计算可能的响应。过去的决定会影响当前的选择。因此,如果出现“您偶然发现了一名死警官”的玩家选择了“偷他的手枪”而不是“不要触摸任何东西”,那么除了“像生气”,如果他们以前没有买枪,那将是唯一的选择。
kaqqao

@veggen:请参阅更新的答案。
吉尔伯特·勒布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.