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);
}
}
}
扫雷游戏(按钮面板)
最新推荐文章于 2025-09-12 18:08:49 发布