14

前言:我没有规则引擎、构建规则、建模规则、为规则实现数据结构等方面的经验。因此,我不知道我在做什么,或者我在下面尝试的内容是否离谱。

我试图弄清楚如何存储和处理以下假设场景。为了简化我的问题,假设我有一种游戏,其中用户购买了一个对象,其中可能有 1000 个可能的对象,并且对象必须以指定的顺序购买,并且只能在某些组中购买。例如,假设我是用户,我想购买对象 F。在我购买对象 F 之前,我必须之前购买了对象 A OR (B AND C)。我不能同时购买 F 和 A,也不能同时购买 F 和 B、C。它们必须按照规则指定的顺序排列。先是A,然后是F。或者,首先是 B,C,然后是 F。我现在不关心购买之间的时间跨度或用户的任何其他特征,只是它们现在是正确的顺序。

为潜在的数千个对象存储此信息的最佳方法是什么,让我可以读取所购买对象的规则,然后将其与用户之前的购买历史记录进行核对?

我已经尝试过了,但是我一直在尝试实现诸如 A OR (B AND C) 之类的分组。我想将规则存储在我有这些表的数据库中:

 Objects
    (ID(int),Description(char)) 

ObjectPurchRules
    (ObjectID(int),ReqirementObjectID(int),OperatorRule(char),Sequence(int)) 

但很明显,当你处理结果时,如果没有分组,你会得到错误的答案。如果可能的话,我想避免过多的字符串解析:)。一个对象可能有未知数量的先前所需购买。用于处理规则的 SQL 或伪代码片段将不胜感激。:)

4

3 回答 3

5

您的问题似乎分解为测试是否满足特定条件。

您将有复合条件。所以给定一个项目表:

ID_项目描述
----------------------
1个         
2乙         
3℃         
4楼         

并给出一个可能的行动表:

ID_Action VerbID ItemID ConditionID
--------------------------------------
1 买 4 1

我们构建一个条件表:

ID_Condition VerbA ObjectA_ID Boolean VerbB ObjectB_ID
-------------------------------------------------- ------------------
1 拥有 1 或 MEETS_CONDITION 2
2 拥有 2 和拥有 3

所以OWNS表示id是Items表的key,MEETS_CONDITION表示id是Conditions表的key。

这并不是要限制你。您可以添加其他带有任务或其他内容的表格,并添加额外的动词来告诉您在哪里查看。或者,只需在完成任务时将任务放入您的项目表中,然后将完成的任务解释为拥有特定的徽章。然后,您可以使用相同的代码处理项目和任务。

于 2009-12-14T20:21:16.007 回答
0

这是一个非常复杂的问题,我没有资格回答,但我已经看到很多参考资料。根本问题是,对于游戏、任务和物品以及各种对象的“统计”可能具有非关系依赖关系。这个线程可能对你有很大帮助

您可能想阅读几本关于该主题的书籍,并研究使用 LUA 作为规则处理器。

于 2009-12-14T19:53:11.067 回答
-1

就我个人而言,我会在代码中执行此操作,而不是在 SQL 中。每个项目都应该是其自己的实现接口的类(即 IItem)。IItem 将有一个名为 OkToPurchase 的方法来确定是否可以购买该项目。为此,它将使用您可以构建的一个或多个规则集合(即 HasPreviousPurchased(x)、CurrentlyOwns(x) 等)。

好处是很容易用新规则扩展这种方法,而不会破坏所有现有的逻辑。

这是一些伪代码:

bool OkToPurchase()
{
   if( HasPreviouslyPurchased('x') && !CurrentlyOwns('y') )
       return true;
   else
       return false;
}

bool HasPreviouslyPurchased( item )
{
    return purchases.contains( item )
}

bool CurrentlyOwns( item )
{
    return user.Items.contains( item )
}
于 2009-12-14T20:36:44.240 回答