模拟扫雷--Java控制台操作(一)

xiaoxiao2021-02-28  56

扫雷——生成地雷(Java)

描述:生成地雷图,保存在int型二维数组中,-2表示灰色区域,-1表示地雷,数字1~8表示提示数字,用于说明数字周围的地雷数。输出中‘~’表示灰色区域,‘*’表示地雷,数字1~8表示提示数字。

说明:通过新建对象传递参数输入行、列、地雷数,其中最大行不超过24,最大列不超过30,地雷数根据行列的数学关系限制。结果可调用 printRes()函数查看。

注:该结果仅作后台判断使用!

源代码:

/** * 布置地雷 * 输出:*(-1)-->地雷 (~)-2-->灰色区域 1~8-->提示数字 * * 与SaoLei2相配,主函数中调用new SaoLei2(); * * @author lixiang * */ public class SaoLei { public int rows; // 行 public int columns; // 列 public int count; // 地雷数 public int[][] data; // 存放数据信息 static int tipNum = 0; // 提示数字 public SaoLei(int rows, int columns, int count) { this.rows = rows>24 ? 24 : rows; // 最大24行 this.columns = columns>30 ? 30 : columns; // 最大30列 this.count = count; // 布置地雷 run(); // 输出 // printRes(); } public void run(){ data = new int[this.rows+1][this.columns+1]; // 地雷 putMines(); // 数字 putNumber(); } // 输出结果 public void printRes(){ for (int i = 1; i < data.length; i++) { for (int j = 1; j < data[i].length; j++) { switch (data[i][j]) { case -1: System.out.print("*"); break; case -2: System.out.print("~"); break; default: System.out.print(data[i][j]); break; } System.out.print(" "); } System.out.println(); } } // 设置提示数字 public void putNumber(){ for (int i = 1; i < data.length; i++) { for (int j = 1; j < data[i].length; j++) { if(data[i][j]==0){ judge(i,j); data[i][j] = tipNum==0 ? 0 : tipNum; } } } // 将所有0变为-2 for (int i = 1; i < data.length; i++) { for (int j = 1; j < data[i].length; j++) { data[i][j] = data[i][j]==0 ? -2 : data[i][j]; } } } // 布置地雷,count-->地雷数,随机生成数为0则布置一颗地雷,data中-1存放 public void putMines(){ int t_count = 0; while(t_count < count){ for (int i = 1; i <= rows; i++) { for (int j = 1; j <= columns; j++) { if(data[i][j]==0 && (int)(Math.random()*(Math.sqrt(rows)*columns))==0 && judge(i,j)){ data[i][j] = -1; t_count++; } if(t_count == count) return; } } } } // 判断不符合地雷布置的清况,-1为雷;并计算提示数字 public boolean judge(int r, int j){ boolean flag = false; tipNum = 0; // up if(r-1>=0){ if(data[r-1][j]!=-1){ flag = true; } else tipNum++; } // left if(j-1>=0){ if(data[r][j-1]!=-1){ flag = true; } else tipNum++; } // down if(r+1<=this.rows){ if(data[r+1][j]!=-1){ flag = true;} else tipNum++; } // right if(j+1<=this.columns){ if(data[r][j+1]!=-1){ flag = true; } else tipNum++; } // left+up if(r-1>=0 && j-1>=0){ if(data[r-1][j-1]!=-1){ flag = true; } else tipNum++; } // left+down if(r+1<=this.rows && j-1>=0){ if(data[r+1][j-1]!=-1){ flag = true; } else tipNum++; } // right+up if(r-1>=0 && j+1<=this.columns){ if(data[r-1][j+1]!=-1){ flag = true; } else tipNum++; } // right+down if(r+1<=this.rows && j+1<=this.columns){ if(data[r+1][j+1]!=-1){ flag = true; } else tipNum++; } return flag; } }

运行结果:

转载请注明原文地址: https://www.6miu.com/read-44856.html

最新回复(0)