我想尝试创建一个状态机,但我对编程很新。我读了一些关于状态转换表的内容,如果输入内容,可以在状态之间切换。我不太明白它是如何工作的以及它如何转换为Java代码。有人可以解释一下吗?
答案 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
来跟踪状态,但它可以很容易地跟踪int
或String
或Object
州。当然,这是一个令人难以置信的简化示例。
状态机通常使用状态转换映射(或表)跟踪哪些状态转换是可能的(我没有做过),它告诉程序它是否可以或应该从一种状态转换到另一种状态。
状态图的一个非常简单的例子可能是只有线性进展到你的状态,即在上面的例子中只能从家到工作,工作到商店,然后再回来而不能直接从商店到家,或反之亦然。跟踪这个可能相当简单,因为您可以将状态放在一个数组中,并检查用户想要去的地方是否高于或低于数组中的当前状态。
我希望这会有所帮助。
答案 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}}语句链。但是这个概念应该基于上方。