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