import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
int BombNum, BlockNum; // 当前雷数,当前方块数
int rightBomb, restBomb, restBlock; // 找到的地雷数,剩余雷数,剩余方块数
Bomb[][] bombButton;
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
}
exception.printStackTrace();
}
}
c
= (JPanel) getContentPane
();
setTitle("扫雷");
c.
setBackground(Color.
WHITE);
MenuPamel.
setBackground(Color.
GRAY);
c.setLayout(borderLayout1);
setResizable(false);
BlockNum = 144;
BombNum = 10;
nowBomb
= new JLabel("当前雷数" + ":" + BombNum
);
setBomb
= new JLabel("设置地雷数");
start.addActionListener(new Frame1_start_actionAdapter(this));
MenuPamel.add(setBomb);
MenuPamel.add(text);
MenuPamel.add(start);
MenuPamel.add(nowBomb);
bombPanel.setLayout(gridLayout1);
gridLayout1.
setColumns( (int) Math.
sqrt(BlockNum
));
gridLayout1.
setRows( (int) Math.
sqrt(BlockNum
));
bombButton
= new Bomb
[ (int) Math.
sqrt(BlockNum
)][ (int) Math.
sqrt(BlockNum
)];
for (int i
= 0; i
< (int) Math.
sqrt(BlockNum
); i
++) {
for (int j
= 0; j
< (int) Math.
sqrt(BlockNum
); j
++) {
bombButton[i][j] = new Bomb(i, j);
//bombButton[i][j].setSize(10, 10);
bombButton
[i
][j
].
setFont(new Font("",
Font.
PLAIN,
14));//设置字体大小
bombButton
[i
][j
].
setForeground(Color.
white);
bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this));
bombButton[i][j].addActionListener(new Bomb_actionAdapter(this));
bombPanel.add(bombButton[i][j]);
}
}
startBomb();
}
/* 开始按钮 */
int num
=Integer.
parseInt(text.
getText().
trim());
if (num >= 5 && num < 50) {
BombNum = num;
startBomb();
}
else if (num < 5) {
JOptionPane.
showMessageDialog(null,
"您设置的地雷数太少了,请重设!",
"错误",
num=10;
BombNum = num;
}
else {
JOptionPane.
showMessageDialog(null,
"您设置的地雷数太多了,请重设!",
"错误",
num=10;
BombNum = num;
}
}
/* 开始,布雷 */
public void startBomb() {
nowBomb.setText("当前雷数" + ":" + BombNum);
for (int i
= 0; i
< (int) Math.
sqrt(BlockNum
); i
++) {
for (int j
= 0; j
< (int) Math.
sqrt(BlockNum
); j
++) {
bombButton[i][j].isBomb = false;
bombButton[i][j].isClicked = false;
bombButton[i][j].isRight = false;
bombButton[i][j].BombFlag = 0;
bombButton[i][j].BombRoundCount = 9;
bombButton[i][j].setEnabled(true);
bombButton[i][j].setText("");
bombButton
[i
][j
].
setFont(new Font("",
Font.
PLAIN,
14));//设置字体大小
bombButton
[i
][j
].
setForeground(Color.
BLUE);
rightBomb = 0;
restBomb = BombNum;
restBlock = BlockNum - BombNum;
}
}
for (int i = 0; i < BombNum; ) {
int x
= (int) (Math.
random() * (int) (Math.
sqrt(BlockNum
) - 1));
int y
= (int) (Math.
random() * (int) (Math.
sqrt(BlockNum
) - 1));
if (bombButton[x][y].isBomb != true) {
bombButton[x][y].isBomb = true;
i++;
}
}
CountRoundBomb();
}
/* 计算方块周围雷数 */
public void CountRoundBomb() {
for (int i
= 0; i
< (int) Math.
sqrt(BlockNum
); i
++) {
for (int j
= 0; j
< (int) Math.
sqrt(BlockNum
); j
++) {
int count = 0;
// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
if (bombButton[i][j].isBomb != true) {
for (int x = i - 1; x < i + 2; x++) {
for (int y = j - 1; y < j + 2; y++) {
if ( (x >= 0) && (y >= 0)
&& (x
< ( (int) Math.
sqrt(BlockNum
)))
&& (y
< ( (int) Math.
sqrt(BlockNum
)))) {
if (bombButton[x][y].isBomb == true) {
count++;
}
}
}
}
bombButton[i][j].BombRoundCount = count;
}
}
}
}
/* 是否挖完了所有的雷 */
public void isWin() {
restBlock = BlockNum - BombNum;
for (int i
= 0; i
< (int) Math.
sqrt(BlockNum
); i
++) {
for (int j
= 0; j
< (int) Math.
sqrt(BlockNum
); j
++) {
if (bombButton[i][j].isClicked == true) {
restBlock--;
}
}
}
if (rightBomb == BombNum || restBlock == 0) {
JOptionPane.
showMessageDialog(this,
"您挖完了所有的雷,您胜利了!",
"胜利",
startBomb();
}
}
/** 当选中的位置为空,则翻开周围的地图* */
public void isNull(Bomb ClickedButton) {
int i, j;
i = ClickedButton.num_x;
j = ClickedButton.num_y;
for (int x = i - 1; x < i + 2; x++) {
for (int y = j - 1; y < j + 2; y++) {
if ( ( (x != i) || (y != j)) && (x >= 0) && (y >= 0)
&& (x
< ( (int) Math.
sqrt(BlockNum
)))
&& (y
< ( (int) Math.
sqrt(BlockNum
)))) {
if (bombButton[x][y].isBomb == false
&& bombButton[x][y].isClicked == false
&& bombButton[x][y].isRight == false) {
turn(bombButton[x][y]);
}
}
}
}
}
/* 翻开 */
public void turn(Bomb ClickedButton) {
ClickedButton.setEnabled(false);
ClickedButton.isClicked = true;
if (ClickedButton.BombRoundCount > 0) {
ClickedButton.setText(ClickedButton.BombRoundCount + "");
}
else {
isNull(ClickedButton);
}
}
/* 左键点击 */
if ( ( (Bomb) e.getSource()).isClicked == false
&& ( (Bomb) e.getSource()).isRight == false) {
if ( ( (Bomb) e.getSource()).isBomb == false) {
turn( ( (Bomb) e.getSource()));
isWin();
}
else {
for (int i
= 0; i
< (int) Math.
sqrt(BlockNum
); i
++) {
for (int j
= 0; j
< (int) Math.
sqrt(BlockNum
); j
++) {
if (bombButton[i][j].isBomb == true) {
bombButton[i][j].setText("b");
}
}
}
( (Bomb
) e.
getSource()).
setForeground(Color.
RED);
( (Bomb
) e.
getSource()).
setFont(new Font("",
Font.
BOLD,
20));
( (Bomb) e.getSource()).setText("X");
JOptionPane.
showMessageDialog(this,
"你踩到地雷了,按确定重来",
"踩到地雷",
2);
startBomb();
}
}
}
/* 右键点击 */
Bomb bombSource = (Bomb) e.getSource();
if ( (right == true) && (bombSource.isClicked == false)) {
bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;
if (bombSource.BombFlag == 1) {
if (restBomb > 0) {
bombSource.
setForeground(Color.
RED);
bombSource.setText("F");
bombSource.isRight = true;
restBomb--;
}
else {
bombSource.BombFlag = 0;
}
}
else if (bombSource.BombFlag == 2) {
restBomb++;
bombSource.setText("Q");
bombSource.isRight = false;
}
else {
bombSource.setText("");
}
if (bombSource.isBomb == true) {
if (bombSource.BombFlag == 1) {
rightBomb++;
}
else if (bombSource.BombFlag == 2) {
rightBomb--;
}
}
nowBomb.setText("当前雷数" + ":" + restBomb);
isWin();
}
}
public static void main
(String[] args
) {
frame.setVisible(true);
}
}
class Frame1_start_actionAdapter
Frame1_start_actionAdapter
(Frame adaptee
) {
this.adaptee = adaptee;
}
adaptee.start_actionPerformed(e);
}
}
////////////////////////////
class Bomb
int num_x, num_y; // 第几号方块
int BombRoundCount; // 周围雷数
boolean isBomb; // 是否为雷
boolean isClicked; // 是否被点击
int BombFlag; // 探雷标记
boolean isRight; // 是否点击右键
public Bomb(int x, int y) {
num_x = x;
num_y = y;
BombFlag = 0;
BombRoundCount = 9;
isBomb = false;
isClicked = false;
isRight = false;
}
}
class Bomb_actionAdapter
Bomb_actionAdapter
(Frame adaptee
) {
this.adaptee = adaptee;
}
adaptee.actionPerformed(e);
}
}
class Bomb_mouseAdapter
Bomb_mouseAdapter
(Frame adaptee
) {
this.adaptee = adaptee;
}
adaptee.mouseClicked(e);
}
}