【Java学习日志3.31】经典扫雷带界面完整版

图形用户界面(GUI)的实现是用Java自带的两个包awt和swing,

扫雷的实现用了四个类

一. ClearMineMap

用于存储底层的数据 运行他可以在控制台显示布雷的数据

package clearmine;

import java.util.Random;

public class ClearMineMap {
	int rows; // 行数
	int cols; // 列数
	int level; // 等级
	int mineCount = 0; // 雷数
	int [][] mineMap = null; // 扫雷地图
	
	/**
	 * 初始化扫雷方法
	 * @param level 等级
	 */
	public void init(int level) {
		switch(level) {
		case 1:
			rows = 9;
			cols = 9;
			mineCount = 10;
			break;
		case 2:
			rows = 16;
			cols = 16;
			mineCount = 40;
			break;
		case 3:
			rows = 16;
			cols = 30;
			mineCount = 99;
			break;
		}
		mineMap = new int[rows][cols];
		burnMine();
	}
	/**
	 * 重置扫雷地图的方法
	 */
	public void reset() {
		for (int i = 0; i < rows; ++i) {
			for (int j = 0; j < rows; ++j) {
				mineMap[i][j] = 0;
			}
		}
	}
	/**
	 * 布雷的方法,循环布雷->随机生成两个数,构成一个点的坐标,判断这个坐标位置有无雷,有雷则换个位置
	 * 如果没有雷,则布雷,然后剩余雷数-1,该位置周围8个位置雷数加一
	 * 存方式一个格子有三类信息要存,我们采用二进制的方法存储
	 * int整形有32位我们取后7位即可
	 * 最后一位存储是否有雷 0表示无雷,1表示有雷 val & 0b1 = 1(有雷等于1)
	 * 倒数第二第三存储这个位置的打开状态 00-未打开,01-打开 ,10-插旗,11-问号 val & 0b110(=0b000表示未打开)
	 * 倒数4、5、6、7表示周围雷数 0b1111000 >>>3右移三位表示雷数    0b0000000+0b1000表示周围雷数加一
	 * @param args
	 */
	public void burnMine() {
		Random rd = new Random();
		int x, y;
		for(int i = 0; i < mineCount;) {
			x = rd.nextInt(rows);
			y = rd.nextInt(cols);
			
			if((mineMap[x][y] & 0b1) == 1) {// 说明这个地方已经有雷了
				continue;
			}
			
			mineMap[x][y] = 0b1; //直接布雷
			
			// 周围8个位置雷数加1
			if(x - 1 >= 0) { // 说明上面还有一行
				mineMap[x - 1][y] += 0b1000;
				if (y - 1 >= 0) {
					mineMap[x - 1][y - 1] += 0b1000;
				}
				if(y + 1 < cols) { // 右上方 + 1 
					mineMap[x - 1][y + 1] += 0b1000;
				}
			}
			if(x + 1 < rows) { // 说明下面还有一行
				mineMap[x + 1][y] += 0b1000;
				if (y - 1 >= 0) {
					mineMap[x + 1][y - 1] += 0b1000;
				}
				if(y + 1 < cols) { 
					mineMap[x + 1][y + 1] += 0b1000;
				}
			}
			
			if (y - 1 >= 0) {
					mineMap[x][y - 1] += 0b1000;
			}
			if(y + 1 < cols) { 
					mineMap[x][y + 1] += 0b1000;
			}
			
			++i;
		}
	}
	/**
	 * 显示地图的方法
	 */
	public void showMap() {
		for(int []arrs : mineMap) {
			for(int num : arrs) {
				if((num & 0b1) == 1) {
					System.out.print("A  ");
				}else {
					if((num >> 3) == 0) {
						System.out.print("   ");
					}else {
						System.out.print((num >>> 3) + "  ");
					}
				}
			}
			System.out.println("\n");
		}
	}
	public static void main(String[] args) {
		ClearMineMap cmm = new ClearMineMap();
		cmm.init(1);
		cmm.showMap();
	}

}

 二 ClearMine

显示界面的逻辑层, 和ClearMineMap的关系为关联关系,获取ClearMineMap的数据转化成图形界面

三 MyMouseListener

时刻监听鼠标点击事件,和ClearMine的关系为关联关系,设计逻辑每次点击改变ClearMine.mineMap[][]的值

四 Startgame

程序主入口,用于启动带图形化界面的main

package clearmine;

public class StartGame {

	public static void main(String[] args) {
		ClearMine cm = new ClearMine();
		cm.init(1);
		cm.create();
	}

}

运行效果:

 

 

 

完整代码:Java经典扫雷带界面完整版

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值