代码来源
https://www.oschina.net/code/snippet_115076_8995MainFrame类
privatevoid initDiamond()初始化方块
初始化每个方格类,与周围的方格建立联系,随机设置十个雷(用HashSet避免产生重复的雷。)
publicvoid launchFrame()初始化方框
设置边框属性,创建两个Panel,mainPanel用来装游戏区域,使用表格格局。statePanel用来装显示剩余雷数的区域。然后为每个方块添加鼠标监听,并将每个方块添加到mainPanel的每个表格里。再将两个Panel添加到Frame窗口中,并设置窗口监听。
内部类public class MymouseListener implements MouseListener
public void mouseClicked(MouseEvent e)鼠标点击
左键点击两下,还原方块颜色(在mousePressed中方块颜色被更改了)并检查该方块周围玩家已标注的雷,若该方块周围原本存在雷的方格都被标注了,则翻开剩下未翻开的方块,翻开过程中检查是否方块周边雷数为0,是则连翻。
左键点击一下,如果不是雷且该方块周围周边雷数为0,则翻开该方块并连翻。如果触雷,则停止计时,并将该方格标记为绿色,其他九个雷的方格标记为蓝色,再弹出游戏结束窗口,并重新开始游戏。
public void mousePressed(MouseEvent e)鼠标按压(当发生鼠标点击事件时,此函数先于mouseClicked(MouseEvent e)发生)
当鼠标左键点击两下时,对该方块周围方块进行颜色变换。
public void mouseReleased(MouseEvent e)鼠标释放
当鼠标释放时,首先检查游戏是否已开始,若未开始则开启定时,并启动进程。
如果点击的是右键,则检查该方格是否已被翻开,没有则检查该方格是否已被标记,再根据显示内容改变其内容和剩余雷数
判断是否胜利(所有原本为雷的方格被标注,且不是雷的方格没有被标注)。如果胜利停止计时并将剩下的方格翻开,并显示胜利窗口并开始新的游戏。
public void run()计时
检查游戏是否开始,开始则计时(将自己休眠一秒)
main()主程序
游戏入口。
Diamond类
publicBoolean change()翻格子
翻开方格,如果是雷返回false,不是雷则显示周围雷数并返回true。
publicint getNearBombNo()附近雷数
求出给方格附近的雷数。
publicDiamond getNearDimaond(int i)得到附近方格
与周围的方格建立连接。若附近无方格则返回null。
publicvoid moveon(Set<Diamond> set)递归连翻
如果翻开的方格周围雷数为0,则进行连翻。连翻即将周围方格自动翻开。注意,这里需要建立一个HashSet来存放已连翻的方格,避免重复翻开格子,进入死循环。因为HashSet是内容不可重复的Set,故使用HashSet。
简单的解析到此结束。如果有错误望大家指出,我会再慢慢改进。
该代码中我也有少部分不理解,如果大家有问题提出来我不懂的,还望大神帮忙解析。