JMine是用Java和Swing编写的扫雷程序。作者是Jerry Shen(火鸟),代码有一定年头了,最开始是作者的课程设计。阅读这种小程序对编程语言的学习挺有帮助。本文只简单介绍一些关键的地方,实现细节可直接参考源代码。项目地址:https://gitee.com/jerryshensjf/JMine
界面设计
游戏的主界面分为菜单、控制面板、雷区三个部分。控制面板左右是两个计数器,分别显示地雷数量和时间。中间的笑脸是一个按钮,点击笑脸会张开嘴,可以重开一局游戏。
bTest = new JButton(faceIcon[0]); bTest.addMouseListener(this); bTest.setPressedIcon(faceIcon[1]);
public void mouseClicked(MouseEvent e) { if (e.getSource() == bTest) { setNewGame(numMine); return; } ...
雷区是10x10的方阵,左键扫雷,右键插旗子。格子上可以显示数字、旗子、问号等信息。
public class JMineButton extends JButton { private int col; private int row; private int flag = 0; private boolean clickFlag = false; ...
可以看到虽然界面和交互比较简单,但有很多需要自定义的控件。
游戏规则
介绍几处重要的规则和细节。
地图生成
在地图上随机设置地雷的位置,需要注意第一个点击的位置一定没有地雷,地雷如果出现在这个地方需要跳过。
while (i < mineNum) { col = (int)(Math.random()*100)%10; row = (int)(Math.random()*100)%10; if (mine[col][row]==0 && (row!=Outrow || col!=Outcol || Outrow==10 )) { mine[row][col]=9; i++; } }
递归消除
如果一个格子周围都没有地雷,即为空白方格,则自动探索并点亮周边的空白方格。这个算法可递归调用checkMine
自身实现。
if (mine.mine[i][j] == 0 && mineButton[i][j].getClickFlag() == false) { mineButton[i][j].setClickFlag(true); showLabel(i, j); for (int ii = i - 1; ii <= i + 1; ii++) for (int jj = j - 1; jj <= j + 1; jj++) checkMine(ii, jj); }
胜利检测
胜利需满足如下条件:
- 所有地雷都被标记。
- 所有非地雷都不被标记。
- 所有非地雷被探测。
总结
这个版本的扫雷还原度还是蛮高的。唯一有些遗憾的是只能设置10x10的雷区。
来源:https://www.cnblogs.com/cocode/p/12287662.html