0

シンプルなストリート ファイター スタイルのゲームに ai を実装したいと考えています。これを有限ステート マシンで実行したいと考えています。簡単な例として、この FSM には次の状態があります。

攻撃・追撃・逃走

私がオンラインで読んだことから、これを実装する良い方法は Enum を使用することですが、これを行う方法が少し混乱しています。

任意の時点で、FMS は現在の状態にあり、ゲームで変更が発生する必要があります。この状態は、遷移関数 (next()) によって変更される可能性があります。以下のような Enum を使用して、現在の状態を追跡するにはどうすればよいですか? また、next() 関数が呼び出されたときにこの変更を行うにはどうすればよいでしょうか?

public enum FiniteStateAutomata {

  ATTACKING() {
    public FiniteStateAutomata next() {
      if (!gun.isInRange()) return CHASING;
      else if (health.isLow()) return FLEEING;
    }

  },
  CHASING() {
    public FiniteStateAutomata next() {
      if (gun.isInRange()) return ATTACKING;
      else if (health.isLow()) return FLEEING;
    }
  },
  FLEEING() {
    public FiniteStateAutomata next() {
      if (health.isHigh()) return CHASING;

    }
  };

  public abstract FiniteStateAutomata next();


}
4

3 に答える 3

0

現在の状態を追跡するにはどうすればよいですか? また、next() 関数が呼び出されたときにこの変更を行うにはどうすればよいでしょうか?

ゲームでは、現在の状態を追跡する必要があります:

FiniteStateAutomata state = FiniteStateAutomata.ATTACKING;

必要に応じて変更します。

state = state.next();
于 2019-01-25T13:38:10.117 に答える
-1

そのための良い解決策は、列挙で関数を使用することです。次のように:

 public enum FiniteStateAutomata {
        ATTACKING((gun, health) -> {
            if (!gun.isInRange()) return CHASING;
            else if (health.isLow()) return FLEEING;
        }),
        CHASING((gun, health) -> {
            if (gun.isInRange()) return ATTACKING;
            else if (health.isLow()) return FLEEING;
        }),
        FLEEING((gun, health) -> {
            if (health.isHigh()) return CHASING;
            else return FLEEING;
        });

        private BiFunction<Gun, Health, FiniteStateAutomata> next;

        FiniteStateAutomata(BiFunction<Gun, Health, FiniteStateAutomata> next) {
            this.next = next;
        }

        public FiniteStateAutomata next(Gun gun, Health health) {
            return next.apply(gun, health);
        }
    }
于 2019-01-25T13:09:12.863 に答える
-1

確かにそれを機能させることはできますが、ゲームの状態をパラメーターとして next(...) 関数に渡す必要があります。たとえば、列挙型は、特定の状態のゲームの次の状態を返します。ゲームの状態自体への参照は保持されません。

個人的には...列挙型の制限をこれに含める意味はありません。

于 2019-01-25T13:09:55.583 に答える