0

私はJavaでECJを使用しています。私には、同じ頭脳を持ちたいと思っている個人の軍隊があります。

基本的にはGPを使って脳を進化させたいです。ifステートメントには「」や「」、端末には 「」や「」if-on-enemy-territoryや「」などが欲しいです。if-sense-targetgo-homemove-randomlyshoot

ただし、これらのステートメントは完全に実行可能なJavaコードである必要があります。ECJでこれを行うにはどうすればよいですか?

例えば:

「」という名前の端末が欲しいのですがmoveRandom。これを兵士のクラス内でコーディングすると、次のようになります。

private void moveRandomly(SoldierWorld world)
 {
  //..snip.

  int newX = (int)(this.getLocation().x + speed * Math.cos(this.getDirection() * Math.PI / 180.0));
  int newY = (int)(this.getLocation().y - speed * Math.sin(this.getDirection() * Math.PI / 180.0));

  Point newPoint = new Point(newX, newY);
  this.setLocation(newPoint); 
 }

では、このコードを実行する端末を作成するにはどうすればよいですか?

4

1 に答える 1

1

あなたが持っているすべての関数を列挙してから、列挙型に関連付けられた関数を実行する関数セット クラスを作成します。

public class FunctionSet
{
    public enum FuncName
    {
        MOVE_RANDOM,
        SHOOT,
        GO_HOME,
        ...
    }

    public FunctionSet()
    {

    }

    public void Execute(FuncName funcName, Soldier soldier, SoldierWorld world)
    {
        switch(funcName)
        {
            case FuncName.MOVE_RANDOM:
                soldier.moveRandom(world);
                break;
            case FuncName.SHOOT:
                soldier.shoot(...);
                break;
            case FuncName.GO_HOME:
                soldier.goHome(...);
                break;
            default:
                break;
        }
    }
}

したがって、式ツリーのノードには実際の関数は含まれず、列挙型のみが含まれますFuncName...各関数に関連付けられているパラメーターの数を追跡し、それをハッシュに配置するなど、追加の作業が必要になる場合があります地図。

または、リフレクションを使用して、該当するすべての関数名をSoldierクラスから取得し、対応する数のパラメーターを使用してマップに配置することもできます。

于 2010-06-29T20:25:34.903 に答える