Java 当两个对象共享一个属性时触发的Drools规则

Java 当两个对象共享一个属性时触发的Drools规则,java,drools,rule,Java,Drools,Rule,所以我刚刚开始修补口水,我很享受,但文档(至少我找到了一些)有点深入人心 我试图创建一个规则,当两个对象共享一个属性但似乎无法获得正确的条件时,该规则将触发。如果我阅读的文档是正确的,这应该可以: (是的,我在使用魔法:收集规则作为游戏的基础,因为我很了解它们) 规则“704.5j.如果战场上有两个或两个以上共享同一类型的旅法师,则所有旅法师都将被放置在其所有者的墓地中。这称为‘旅法师唯一性规则’。” 什么时候 $c1:Card(CurrentZone==ZoneType.battlement,

所以我刚刚开始修补口水,我很享受,但文档(至少我找到了一些)有点深入人心

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

规则“704.5j.如果战场上有两个或两个以上共享同一类型的旅法师,则所有旅法师都将被放置在其所有者的墓地中。这称为‘旅法师唯一性规则’。” 什么时候 $c1:Card(CurrentZone==ZoneType.battlement,Types.contains(“旅法师”),$subtype:Types.get(1),$c1ID:ID); $c2:Card(CurrentZone==ZoneType.battlement,Types.contains(“旅法师”),Types.contains($subtype),ID!=$c1ID); 然后 System.out.println(“PW唯一性:+$c1.getName()+“|”+$c2.getName()); $c1.setCurrentZone(ZoneType.Graveyard); $c2.setCurrentZone(ZoneType.Graveyard); 结束 我必须在java方面这样做吗


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

如果您还没有做到这一点,可以在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 stations


同样正如@Marko所说的,取下第一个属性,检查它的工作情况,然后一次只添加一个检查。有时我会用愚蠢的IFs等建立大的规则。我开始缩小尺寸。减少一个工作部件比修复一个小的损坏部件更容易:)

旁注:您的示例很难阅读,因为您没有遵循Java命名约定<代码>类型在我看来就像一个
枚举
类,但实际上是
的属性。否则,您的示例看起来不错,问题可能在于您在Java端实现某些东西的方式,或者您设置知识的方式。你有什么错误吗?看起来没问题。把它简化为尽可能简单的东西,让它发挥作用,然后逐步完善规则。对不起,马尔科,我将相应地修改未来的代码片段。:)我将从头开始再试一次。拉维,不,一切都很好。
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