天天看點

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

掃雷——生成地雷(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;
    }

}
           

運作結果:

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