请了解的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