掃雷——生成地雷(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 = ; // 提示數字
public SaoLei(int rows, int columns, int count) {
this.rows = rows> ? : rows; // 最大24行
this.columns = columns> ? : columns; // 最大30列
this.count = count;
// 布置地雷
run();
// 輸出
// printRes();
}
public void run(){
data = new int[this.rows+][this.columns+];
// 地雷
putMines();
// 數字
putNumber();
}
// 輸出結果
public void printRes(){
for (int i = ; i < data.length; i++) {
for (int j = ; j < data[i].length; j++) {
switch (data[i][j]) {
case -:
System.out.print("*");
break;
case -:
System.out.print("~");
break;
default:
System.out.print(data[i][j]);
break;
}
System.out.print(" ");
}
System.out.println();
}
}
// 設定提示數字
public void putNumber(){
for (int i = ; i < data.length; i++) {
for (int j = ; j < data[i].length; j++) {
if(data[i][j]==){
judge(i,j);
data[i][j] = tipNum== ? : tipNum;
}
}
}
// 将所有0變為-2
for (int i = ; i < data.length; i++) {
for (int j = ; j < data[i].length; j++) {
data[i][j] = data[i][j]== ? - : data[i][j];
}
}
}
// 布置地雷,count-->地雷數,随機生成數為0則布置一顆地雷,data中-1存放
public void putMines(){
int t_count = ;
while(t_count < count){
for (int i = ; i <= rows; i++) {
for (int j = ; j <= columns; j++) {
if(data[i][j]== && (int)(Math.random()*(Math.sqrt(rows)*columns))== && judge(i,j)){
data[i][j] = -;
t_count++;
}
if(t_count == count) return;
}
}
}
}
// 判斷不符合地雷布置的清況,-1為雷;并計算提示數字
public boolean judge(int r, int j){
boolean flag = false;
tipNum = ;
// up
if(r->=){
if(data[r-][j]!=-){ flag = true; }
else tipNum++;
}
// left
if(j->=){
if(data[r][j-]!=-){ flag = true; }
else tipNum++;
}
// down
if(r+<=this.rows){
if(data[r+][j]!=-){ flag = true;}
else tipNum++;
}
// right
if(j+<=this.columns){
if(data[r][j+]!=-){ flag = true; }
else tipNum++;
}
// left+up
if(r->= && j->=){
if(data[r-][j-]!=-){ flag = true; }
else tipNum++;
}
// left+down
if(r+<=this.rows && j->=){
if(data[r+][j-]!=-){ flag = true; }
else tipNum++;
}
// right+up
if(r->= && j+<=this.columns){
if(data[r-][j+]!=-){ flag = true; }
else tipNum++;
}
// right+down
if(r+<=this.rows && j+<=this.columns){
if(data[r+][j+]!=-){ flag = true; }
else tipNum++;
}
return flag;
}
}
運作結果: