Java 使用枚举作为有限状态机的博弈人工智能

Java 使用枚举作为有限状态机的博弈人工智能,java,enums,state-machine,finite-state-automaton,Java,Enums,State Machine,Finite State Automaton,我想在一个简单的街头斗士风格的游戏中实现ai,我想用有限状态机来实现这一点。举个简单的例子,此FSM具有以下状态: 攻击、追赶、逃跑 从我在网上读到的内容来看,实现这一点的一个好方法是使用Enum,尽管我对如何实现有点困惑 在任何一点上,FMS处于当前状态,如果在游戏中发生变化,该状态可能会通过下一步的转换功能发生变化。使用下面这样的枚举,如何跟踪当前状态,以及如何在调用下一个函数时进行此更改 public enum FiniteStateAutomata { ATTACKING() {

我想在一个简单的街头斗士风格的游戏中实现ai,我想用有限状态机来实现这一点。举个简单的例子,此FSM具有以下状态:

攻击、追赶、逃跑

从我在网上读到的内容来看,实现这一点的一个好方法是使用Enum,尽管我对如何实现有点困惑

在任何一点上,FMS处于当前状态,如果在游戏中发生变化,该状态可能会通过下一步的转换功能发生变化。使用下面这样的枚举,如何跟踪当前状态,以及如何在调用下一个函数时进行此更改

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


}

最好的解决方案是在枚举中使用函数。就像下一个:

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

当然你可以让它工作,但是你必须把游戏状态作为一个参数传递给下一个…-函数。例如,枚举将返回给定状态下游戏的下一个状态。它不会引用任何游戏状态本身

就我个人而言。。。将enum的局限性纳入其中没有任何意义

我将如何跟踪当前状态,如何才能做到这一点 在调用下一个函数时更改

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


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

FiniteTesteAutomata状态=FiniteTesteAutomata.state

并在需要时进行更改:


这会更适合@Torben我不确定它会,它不会finished@Hdot展示如何使用枚举定义程序中的操作,并演示如何使用功能接口,依我之见,这可能是最好的选择。请参阅: