package saolei;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.*;
/**
* 显示所有按钮的面板
*
* @author 北の枫
*
*/
@SuppressWarnings("serial")
public class AllButtonPanel extends JPanel implements ActionListener {
private int row;// 行数
private int col;// 列数
private int mineCount;// 地雷数
private MineButton[][] allButtons;// 所有按钮
private JLabel remainMine, time;
private Timerln t;
private boolean isPressLeftAndRight = false;// 布尔值用于判断是否有鼠标左右键同时按下
private boolean isReleasLeftAndRight = false;// 布尔值用于判断是否有鼠标左右键同时释放
public AllButtonPanel(int row, int col, int mineCount, JLabel remainMine,
JLabel time) {
this.row = row;
this.col = col;
this.mineCount = mineCount;
this.remainMine = remainMine;
this.time = time;
t = new Timerln();
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].setBorder(new BevelBorder(BevelBorder.RAISED));
allButtons[i][j].setBackground(new Color(220, 220, 220));
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());
MineButton b = (MineButton) e.getSource();
int r = b.getRow();
int c = b.getCol();
if (!b.isCleared()) {
if (b.getId() == 0) {
remain--;
if (remain < 10 && remain >= 0) {
remainMine.setText("00"
+ remain);
} else if (remain >= 10) {
remainMine
.setText("0" + remain);
} else {
remainMine.setText("" + remain);
}
b
.setIcon(new ImageIcon(
CleanMine.class
.getResource("/image/FLAG.GIF")));
b.setId(-1);
allButtons[r][c].setCleared(true);
isWin();
}
} else if (b.getId() == -1) {
remain++;
if (remain < 10 && remain >= 0) {
remainMine.setText("00" + remain);
} else if (remain >= 10) {
remainMine.setText("0" + remain);
} else {
remainMine.setText("" + remain);
}
b.setIcon(null);
b.setId(0);
allButtons[r][c].setCleared(false);
}
}
}
public void mousePressed(MouseEvent e) {// 鼠标按下监听
MineButton b = (MineButton) e.getSource();
int i = b.getRow();
int j = b.getCol();
if ((e.getButton() == MouseEvent.BUTTON1 || e
.getButton() == MouseEvent.BUTTON3)
&& !isPressLeftAndRight) {
isPressLeftAndRight = true;
} else if (isPressLeftAndRight) {
isReleasLeftAndRight = true;
int num = allButtons[i][j]
.getCountOfSurroundMines();// 获得点击的这个按钮周围的雷数
int mine = 0;// 获得这个按钮周围已经插的旗子数
if (i - 1 >= 0 && j - 1 >= 0) {
if (allButtons[i - 1][j - 1].getId() != -1) {
allButtons[i - 1][j - 1]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i - 1][j - 1]
.getId() == -1 ? 1 : 0);
}
if (i - 1 >= 0) {
if (allButtons[i - 1][j].getId() != -1) {
allButtons[i - 1][j]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i - 1][j].getId() == -1 ? 1
: 0);
}
if (i - 1 >= 0
&& j + 1 < allButtons[0].length) {
if (allButtons[i - 1][j + 1].getId() != -1) {
allButtons[i - 1][j + 1]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i - 1][j + 1]
.getId() == -1 ? 1 : 0);
}
if (j - 1 >= 0) {
if (allButtons[i][j - 1].getId() != -1) {
allButtons[i][j - 1]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i][j - 1].getId() == -1 ? 1
: 0);
}
if (j + 1 < allButtons[0].length) {
if (allButtons[i][j + 1].getId() != -1) {
allButtons[i][j + 1]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i][j + 1].getId() == -1 ? 1
: 0);
}
if (i + 1 < allButtons.length && j - 1 >= 0) {
if (allButtons[i + 1][j - 1].getId() != -1) {
allButtons[i + 1][j - 1]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i + 1][j - 1]
.getId() == -1 ? 1 : 0);
}
if (i + 1 < allButtons.length) {
if (allButtons[i + 1][j].getId() != -1) {
allButtons[i + 1][j]
.setBorder(new EmptyBorder(
new Insets(1, 1, 1,
1)));
}
mine += (allButtons[i + 1][j].getId() == -1 ? 1
评论1
最新资源