简体   繁体   English

这将是有限状态机吗?

[英]Would this be a Finite State Machine?

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

This is my code. 这是我的代码。 I want to create a finite state machine for a game (loop() is continuously called) and whilst I was reading up on FSMs I realised that it would make my code much better. 我想为一个游戏创建一个有限状态机(不断调用loop()),当我阅读FSM时,我意识到这将使我的代码变得更好。 However, I don't think this is a correct implementation on one. 但是,我认为这不是一个正确的实现。 Could someone please verify for me? 有人可以帮我验证一下吗? All help much appreciated. 所有帮助,不胜感激。

One way: 单程:

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

In that special case you may call it finite state machine, but you are doing it wrong. 在这种特殊情况下,您可以将其称为有限状态机,但是这样做是错误的。 The whole point of finite state machines is that the next state depends on in what state the finite state machine is actually at, not on some arbitrary condition that chooses one state out of many. 有限状态机的全部要点是,下一个状态取决于有限状态机实际处于哪种状态,而不是取决于从多个状态中选择一个状态的任意条件。 It works, but definitely it is not the best solution. 它有效,但是绝对不是最佳解决方案。

You probably wanted to do something like this: 您可能想做这样的事情:

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

And that's how it works: 这就是它的工作方式:

public static void main(final String[] args)
{
    FiniteStateMachine state = FiniteStateMachine.StateOne;
    state.processOne();
    state = state.nextState(true);
    state.processOne();
}

Output: I am in the state One I am in the state Two 输出:我处于状态一我处于状态二

You can even use it the way you have used it in your example: 您甚至可以像在示例中一样使用它:

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

But remember it is incorrect way of using it; 但是请记住,这是错误的使用方式;

Tip for game: Google MVC pattern, it might come in handy during game developement. 游戏提示:Google MVC模式,在游戏开发过程中可能会派上用场。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM