Java扫雷游戏: JMine

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);
}

胜利检测

胜利需满足如下条件:

  1. 所有地雷都被标记。
  2. 所有非地雷都不被标记。
  3. 所有非地雷被探测。

总结

这个版本的扫雷还原度还是蛮高的。唯一有些遗憾的是只能设置10x10的雷区。

原文地址:https://www.cnblogs.com/cocode/p/12287662.html