2014-07-13 39 views
0

我嘗試創建一個規則,決定在依賴年齡的遊戲中的獎金。如何管理Drools中規則中的2個參數(包括整數)?

因此,如果玩家的年齡小於16歲並且他在遊戲的第二階段之前,則會給玩家一個30的獎勵。

我的第一個問題是,年齡和階段都是整數。

你能幫我修理規則嗎?

這是我嘗試在DRL文件:

WHEN 
    age < 16 and stage > 2 
Then 
    incrementBonus(30) 

此外,你可以給我如何在Drools中做一些代碼片段?

這裏就是我在我的Java類那樣:

int age = 14; 
int stage = 4; 
knowledgeSession.insert(age); 
knowledgeSession.insert(stage); 
knowledgeSession.fireAllRules(); 

回答

1

請了解的Drools是一個面向對象生產規則系統,因此,你應該考慮使用Java對象(Java的豆)作爲事實。對於你的問題很明顯:

public class Player { 
    private int age; 
    private int stage = 0; 
    private int bonus = 0; 
    public Player(int age){ this.age = age; } 
    // getters and setters 
} 

Player px = new Player(14); 
px.setStage(14); 
knowledgeSession.insert(stage); 

和規則將

rule "calc age/stage bonus" 
when 
    $p: Player(age < 16, stage > 2) 
then 
    modify($p){ setBonus($p.getBonus)() + 30) } 
end 

但會有一個問題:一個事實修改會導致規則的重新評估,因此該規則將被執行過並重新開始。您可以添加規則屬性no-loop,但如果您有其他規則計算類似的獎勵增量,這可能無法解決問題。可能需要跟蹤(在玩家中)所執行的獎金添加。例如,爲每個獎勵類別使用一個字段:

class Player { 
    int bonusAgeStage = 0; 

並執行getBonus作爲所有這些獎勵字段的總和。

現在的規則可以安全地寫爲

rule "calc age/stage bonus" 
when 
    $p: Player(age < 16, stage > 2, bonusAgeStage == 0) 
then 
    modify($p){ setBonusAgeStage(30) } 
end 
+0

在你的答案最重要的一點是,Drools的是對象Oriened。 – Farah