Java 这是一个有限状态机吗?
这是我的密码。我想为一个游戏创建一个有限状态机(loop()被连续调用),当我阅读FSMs时,我意识到这会使我的代码变得更好。然而,我不认为这是一个正确的实现。有人能帮我核实一下吗?非常感谢所有帮助。单向:Java 这是一个有限状态机吗?,java,state,Java,State,这是我的密码。我想为一个游戏创建一个有限状态机(loop()被连续调用),当我阅读FSMs时,我意识到这会使我的代码变得更好。然而,我不认为这是一个正确的实现。有人能帮我核实一下吗?非常感谢所有帮助。单向: public interface State { void processOne(); void processTwo(); void processThree(); } public class AStateImplOne implements State {
public interface State {
void processOne();
void processTwo();
void processThree();
}
public class AStateImplOne implements State {
@Override
public void processOne() {
doStuff();
}
@Override
public void processTwo() {
doStuff();
}
@Override
public void processThree() {
doStuff();
}
private void doStuff() {}
}
public class AStateImplTwo implements State {
@Override
public void processOne() {
doStuff();
}
@Override
public void processTwo() {
doStuff();
}
@Override
public void processThree() {
doStuff();
}
private void doStuff() {}
}
public class StateMachine {
private State one = new AStateImplOne();
private State two = new AStateImplTwo();
private State state;
public int loop() {
checkState();
state.processOne();
state.processTwo();
state.processThree();
return 0;
}
private void checkState() {
if (condition) {
state = one;
} else {
state = two;
}
}
}
在这种特殊情况下,你可以称之为有限状态机,但你做得不对。有限状态机的全部意义在于,下一个状态取决于有限状态机实际处于何种状态,而不是取决于从多个状态中选择一个状态的任意条件。 这是可行的,但肯定不是最好的解决方案 你可能想做这样的事情:
interface State {
abstract void process(int d);
}
class Machine {
State state;
class State1 implements State {
process(int d) {
switch(d) {
case 1: ...; state=...; break;
case 2: ...; state=...; break;
}
}
}
class State2 implements State {
...
}
}
这就是它的工作原理:
public enum FiniteStateMachine
{
StateOne
{
@Override
public void processOne()
{
System.out.print("I am in the state One\n");
}
@Override
public FiniteStateMachine nextState(final boolean condition)
{
if(condition)
{
return StateTwo;
}
return StateOne;
}
},
StateTwo
{
@Override
public void processOne()
{
System.out.print("I am in the state Two\n");
}
@Override
public FiniteStateMachine nextState(final boolean condition)
{
if(condition)
{
return StateOne;
}
return StateTwo;
}
};
abstract public void processOne();
abstract public FiniteStateMachine nextState(final boolean condition);
}
输出:
我在一号州
我在第二州
您甚至可以按照您在示例中使用的方式使用它:
public static void main(final String[] args)
{
FiniteStateMachine state = FiniteStateMachine.StateOne;
state.processOne();
state = state.nextState(true);
state.processOne();
}
但请记住,这是不正确的使用方法
游戏提示:谷歌MVC模式,在游戏开发过程中可能会派上用场 通常,“dostuff”函数能够改变机器的状态。而这个
循环过程非常奇怪。从给定状态执行的操作通常取决于输入或类似的内容。这取决于,乍一看,这不像是一个正式的自动机,但实际上它可能会发挥神奇的作用。但是,这在很大程度上取决于doStuff
的实现和调用循环的方法,因此很难说。我想这是技术上的原因,因为每次通过循环时都会采取不同的操作,这些操作会因某种状态变量的不同而不同。但对于FSM来说,它是一种奇怪的结构,如@dfeuer。基本的FSM方法是:(1)设置初始状态,(2)根据状态采取行动,产生(可能)新状态并重复。FSM通常可以使用表示状态转换的有限状态值表来驱动。
private FiniteStateMachine checkState(Condition condition)
{
if(condition.isTrue())
{
return FiniteStateMachine.StateOne;
}
return FiniteStateMachine.StateTwo;
}