0

所以我刚刚开始修补 Drools 并且很享受它,艰难的文档(至少我找到的部分)有点深奥。

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

规则“704.5j。如果战场上有两个或更多具有相同鹏洛客类别的鹏洛客,则所有这些都被放入其拥有者的坟墓场。这称为‘鹏洛客唯一性规则’。”
    什么时候
        $c1 : 卡片 (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);
    然后
        System.out.println("密码唯一性:" + $c1.getName() + " | " + $c2.getName());
        $c1.setCurrentZone(ZoneType.Graveyard);
        $c2.setCurrentZone(ZoneType.Graveyard);
结尾

我必须在Java方面这样做吗?

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

4

1 回答 1

0

如果你还没有得到这个工作,也许将一个部分移动到 Then 部分中的一个 IF 以避免在 when 中声明内容然后在同一部分中调用它,

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 中声明和检查相同的变量,我声明了我需要的所有内容(大多数时候使用数组和 eval),然后检查 Then 中的 IF 语句。

同样正如@Marko 所说,获取第一个属性,检查它的工作情况,一次只添加一个检查。有时我会使用愚蠢数量的 IF 等建立大规则,一旦它起作用。我开始缩小尺寸。减少一个工作的东西,比修理一个小破碎的东西更容易:)

于 2013-04-10T13:54:02.690 回答