溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java如何實現(xiàn)簡單掃雷程序

發(fā)布時間:2022-06-06 14:01:59 來源:億速云 閱讀:122 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Java如何實現(xiàn)簡單掃雷程序”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

頁面設(shè)置:框架是borderlayout,在上中下加入外面要加入的組件(左邊和右邊不加)。掃雷用的布局是gridlayout即網(wǎng)格布局,與掃雷界面天然契合。

組件:使用panel,button,frame,label等組件,最后集中到frame中形成整體。并對其加入適當(dāng)?shù)谋O(jiān)聽,監(jiān)聽算法的實現(xiàn)如下。

掃雷算法:一共要考慮三種情況,第一種是點到雷的情況,第二種是點到空的格的情況,第三種是點到有數(shù)字的情況。下面我們對這些情況一一進行考慮,完成算法的設(shè)計。首先隨機生成一個掃雷的圖,上面包含有隨機生成的雷,雷旁邊的數(shù)字和空白組成的矩陣matrix,之后所有的監(jiān)聽都依照這個矩陣matrix為參照。

①點到空的時候,調(diào)用遞歸算法尋找旁邊空格(周圍一圈)的將其顯示(這里筆者就是幫他換了一個顏色,即完成了
顯示工作,讀者也可以將點擊的button組件換成label),直到找到是數(shù)字的格就停止對這個方向上的顯示。
②點到數(shù)字的時候,就將格子顯示。
③點到雷的時候,顯示全部matrix中的值,即結(jié)束游戲。

遞歸算法:當(dāng)點擊空白格時,對其周圍一圈的格子進行查找,當(dāng)它是隔空的時候就將它顯示,如果不是就停止對這個格子上的遞歸算法。

參照矩陣matrix的生成:隨機使用random函數(shù)隨機生成1-size(掃雷的規(guī)模)的隨機數(shù),形成雷的橫縱坐標,并加入matrix中,這里的矩陣是string類型的,雷用“*”表示,根據(jù)雷的位置,分別對其周圍的格子上的數(shù)字加1,即形成參照矩陣。

算法的改進:加入菜單欄,實時計時器,改變掃雷游戲規(guī)模,及代碼比較冗余(畢竟完成大于完美),這里為讀者提供一個模板,讀者可以以此參照做進一步修改。

下面是成品的展示圖和源碼:

Java如何實現(xiàn)簡單掃雷程序

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/*
 * 掃雷
 */
 class newJButton extends JButton {
    // 新建組合JButton類
    int axisx;
    int axisy;

    newJButton(String s, int axisx, int axisy) {
        super(s);
        this.axisx = axisx;
        this.axisy = axisy;
    }

    public int getaxisx() {
        return axisx;
    }

    public int getaxisy() {
        return axisy;
    }
}
public class MineTest implements ActionListener {
    // 組件定義
    static final int size = 10; // 掃雷游戲規(guī)模
    int time; // 計算雷的個數(shù)
    JFrame frame = new JFrame("掃雷");
    JPanel panel1 = new JPanel(); // 計時器
    JPanel panel2 = new JPanel(); // 笑臉
    JPanel panel3 = new JPanel(); // 初級掃雷
    newJButton t;
    newJButton t2;
    long programStart = System.currentTimeMillis();
    long programOver;
    String[][] matrix = new String[size][size]; // 掃雷信息記錄矩陣
    newJButton[][] buttons = new newJButton[size][size]; // 創(chuàng)建掃雷按鈕矩陣
    int[][] tip = new int[size][size]; // 判斷是否可以顯示按鈕

    // 提示
    public void inittime() {
        t = new newJButton("進行中", 101, 101);
        t2 = new newJButton("/", 102, 102);
        panel2.add(t);
        panel2.add(t2);
    }

    // 笑臉
    public void initsmile() {
        newJButton b = new newJButton("O", 100, 100); // 將歸零按鍵"O"的坐標設(shè)置為(100,100)
        b.addActionListener(this);
        panel1.add(b);
    }

