当前位置: 首页 > 面试题库 >

如何在Java中创建简单的状态机

夹谷烨赫
2023-03-14
问题内容

我目前正在学习Java,并且想知道如何以OO方式控制状态。我实现了一个Pong应用程序。如果我想要多个状态,例如游戏性和菜单状态,并且这些状态中的每个状态都必须执行启动,停止和运行,我将如何实现此目标以及如何在这些状态之间进行切换。

我知道我可以简单地添加一个大的switch语句,但是实现这一点的最佳方法是什么?

我希望能够在游戏状态下切换到菜单状态,反之亦然。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Pong extends Applet implements Runnable, KeyListener{

    public void start ()
    {
        setSize(screen);
        setFocusable(true);
        Thread th = new Thread (this);
        th.start ();
    }

    public void stop()
    {
    }
    //Etc..
}

问题答案:

您可以使用枚举来模拟基本的FSM(有限状态机):

public enum State {

    ONE {
        @Override
        public Set<State> possibleFollowUps() {
            return EnumSet.of(TWO, THREE);
        }
    },

    TWO {
        @Override
        public Set<State> possibleFollowUps() {
            return EnumSet.of(THREE);
        }
    },

    THREE // final state

    ;
    public Set<State> possibleFollowUps() {
        return EnumSet.noneOf(State.class);
    }

}

如果事情变得更复杂,则生成该代码的代码将非常冗长,但令人高兴的是,您可以获得编译时安全性,线程安全性和高性能。



 类似资料:
  • 问题内容: 我有很多网址,并且想实现自动补全功能。我不喜欢朴素方法的复杂性,因为它与设置大小成线性关系: 现在我知道在哈希集中,函数“ contains()”在“ O(1)”中有效,但是没有“ containsPrefix()”。是否有一种简单的方法,而无需使用像Lucene这样的大库或自己编写代码?我这样做没有问题,但对于这样一个简单的问题似乎有点过头了,所以我想知道是否存在现有的简单解决方案:

  • 本文向大家介绍iOS 如何使用UIBezierPath创建简单的形状,包括了iOS 如何使用UIBezierPath创建简单的形状的使用技巧和注意事项,需要的朋友参考一下 示例 对于一个简单的圈子: 迅速: 对于一个简单的矩形: 迅速: 对于简单的一行: 迅速: 半圈: 迅速: 对于一个简单的三角形: 迅速:            

  • 我正试图创建一个代理服务器,将请求从客户端传递到第三方网站(比如谷歌)。我的代理只需要将传入请求镜像到目标站点上相应的路径,因此如果我的客户端请求的url为: 应提供以下资源: 以下是我想出来的: 它可以很好地处理html页面,但是对于其他类型的文件,它只是返回一个空白页面或目标站点的一些错误消息(这在不同的站点中有所不同)。

  • 问题内容: 我正在尝试创建一个代理服务器,以将请求从客户端传递到第三方网站(例如google)。我的代理只需将传入请求镜像到目标站点上的相应路径,因此,如果我的客户请求的url为: 应提供以下资源: 这是我想出的: 它适用于html页面,但对于其他类型的文件,它仅返回空白页面或来自目标站点的错误消息(在不同站点中有所不同)。 问题答案: 我认为处理从第三方服务器收到的响应不是一个好主意。这只会增加

  • 问题内容: 我正在寻找与JavaScript相同的效果。 我今天下午使用Twisted.web编写了一个基于Web的简单解释器。您基本上是通过表单提交Python代码块的,客户端来抓取并执行它。我希望能够发出一个简单的弹出消息,而不必每次都重写一堆样板wxPython或TkInter代码(因为该代码通过表单提交然后消失了)。 我尝试过tkMessageBox: 但这会在后台用tk图标打开另一个窗口

  • 问题内容: 是否可以在Java中动态创建新变量。 因此,如果两次调用了新方法,是否应该向该类中新添加2个新变量? 可能吗? 问题答案: 否。您是否考虑过在课程中存储“ a ”?映射中的键将是“变量名”,映射中的值将是逻辑变量名。 如果您可以提供有关您要实现的目标的更多信息(从高角度来看),那将有所帮助。