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时,我意识到它会使我的代码更好。但是,我不认为这是一个正确的实现。有人可以帮我核实一下吗?所有人都非常感激。
答案 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模式,它可能在游戏开发过程中派上用场。