    // 初級掃雷
    public void initmine() {
        panel3.setLayout(new GridLayout(10, 10, 1, 1));
        // panel3.setSize(250,250);
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                // button.setSize(25,25);
                panel3.add(buttons[i][j]);
            }
        }

    }

    // 總界面的組合
    public void initcombine() {
        frame.setLayout(new BorderLayout());
        frame.add(panel1, BorderLayout.NORTH);
        frame.add(panel2, BorderLayout.CENTER);
        frame.add(panel3, BorderLayout.SOUTH);
        // frame.add(panel4);
    }

    // 掃雷頁面初始化
    MineTest() {

        // 產(chǎn)生按鈕
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                newJButton jb = new newJButton(" ", i, j);
                jb.setBackground(Color.WHITE);
                jb.addActionListener(this);
                buttons[i][j] = jb;
            }
        }

        inittime();
        initsmile();
        initmine();
        initcombine();
        frame.setVisible(true);
        frame.setSize(500, 500);
        frame.setLocation(700, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 可以關(guān)閉
        // frame.pack();

        // 產(chǎn)生size個雷并加入到矩陣中
        do {
            time = 0;
            pmatrix(); // 初始化原始矩陣
            boom(); // 加入雷
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    if (matrix[i][j] == "*") {
                        time = time + 1;
                    }
                }
            }
        } while (time != 10);
        caculate(); // 計算掃雷矩陣中的距離

        // 形成改變顏色的狀態(tài)矩陣
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (matrix[i][j] == "0") {
                    tip[i][j] = 0;
                } else {
                    tip[i][j] = 1;
                }
            }
        }

        // 打印
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println("\n");
        }

    }

    private void pmatrix() {
        // 掃雷矩陣初始化
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                matrix[i][j] = "0";
            }
        }
    }

    private void boom() {
        // 產(chǎn)生炸彈;
        int num = 0;
        while (num < size) {
            int i = (int) (Math.random() * size);
            int j = (int) (Math.random() * size);
            matrix[i][j] = "*";
            num = num + 1;
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 按鈕響應(yīng)事件
        newJButton temp = (newJButton) e.getSource();
        if (temp.getText() == "O") {
            // 產(chǎn)生size個雷并加入到矩陣中
            do {
                time = 0;
                pmatrix(); // 初始化原始矩陣
                boom(); // 加入雷
                for (int i = 0; i < size; i++) {
                    for (int j = 0; j < size; j++) {
                        if (matrix[i][j] == "*") {
                            time = time + 1;
                        }
                    }
                }
            } while (time != 10);
            caculate(); // 計算掃雷矩陣中的距離

            // 形成改變顏色的狀態(tài)矩陣
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    if (matrix[i][j] == "0") {
                        tip[i][j] = 0;
                    } else {
                        tip[i][j] = 1;
                    }
                }
            }

            // 打印
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    System.out.print(matrix[i][j] + " ");
                }
                System.out.println("\n");
            }
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    buttons[i][j].setText(" ");
                    buttons[i][j].setBackground(Color.WHITE);
                }
            }
            t.setLabel("進行中");
            t2.setLabel("/");
            programStart = System.currentTimeMillis();
            // System.out.println("smile");
        } else if (matrix[temp.getaxisx()][temp.getaxisy()] == "*") {
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    if (matrix[i][j] != "0") {
                        buttons[i][j].setText(matrix[i][j]);
                        if (matrix[i][j] == "*") {
                            buttons[i][j].setBackground(Color.RED);
                        }
                    }
                }
            }
            t.setLabel("失敗");
            programOver = System.currentTimeMillis();
            t2.setLabel("" + (programOver - programStart) / 1000 + "s");
        } else if (matrix[temp.getaxisx()][temp.getaxisy()] != "0") {
            buttons[temp.getaxisx()][temp.getaxisy()].setText(matrix[temp.getaxisx()][temp.getaxisy()]);
            buttons[temp.getaxisx()][temp.getaxisy()].setBackground(Color.gray);
        } else if (matrix[temp.getaxisx()][temp.getaxisy()] == "0") {
            digui(temp.getaxisx(), temp.getaxisy());
        }
    }

    private void digui(int i, int j) {
        // 遞歸調(diào)用該函數(shù),處理按鈕是“0”的情況
        if (i == 0 && j == 0) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i, j + 1);
                digui(i + 1, j + 1);
                digui(i + 1, j);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (i == 0 && j == size-1) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i, j - 1);
                digui(i + 1, j - 1);
                digui(i + 1, j);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (i == size-1 && j == 0) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i, j + 1);
                digui(i - 1, j + 1);
                digui(i - 1, j);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (i == size-1 && j == size-1) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i, j - 1);
                digui(i - 1, j - 1);
                digui(i - 1, j);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (i == 0) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i, j - 1);
                digui(i, j + 1);
                digui(i + 1, j - 1);
                digui(i + 1, j);
                digui(i + 1, j + 1);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (j == 0) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i - 1, j);
                digui(i + 1, j);
                digui(i - 1, j + 1);
                digui(i, j + 1);
                digui(i + 1, j + 1);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (i == size-1) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i - 1, j - 1);
                digui(i - 1, j);
                digui(i - 1, j + 1);
                digui(i, j - 1);
                digui(i, j + 1);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else if (j == size-1) {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i - 1, j);
                digui(i + 1, j);
                digui(i - 1, j - 1);
                digui(i - 1, j);
                digui(i - 1, j);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        } else {
            if (tip[i][j] == 0) {
                buttons[i][j].setBackground(Color.gray);
                tip[i][j] = 1;
                digui(i - 1, j - 1);
                digui(i - 1, j);
                digui(i - 1, j + 1);
                digui(i, j - 1);
                digui(i, j + 1);
                digui(i + 1, j - 1);
                digui(i + 1, j);
                digui(i + 1, j + 1);
            } else {
                if (matrix[i][j] == "0") {
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                } else {
                    buttons[i][j].setText(matrix[i][j]);
                    buttons[i][j].setBackground(Color.gray);
                    tip[i][j] = 1;
                }
            }
        }
    }

    public static void main(String[] args) {
        new MineTest();
    }

    private void caculate() {
        // 計算掃雷矩陣中的距離
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (matrix[i][j] == "*") {
                    if (i == 0 && j == 0) {
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i + 1][j + 1] != "*") {
                            matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]));
                        }
                    } else if (i == 9 && j == 0) {
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i - 1][j + 1] != "*") {
                            matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
                        }
                    } else if (i == 0 && j == 9) {
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i + 1][j - 1] != "*") {
                            matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
                        }
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                    } else if (i == 9 && j == 9) {
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i - 1][j - 1] != "*") {
                            matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
                        }
                    } else if (i == 0) {
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
                        }
                        if (matrix[i + 1][j - 1] != "*") {
                            matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
                        }
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i + 1][j + 1] != "*") {
                            matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
                        }
                    } else if (j == 0) {
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i - 1][j + 1] != "*") {
                            matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
                        }
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i + 1][j + 1] != "*") {
                            matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
                        }
                    } else if (i == 9) {
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
                        }
                        if (matrix[i - 1][j - 1] != "*") {
                            matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
                        }
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i - 1][j + 1] != "*") {
                            matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
                        }
                    } else if (j == 9) {
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i - 1][j - 1] != "*") {
                            matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
                        }
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                        if (matrix[i + 1][j - 1] != "*") {
                            matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
                        }
                    } else {
                        if (matrix[i - 1][j - 1] != "*") {
                            matrix[i - 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j - 1]) + 1);
                        }
                        if (matrix[i - 1][j] != "*") {
                            matrix[i - 1][j] = String.valueOf(Integer.parseInt(matrix[i - 1][j]) + 1);
                        }
                        if (matrix[i - 1][j + 1] != "*") {
                            matrix[i - 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i - 1][j + 1]) + 1);
                        }
                        if (matrix[i][j - 1] != "*") {
                            matrix[i][j - 1] = String.valueOf(Integer.parseInt(matrix[i][j - 1]) + 1);
                        }
                        if (matrix[i][j + 1] != "*") {
                            matrix[i][j + 1] = String.valueOf(Integer.parseInt(matrix[i][j + 1]) + 1);
                        }
                        if (matrix[i + 1][j - 1] != "*") {
                            matrix[i + 1][j - 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j - 1]) + 1);
                        }
                        if (matrix[i + 1][j] != "*") {
                            matrix[i + 1][j] = String.valueOf(Integer.parseInt(matrix[i + 1][j]) + 1);
                        }
                        if (matrix[i + 1][j + 1] != "*") {
                            matrix[i + 1][j + 1] = String.valueOf(Integer.parseInt(matrix[i + 1][j + 1]) + 1);
                        }
                    }
                }
            }
        }

    }

}

“Java如何實現(xiàn)簡單掃雷程序”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI