Game Ai使用Enum作为有限状态机

时间:2019-01-25 12:58:32

标签: java enums state-machine finite-state-automaton

我想将ai实施到一个简单的街头霸王风格的游戏中,并且我想使用有限状态机来实现。举一个简单的例子,该FSM具有以下状态:

攻击,追逐,逃跑

根据我在网上阅读的内容,实现此目的的一种好方法是使用枚举,尽管我对此有点困惑。

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();


}

3 个答案:

答案 0 :(得分:0)

  

我将如何跟踪当前状态,以及如何做到这一点   更改next()函数的时间?

在游戏中,您需要跟踪当前状态:

FiniteStateAutomata state = FiniteStateAutomata.ATTACKING;

并在需要时进行更改:

state = state.next();

答案 1 :(得分:-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);
        }
    }

答案 2 :(得分:-1)

当然可以使它起作用,但是您必须将游戏状态作为参数传递给next(...)函数。例如。枚举将返回给定状态下游戏的下一个状态。它不会保存对任何游戏状态本身的引用。

就个人而言……将枚举的限制纳入其中是没有意义的。