您好,登錄后才能下訂單哦!
本篇內容介紹了“Java如何實現簡單掃雷程序”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
頁面設置:框架是borderlayout,在上中下加入外面要加入的組件(左邊和右邊不加)。掃雷用的布局是gridlayout即網格布局,與掃雷界面天然契合。
組件:使用panel,button,frame,label等組件,最后集中到frame中形成整體。并對其加入適當的監聽,監聽算法的實現如下。
掃雷算法:一共要考慮三種情況,第一種是點到雷的情況,第二種是點到空的格的情況,第三種是點到有數字的情況。下面我們對這些情況一一進行考慮,完成算法的設計。首先隨機生成一個掃雷的圖,上面包含有隨機生成的雷,雷旁邊的數字和空白組成的矩陣matrix,之后所有的監聽都依照這個矩陣matrix為參照。
①點到空的時候,調用遞歸算法尋找旁邊空格(周圍一圈)的將其顯示(這里筆者就是幫他換了一個顏色,即完成了
顯示工作,讀者也可以將點擊的button組件換成label),直到找到是數字的格就停止對這個方向上的顯示。
②點到數字的時候,就將格子顯示。
③點到雷的時候,顯示全部matrix中的值,即結束游戲。
遞歸算法:當點擊空白格時,對其周圍一圈的格子進行查找,當它是隔空的時候就將它顯示,如果不是就停止對這個格子上的遞歸算法。
參照矩陣matrix的生成:隨機使用random函數隨機生成1-size(掃雷的規模)的隨機數,形成雷的橫縱坐標,并加入matrix中,這里的矩陣是string類型的,雷用“*”表示,根據雷的位置,分別對其周圍的格子上的數字加1,即形成參照矩陣。
算法的改進:加入菜單欄,實時計時器,改變掃雷游戲規模,及代碼比較冗余(畢竟完成大于完美),這里為讀者提供一個模板,讀者可以以此參照做進一步修改。
下面是成品的展示圖和源碼:
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; // 掃雷游戲規模 int time; // 計算雷的個數 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]; // 創建掃雷按鈕矩陣 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"的坐標設置為(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() { // 產生按鈕 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); // 可以關閉 // frame.pack(); // 產生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(); // 計算掃雷矩陣中的距離 // 形成改變顏色的狀態矩陣 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() { // 產生炸彈; 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) { // 按鈕響應事件 newJButton temp = (newJButton) e.getSource(); if (temp.getText() == "O") { // 產生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(); // 計算掃雷矩陣中的距離 // 形成改變顏色的狀態矩陣 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) { // 遞歸調用該函數,處理按鈕是“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如何實現簡單掃雷程序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。