Drools规则在2个对象共享属性时触发

时间:2012-09-30 10:48:16

标签: java drools rule

所以我只是开始修补Drools并且很享受它,文档(我至少找到的那些部分)很难完全结束。

我正在尝试创建一个规则,当两个对象共享一个属性但似乎无法使条件正确时将触发该规则。如果我正确阅读文档,这应该工作: (是的,我正在使用Magic:The Gathering规则作为游戏的基础,因为我很了解它们)

rule "704.5j. If two or more planeswalkers that share a planeswalker type are on the battlefield, all are put into their owners' graveyards. This is called the 'planeswalker uniqueness rule'."
    when
        $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , $subtype : Types.get(1) , $c1ID : ID );
        $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , Types.contains($subtype) , ID != $c1ID);
    then
        System.out.println("PW Uniqueness: " + $c1.getName() + " | " + $c2.getName());
        $c1.setCurrentZone(ZoneType.Graveyard);
        $c2.setCurrentZone(ZoneType.Graveyard);
end

我是否必须在java方面做这件事?

编辑:此外,非常欢迎Drools的教程/指南建议。

1 个答案:

答案 0 :(得分:0)

如果你没有这个工作,可能会在Then部分中将一个部分移动到IF,以避免在何时声明内容,然后在同一部分中调用它,

rule "704.5j. If two or more planeswalkers that share a planeswalker type are on the battlefield, all are put into their owners' graveyards. This is called the 'planeswalker uniqueness rule'."
when
    $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype : Types.get(1)));
    $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype2 : Types.get(1)) );
then
    if (($subtype == $subtype2) && ($c1.getID() == $c2.getID()))
    {
       System.out.println("PW Uniqueness: " + $c1.getName() + " | " + $c2.getName());
       $c1.setCurrentZone(ZoneType.Graveyard);
       $c2.setCurrentZone(ZoneType.Graveyard);
    }
end

这有点长啰嗦。但我通常避免在When中声明和检查相同的变量,我声明我需要的所有东西(大多数时间使用数组和evals),然后检查Then中的IF语句。

同样正如@Marko所说,首先关闭第一个属性,检查其工作情况,并一次只添加一个检查。有时候,一旦工作,我会使用愚蠢的IF等来制定大规则。我开始降低尺寸。它更容易减少工作量,而不是修复一个小破碎的东西:)