状态转换表如何工作?

时间:2013-11-29 13:01:51

标签: java state transition state-machine

我想尝试创建一个状态机,但我对编程很新。我读了一些关于状态转换表的内容,如果输入内容,可以在状态之间切换。我不太明白它是如何工作的以及它如何转换为Java代码。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

状态机是指跟踪相对于用户输入的状态的程序。

  

我希望能够输入一个字符串然后编程给出一个   消息和状态的变化。例如:“做工作”,程序   说:“开始工作”并改变状态。过了一会儿,它说“做完了   与工作“和国家改变回来。有点像一个非常小的   游戏

使用评论中的示例,我们可以做类似的事情;

import java.util.Scanner;

enum GoingState {
   TO_HOME,
   TO_WORK,
   TO_SHOP, 
}

public class StateGame{

    public static GoingState state = GoingState.TO_WORK;

    public static void main(String args[]){
        Scanner scanIn = new Scanner(System.in);
        System.out.println("Where do you want to go?");
        if(scanIn.nextLine().toLowerCase().contains("home")){
            state = GoingState.TO_HOME;
            System.out.println("Going home.");
        }
        else if(scanIn.nextLine().toLowerCase().contains("work")){
            state = GoingState.TO_WORK;
            System.out.println("Going to work.");
        }
        else if(scanIn.nextLine().toLowerCase().contains("shop")){
            state = GoingState.TO_SHOP;
            System.out.println("Going to the shop.");
        }
        else{
            System.out.println("No valid input");
        }
    }
}

在上面的示例中,我使用enum来跟踪状态,但它可以很容易地跟踪intStringObject州。当然,这是一个令人难以置信的简化示例。

状态机通常使用状态转换映射(或表)跟踪哪些状态转换是可能的(我没有做过),它告诉程序它是否可以或应该从一种状态转换到另一种状态。

状态图的一个非常简单的例子可能是只有线性进展到你的状态,即在上面的例子中只能从家到工作,工作到商店,然后再回来而不能直接从商店到家,或反之亦然。跟踪这个可能相当简单,因为您可以将状态放在一个数组中,并检查用户想要去的地方是否高于或低于数组中的当前状态。

我希望这会有所帮助。

答案 1 :(得分:0)

它实际上不是一台机器。在最简单的情况下,它是一个只有一个名为state的整数变量的程序。程序读取一个整数输入,并根据输入和状态的当前值,设置一个新的状态值。

if (state == 0 && input == 0) {
    state = 1;
}
if (state == 1 && input == 1) {
    state = 2;
}
if (state == 2 && input == 2) {
    state = 3;
}
if (state == 3 && input == 4) {
    state = 4;
}
if (state == 4 && input == 8) {
    state = 5;
}
// many more such statements to cover all combinations of state and input values

您可以使用if,或者更复杂的类层次结构或switch-case等,而不是enum这么长的{{1}}语句链。但是这个概念应该基于上方。