package cleanmine;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* 显示所有按钮的面板
*/
public class AllButtonPanel extends JPanel {
private static final long serialVersionUID = 2425456124245L;
public static final String cleanMineView = "^_^";
public static final String mineView = "@";
private int row;// 行数
private int col;// 列数
private int mineCount;// 地雷数
private int clearMineCount;
private MineButton[][] allButtons;// 所有按钮
public AllButtonPanel(int row, int col, int mineCount) {
clearMineCount = 0;
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].addMouseListener(new MouseAdapter() {
// 鼠标单击
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) { // 按鼠标右键
if (e.getModifiersEx() == MouseEvent.BUTTON1_DOWN_MASK) {
// 双击实现的方法
onDoubleButton(e);
} else {
onRightButton(e);
}
} else if (e.getButton() == MouseEvent.BUTTON1) { // 按鼠标左键
if (e.getModifiersEx() == MouseEvent.BUTTON3_DOWN_MASK) {
// 双击实现的方法
onDoubleButton(e);
} else {
onLeftButton(e);
}
}
}
});
}
}
}
/**
* 点击鼠标右键方法
* @param e 事件对象
*/
private void onRightButton(MouseEvent e) {
int remain = Integer.parseInt(
CleanMine.remainMine.getText());
MineButton b = (MineButton) e.getSource();
if (b.isEnabled() == false) {
return;
}
if (b.getText().equals("")) {
remain--;
CleanMine.remainMine.setText(remain + "");
b.setText(cleanMineView);
b.setCleared(true);
if (b.getCountOfSurroundMines() == -1) {
clearMineCount++;
if (clearMineCount == mineCount
&& remain == 0 && isAllClear()) {
CleanMine.isWin = true;
}
}
} else if (b.getText().equals(cleanMineView)) {
remain++;
CleanMine.remainMine.setText(remain + "");
b.setText("");
b.setCleared(false);
if (b.getCountOfSurroundMines() == -1) {
clearMineCount--;
}
}
}
/**
* 点击鼠标左键方法
* @param e 事件对象
*/
private void onLeftButton(MouseEvent e) {
MineButton b = (MineButton) e.getSource();
int r = b.getRow();
int c = b.getCol();
if (allButtons[r][c].getText().equals(cleanMineView)) {
return;
}
if (allButtons[r][c].getCountOfSurroundMines() == -1) {// 如果是地雷
showOver();
} else {// 如果不是地雷
showEmpty(r, c);// 执行排空操作
}
}
/**
* 双击鼠标按钮方法
*/
private void onDoubleButton(MouseEvent e) {
MineButton b = (MineButton) e.getSource();
int i = b.getRow();
int j = b.getCol();
int surrountMineCount = getSurroundMineCount(i, j);
int cleanMineCount = getCleanMineCount(i, j);
// 周围没有雷,实现点击
if (surrountMineCount == 0) {
chickAll(i, j);
} else if (cleanMineCount == surrountMineCount) { // 雷已扫干净
chickAll(i, j);
} else if (cleanMineCount == -1) {
showOver();
} else {
return;
}
}
/**
* 系统实现点击周围8个按钮
* @param i
* @param j
*/
private void chickAll(int i, int j) {
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);
}
}
/**
* 统计周围扫掉的雷数
* @param i
* @param j
* @return 错的雷返回-1
*/
private int getCleanMineCount(int i, int j) {
int num = 0;// 统计的雷数
if (i - 1 >= 0 && j - 1 >= 0) {
if (allButtons[i - 1][j - 1].getText().equals(cleanMineView) &&
allButtons[i - 1][j - 1].getCountOfSurroundMines() != -1) {
return -1;
} else if (allButtons[i - 1][j - 1].getText().equals(cleanMineView) &&
allButtons[i - 1][j - 1].getCountOfSurroundMines() == -1) {
num++;
}
}
if (i - 1 >= 0) {
if (allButtons[i - 1][j].getText().equals(cleanMineView) &&
allButtons[i - 1][j].getCountOfSurroundMines() != -1) {
return -1;
} else if (allButtons[i - 1][j].getText().equals(cleanMineView) &&
allButtons[i - 1][j].getCountOfSurroundMines() == -1) {
num++;
}
}
if (i - 1 >= 0 && j + 1 < allButtons[0].length) {
if (allButtons[i - 1][j + 1].getText().equals(cleanMineView) &&
allButtons[i - 1][j + 1].getCountOfSurroundMines() != -1) {
return -1;
} else if (allButtons[i - 1][j + 1].getText().equals(cleanMineView) &&
allButtons[i - 1][j + 1].getCountOfSurroundMines() == -1) {
num++;
}
}
if (j - 1 >= 0) {
if (allButtons[i][j - 1].getText().equals(cleanMineView) &&
allButtons[i][j - 1].getCountOfSurroundMines() != -1) {
return -1;
} else if (allButtons[i][j - 1].getText().equals(cleanMineView) &&
allButtons[i][j - 1].getCountOfSurroundMines() == -1) {
num++;
}
}
if (j + 1 < allButtons[0].length) {
if (allButtons[i][j + 1].getText().equals(cleanMineView) &&
allButtons[i][j + 1].getCountOfSurroundMines() != -1) {
re
评论1
最新资源