我想将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();
}
答案 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(...)函数。例如。枚举将返回给定状态下游戏的下一个状态。它不会保存对任何游戏状态本身的引用。
就个人而言……将枚举的限制纳入其中是没有意义的。