0

したがって、私は Drools をいじり始めたばかりで、楽しんでいますが、ドキュメント (少なくとも私が見つけたビット) は全体的に少し深いものです。

2 つのオブジェクトが 1 つの属性を共有しているが、条件を正しく満たしていないように見える場合に起動するルールを作成しようとしています。ドキュメントを正しく読んでいれば、これでうまくいくはずです: (はい、よく知っているので、Magic:The Gathering のルールを遊びのベースとして使用しています)

ルール「704.5j。プレインズウォーカー タイプを共有するプレインズウォーカーが 2 体以上戦場にある場合、すべてがオーナーの墓地に置かれます。これは、「プレインズウォーカーの一意性ルール」と呼ばれます。」
    いつ
        $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , $subtype : Types.get(1) , $c1ID : ID );
        $c2 : Card (CurrentZone == ZoneType.Battlefield , 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 のチュートリアル/ガイドの提案も大歓迎です。

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 が言ったように、最初の属性を取得し、その動作を確認して、一度に 1 つのチェックを追加するだけです。ときどき、機能したらばかばかしい量の IF などを使用して大きなルールを作成します。私はサイズを下げ始めます。小さな壊れたものを修理するよりも、動いているものを減らす方が簡単です:)

于 2013-04-10T13:54:02.690 に答える