package cleanMine; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JPanel; /** * 显示所有按钮的面板 * * @author Administrator * */ public class AllButtonPanel extends JPanel implements ActionListener { private int row;// 行数 private int col;// 列数 private int mineCount;// 地雷数 private MineButton[][] allButtons;// 所有按钮 public AllButtonPanel(int row, int col, int mineCount) { this.row = row; this.col = col; this.mineCount = mineCount; allButtons = new MineButton[row][col]; createButtons(); createMine(); init(); } private void init() { this.setLayout(new GridLayout(row, col)); for (int i = 0; i < allButtons.length; i++) { for (int j = 0; j < allButtons[i].length; j++) { this.add(allButtons[i][j]); } } } /** * 随机布雷的方法 * */ private void createMine() { int n = 0; while (n < mineCount) {// 随机生成mineCount个地雷 int i = (int) (Math.random() * row); int j = (int) (Math.random() * col); if (allButtons[i][j].getCountOfSurroundMines() != -1) { allButtons[i][j].setCountOfSurroundMines(-1); n++; } } for (int i = 0; i < allButtons.length; i++) {// 计算每个位置的周围地雷数 for (int j = 0; j < allButtons[i].length; j++) { if (allButtons[i][j].getCountOfSurroundMines() != -1) { allButtons[i][j] .setCountOfSurroundMines(getSurroundMineCount(i, j)); } } } } /** * 统计(i,j)坐标周围8个位置的地雷数 * * @param data * @param i * @param j * @return */ private int getSurroundMineCount(int i, int j) { int num = 0;// 统计周围的雷数 if (i - 1 >= 0 && j - 1 >= 0) { num += (allButtons[i - 1][j - 1].getCountOfSurroundMines() == -1 ? 1 : 0); } if (i - 1 >= 0) { num += (allButtons[i - 1][j].getCountOfSurroundMines() == -1 ? 1 : 0); } if (i - 1 >= 0 && j + 1 < allButtons[0].length) { num += (allButtons[i - 1][j + 1].getCountOfSurroundMines() == -1 ? 1 : 0); } if (j - 1 >= 0) { num += (allButtons[i][j - 1].getCountOfSurroundMines() == -1 ? 1 : 0); } if (j + 1 < allButtons[0].length) { num += (allButtons[i][j + 1].getCountOfSurroundMines() == -1 ? 1 : 0); } if (i + 1 < allButtons.length && j - 1 >= 0) { num += (allButtons[i + 1][j - 1].getCountOfSurroundMines() == -1 ? 1 : 0); } if (i + 1 < allButtons.length) { num += (allButtons[i + 1][j].getCountOfSurroundMines() == -1 ? 1 : 0); } if (i + 1 < allButtons.length && j + 1 < allButtons[0].length) { num += (allButtons[i + 1][j + 1].getCountOfSurroundMines() == -1 ? 1 : 0); } return num; } /** * 生成按钮 * */ private void createButtons() { for (int i = 0; i < allButtons.length; i++) { for (int j = 0; j < allButtons[i].length; j++) { allButtons[i][j] = new MineButton(i, j); allButtons[i][j].setSize(6, 6); allButtons[i][j].addActionListener(this);// 添加点击事件监听 allButtons[i][j].addMouseListener(new MouseAdapter() {// 添加鼠标右键事件监听 public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { int remain = Integer .parseInt(CleanMine.remainMine .getText()); JButton b = (JButton) e.getSource(); if (b.getText().equals("")) { remain--; CleanMine.remainMine.setText(remain + ""); b.setText("&"); } else if (b.getText().equals("&")) { remain++; CleanMine.remainMine.setText(remain + ""); b.setText(""); } } } }); } } } public void actionPerformed(ActionEvent e) {// 点击事件监听的方法 MineButton b = (MineButton) e.getSource(); int r = b.getRow(); int c = b.getCol(); if (allButtons[r][c].getCountOfSurroundMines() == -1) {// 如果是地雷 for (int i = 0; i < allButtons.length; i++) {// 把所有按钮都显示出来 for (int j = 0; j < allButtons[i].length; j++) { if (allButtons[i][j].getCountOfSurroundMines() == -1) {// 如果该位置是地雷 allButtons[i][j].setText("{1}quot;); } else if (allButtons[i][j].getCountOfSurroundMines() == 0) {// 如果该位置为空(该位置不是地雷,周围8个位置也没有地雷) allButtons[i][j].setText(""); allButtons[i][j].setBackground(Color.CYAN); } else {// 如果该位置不是地雷,但周围8个位置中有地雷 allButtons[i][j].setText(allButtons[i][j] .getCountOfSurroundMines() + ""); allButtons[i][j].setBackground(Color.CYAN); } } } } else {// 如果不是地雷 showEmpty(r, c);// 执行排空操作 } } /** * 排空方法,若(i,j)位置为空,则显示空白。然后依次递归找它周围的8个位置。 * * @param data * @param i * @param j */ private void showEmpty(int i, int j) { MineButton b = allButtons[i][j]; if (b.isCleared()) { return; } if (allButtons[i][j].getCountOfSurroundMines() == 0) { b.setBackground(Color.CYAN); b.setCleared(true); if (i - 1 >= 0 && j - 1 >= 0) { showEmpty(i - 1, j - 1); } if (i - 1 >= 0) { showEmpty(i - 1, j); } if (i - 1 >= 0 && j + 1 < allButtons[0].length) { showEmpty(i - 1, j + 1); } if (j - 1 >= 0) { showEmpty(i, j - 1); } if (j + 1 < allButtons[0].length) { showEmpty(i, j + 1); } if (i + 1 < allButtons.length && j - 1 >= 0) { showEmpty(i + 1, j - 1); } if (i + 1 < allButtons.length) { showEmpty(i + 1, j); } if (i + 1 < allButtons.length && j + 1 < allButtons[0].length) { showEmpty(i + 1, j + 1); } } else if (allButtons[i][j].getCountOfSurroundMines() > 0) { b.setText(allButtons[i][j].getCountOfSurroundMines() + ""); b.setBackground(Color.CYAN); b.setCleared(true); } } }