最终话讨论的是前面几个部分的整合问题,以及游戏如何初始化和重新初始化。 整合问题: 采用内部类。 起初没有使用内部类,Mine(实体类)类生成了地雷表和标记表,MyLabel(界面类)类监听到了各种点击事件后,将改变信息通过set*方法传给MyPanel(控制类),MyPanel类又通过各种set*方法修改地雷表和标记表。数据间的传递异常的麻烦,再加上重新初始化出现了一些问题。最后放弃了,改为使用内部类。 在内部类里维持了两张表和一个心跳线程。 两张表是指地雷表和标记表。地雷表由Mine生成,且只能由Mine修改,但是其他的类可以读取数据。标记表也是由Mine生成的,但是MyLabel类可以修改之。 判胜和判负分别在MyLabel对象和MyPanel对象来负责。简而言之——如果一个有地雷的Label被点开就算输,而只有所有的地雷都被标记了才算胜利。 我们在玩家每点击一次Label进行一次判胜与判负。(很可笑的是,我之前竟然自己写了一个监听的线程来监听点击事件做一些判胜与判负的标记,真的是浪费ATP) 心跳线程指的是前面说的时间“伪动画”的线程。在游戏重启的时候犯了很严重的错误。想要在重启游戏的时候关闭线程并重新启动。最终也没有找到方法(用已经过时的stop不算)。后来发现,重启时间只需要将表示时间的变量初始化就OK了,不应该终止并重启该线程,而应该使用一些标记来控制它(或许这也不是必要的)。 当想通了这里后,重新初始化的问题也就解决了。 先说初始化: 其实就是简单地创建了几个对象,然后为几个公共变量赋初始值。 initPanel(); //初始化主面板 initMine(); //初始化生成地雷数组及标记数组 initMusic(); //载入音乐 initMouse(); //修改鼠标的图标 initTime(); //初始化时间伪动画 initButton(); //初始化开始和退出按钮 showRestMine(); //显示剩余的可用标记数量 当玩家点击开始按钮的时候,游戏重新初始化。 重新初始化不需要重新创建新的对象,而仅仅是将初始化过程中的初始化了的变量值重新赋成初始值。(现在说来感觉非常容易,但是之前编程的时候,很自然地在想如何消灭掉对象,然后重新创建对象) 希望上面的话能对您理解程序或者写程序有所帮助。有不明白的请看前面的博客。 对了,还有一点比较重要的事情,就是添加背景。或许是我真的很白痴吧。我之前把背景设置在最底层的Panel上,然后其上的各种控件都setOpaque(false);可是始终都没有用。其实呢,应该将背景设置在最表层的下一层,最表层设置为setOpaque(false);就可以了。 游戏的jar文件已经上传,欢迎试玩。 最终版的源代码呢?希望您能用来学习,而不是抄袭。 并且真心的希望能对你有所帮助!(我上传的源代码没有资源,资源在Game.jar包中,您只用解压缩就可以获得资源了)。