14

はじめに:ルールエンジン、ルールの作成、ルールのモデリング、ルールのデータ構造の実装などの経験はありません。したがって、私は自分が何をしているのか、または以下で試みたことがベースから大きく外れているかどうかはわかりません。

次の架空のシナリオを保存して処理する方法を理解しようとしています。私の問題を単純化するために、ユーザーがオブジェクトを購入するタイプのゲームがあり、1000の可能なオブジェクトが存在する可能性があり、オブジェクトは指定された順序で特定のグループでのみ購入する必要があるとします。たとえば、私がユーザーであり、オブジェクトFを購入したいとします。オブジェクトFを購入する前に、以前にオブジェクトA OR(B AND C)を購入している必要があります。FとAを同時に購入することも、FとB、Cを購入することもできません。それらは、ルールで指定された順序である必要があります。最初に、次にFを後で。または、最初にB、C、次にFを実行します。私は今のところ、購入間の期間やユーザーの他の特性については気にかけていません。ただ、それらが今のところ正しい順序であるということだけです。

購入するオブジェクトのルールを読み取って、ユーザーの以前の購入履歴と照合できる、潜在的に数千のオブジェクトについてこの情報を保存するための最良の方法は何ですか?

私はこれを試みましたが、A OR(B AND C)などのグループ化を実装しようとして立ち往生しています。これらのテーブルがあるデータベースにルールを保存したいと思います。

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

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

しかし、明らかに、グループ化せずに結果を処理すると、間違った答えが得られます。可能であれば、過度の文字列解析は避けたいと思います:)。1つのオブジェクトには、以前に必要な購入の数が不明である可能性があります。ルールを処理するためのSQLまたは擬似コードスニペットをいただければ幸いです。:)

4

3 に答える 3

5

あなたの問題は、特定の条件が満たされているかどうかをテストすることに分かれているようです。

複合条件があります。したがって、アイテムのテーブルが与えられます:

ID_アイテムの説明
----------------------
1A         
2B         
3C         
4階         

可能なアクションの表が与えられます:

ID_Action VerbID ItemID ConditionID
--------------------------------------------
1 購入 4 1

条件の表を作成します。

ID_Condition VerbA ObjectA_ID Boolean VerbB ObjectB_ID
-------------------------------------------------- -------------------
1 が 1 を所有するか、条件 2 を満たす
2 所有者 2 および所有者 3

したがって、OWNS は ID が Items テーブルのキーであることを意味し、MEETS_CONDITION は ID が Conditions テーブルのキーであることを意味します。

これはあなたを制限するためのものではありません。クエストなどを含む他のテーブルを追加し、動詞を追加してどこを見ればよいかを伝えることができます。または、クエストを完了したらアイテム テーブルに入れ、完了したクエストを特定のバッジを所有していると解釈します。その後、同じコードでアイテムとクエストの両方を処理できます。

于 2009-12-14T20:21:16.007 に答える
0

これは非常に複雑な問題で、私には答える資格がありませんが、多くの参考文献を見てきました。根本的な問題は、ゲーム、クエスト、アイテム、およびさまざまなオブジェクトの「統計」が、非関係の依存関係を持つ可能性があることです。このスレッドは大いに役立つかもしれません

このトピックに関する本を何冊か手に取り、LUA をルール プロセッサとして使用する方法を調べてみてください。

于 2009-12-14T19:53:11.067 に答える
-1

個人的には、SQL ではなくコードでこれを行います。各項目は、インターフェイスを実装する独自のクラス (IItem など) である必要があります。IItem には、そのアイテムを購入してもよいかどうかを判断する OkToPurchase というメソッドがあります。これを行うには、作成可能なルールのコレクション (HasPreviouslyPurchased(x)、CurrentlyOwns(x) など) の 1 つ以上を使用します。

良い点は、既存のロジックをすべて壊すことなく、新しいルールでこのアプローチを簡単に拡張できることです。

ここにいくつかの擬似コードがあります:

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 に答える