这是一台有限状态机吗?

时间:2014-04-24 19:43:48

标签: java 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;
        }
    }
}

这是我的代码。我想为游戏创建一个有限状态机(循环()被连续调用)当我正在阅读FSM时,我意识到它会使我的代码更好。但是,我不认为这是一个正确的实现。有人可以帮我核实一下吗?所有人都非常感激。

2 个答案:

答案 0 :(得分:0)

一种方式:

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 {
    ...
  }
}

答案 1 :(得分:0)

在这种特殊情况下,你可以称之为有限状态机,但你做错了。有限状态机的全部意义在于,下一个状态取决于有限状态机实际处于什么状态,而不是取决于从多个状态中选择一个状态的某些任意条件。 它有效,但绝对不是最好的解决方案。

你可能想做这样的事情:

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

输出: 我在州一 我在州二

您甚至可以按照您在示例中使用它的方式使用它:

private FiniteStateMachine checkState(Condition condition)
{
    if(condition.isTrue())
    {
        return FiniteStateMachine.StateOne;
    }
    return FiniteStateMachine.StateTwo;
}

但请记住,这是不正确的使用方式;

游戏提示:谷歌MVC模式,它可能在游戏开发过程中派上用场。