• 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的雷区。

  • 相关阅读:
    如何输出高精度时间差
    GetThreadTimes获取其它线程cpu时间
    12-Python基础之类与面向对象
    10-Python函数之递归
    09-Python基础之内置函数与匿名函数
    08-Python基础之迭代器与生成器
    07-Python基础之装饰器
    06-Python基础之函数进阶(嵌套,作用域)
    05-Python基础之函数基础
    04-Python基础之文件操作基础
  • 原文地址:https://www.cnblogs.com/cocode/p/12287662.html
Copyright © 2020-2023  润新知