Java 这是一个有限状态机吗?

Java 这是一个有限状态机吗?,java,state,Java,State,这是我的密码。我想为一个游戏创建一个有限状态机(loop()被连续调用),当我阅读FSMs时,我意识到这会使我的代码变得更好。然而,我不认为这是一个正确的实现。有人能帮我核实一下吗?非常感谢所有帮助。单向: public interface State { void processOne(); void processTwo(); void processThree(); } public class AStateImplOne implements State {

这是我的密码。我想为一个游戏创建一个有限状态机(loop()被连续调用),当我阅读FSMs时,我意识到这会使我的代码变得更好。然而,我不认为这是一个正确的实现。有人能帮我核实一下吗?非常感谢所有帮助。

单向:

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