图形用户界面(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经典扫雷带界面完整版