zoukankan      html  css  js  c++  java
  • 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的雷区。

  • 相关阅读:
    Script to Create Benchmark Procs
    自定义数据类型修改
    需求管理工具试用 – CaliberRM
    标识值重复的原因示例
    Vmware vFabric Suite开始支持自动化部署与PostgreSQL
    在ubuntu上安装Oracle Java SDK
    详解数据中心基础设施的模块化建设
    Xcode 4 无证书真机调试 环境配置
    Calculate_and_Insert_Event_Intervals_in_SQL2005_Profiler
    浏览器工作原理
  • 原文地址:https://www.cnblogs.com/cocode/p/12287662.html
Copyright © 2011-2022 走看看