所以我只是开始修补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的教程/指南建议。
答案 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等来制定大规则。我开始降低尺寸。它更容易减少工作量,而不是修复一个小破碎的东西:)