文档库 最新最全的文档下载
当前位置:文档库 › java大作业扫雷代码

java大作业扫雷代码

java大作业扫雷代码
java大作业扫雷代码

import java.awt.*;

import java.awt.event.*;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JTextField;

import javax.swing.SwingUtilities;

/*按扭类*/

class Bomb extends JButton

{

public int num_x, num_y; // 第几号方块

public int BombRoundCount; // 周围雷数

public boolean isBomb; // 是否为雷

public boolean isClicked; // 是否被点击

public int BombFlag; // 探雷标记

public boolean isRight; // 是否点击右键

public Bomb(int x, int y)

{

BombFlag = 0;

num_x = x;

num_y = y;

BombRoundCount = 0;

isBomb = false;

isClicked = false;

isRight = false;

}

}

/* 窗口及算法实现类*/

class Main extends JFrame implements ActionListener, MouseListener {

public JTextField text;

public Label nowBomb, setBomb;

public int BlockNum, BombNum; // 当前方块数当前雷数

public Icon icon_bomb = new ImageIcon("Bomb.gif"); // 踩雷

public Icon icon_bomb_big = new ImageIcon("bomb_big.gif"); // 踩雷标记

public Icon icon_flag = new ImageIcon("flag.gif"); // 雷标记

public Icon icon_question = new ImageIcon("question.gif"); // 疑惑是否有雷

public JButton start = new JButton(" 开始");

public Panel MenuPamel = new Panel();

public Panel mainPanel = new Panel();

public Bomb[][] bombButton;

/* 界面设计*/

public Main()

{

super("MineSweeping:");

BlockNum = 64;

BombNum = 10;

Container c = getContentPane();

c.setBackground(Color.gray);

c.setLayout(new BorderLayout());

text = new JTextField("10 ", 3);

nowBomb = new Label("当前雷数" + "" + BombNum + "");

setBomb = new Label("设置地雷数");

start.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

BombNum = Integer.parseInt(text.getText().trim());

if (BombNum >= 10 && BombNum < 50)

replay();

else

{

JOptionPane msg = new JOptionPane();

JOptionPane.showMessageDialog(null, "您设置的地雷数不合理了,请重设!",

"错误", 2);

}

}

});

MenuPamel.add(setBomb);

MenuPamel.add(text);

MenuPamel.add(start);

MenuPamel.add(nowBomb);

c.add(MenuPamel, "North");

mainPanel.setLayout(new GridLayout((int) Math.sqrt(BlockNum), (int) Math.sqrt(BlockNum)));

bombButton = new Bomb[(int) Math.sqrt(BlockNum)][];

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++)

{

bombButton[i] = new Bomb[(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].setForeground(Color.gray);

bombButton[i][j].addActionListener(this);

bombButton[i][j].addMouseListener(this);

}

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++)

for (int j = 0; j < (int) Math.sqrt(BlockNum); j++)

mainPanel.add(bombButton[i][j]);

c.add(mainPanel, "Center");

startBomb();

setSize(400, 400);

setLocation(350, 200);

setResizable(false);

}

/* 布雷*/

public void startBomb()

{

for (int i = 0; i < BombNum; i++)

{

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)

i--;

else

bombButton[x][y].isBomb = true;

}

}

/* 重新开始*/

public void replay()

{

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].setEnabled(true);

bombButton[i][j].setText("");

bombButton[i][j].setIcon(null);

}

startBomb();

}

/* 是否挖完了所有的雷*/

public void isWin()

{

int findBomb = 0; // 找到的地雷数

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].isRight == true)

findBomb++;

}

if (findBomb == Integer.parseInt(text.getText().trim()))

{

JOptionPane msg = new JOptionPane();

JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您胜利了!", "您胜利了", 2);

}

}

/* 计算方块周围雷数*/

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)

{

if ((i - 1 >= 0) && (j - 1 >= 0))

{

if (bombButton[i - 1][j - 1].isBomb == true)

{

count += 1; // 检测左上方空格是否是地雷

}

}

if ((i - 1 >= 0))

{

if (bombButton[i - 1][j].isBomb == true)

{

count += 1; // 检测上方空格是否为地雷

}

}

if ((i - 1 >= 0)

&& (j + 1 <= (int) Math.sqrt(BlockNum) - 1)) {

if (bombButton[i - 1][j + 1].isBomb == true)

{

count += 1; // 检测右上方是否为地雷

}

}

if ((j - 1 >= 0))

{

if (bombButton[i][j - 1].isBomb == true)

{

count += 1; // 检测左边是否为地雷

}

}

if ((i >= 0) && (j + 1 <= (int) Math.sqrt(BlockNum) - 1))

{

if (bombButton[i][j + 1].isBomb == true)

{

count += 1; // 右边

}

}

if ((j - 1 >= 0)

&& (i + 1 <= (int) Math.sqrt(BlockNum) - 1)) {

if (bombButton[i + 1][j - 1].isBomb == true)

{

count += 1; // 左下

}

}

if ((i + 1 <= (int) Math.sqrt(BlockNum) - 1))

{

if (bombButton[i + 1][j].isBomb == true)

{

count += 1; // 下

}

}

if ((j + 1 <= (int) Math.sqrt(BlockNum) - 1)

&& (i + 1 <= Math.sqrt(BlockNum) - 1))

{

if (bombButton[i + 1][j + 1].isBomb == true)

{

count += 1; // 右下

}

}

bombButton[i][j].BombRoundCount = count;

}

}

}

}

/** 当选中的位置为空,则翻开周围的地图**/

public void isNull(Bomb[][] bombButton, Bomb ClickecButton)

{

int i, j;

i = ClickecButton.num_x;

j = ClickecButton.num_y;

if (ClickecButton.isBomb == true)

{

} else

{

if ((i - 1 >= 0) && (j - 1 >= 0))

{ // 检测左上方空格是否是空

if (bombButton[i - 1][j - 1].isBomb == false

&& bombButton[i - 1][j - 1].isClicked == false

&& bombButton[i - 1][j - 1].isRight == false)

{

bombButton[i - 1][j - 1]

.setText((bombButton[i - 1][j - 1].BombRoundCount)

+ "");

bombButton[i - 1][j - 1].setEnabled(false);

bombButton[i - 1][j - 1].isClicked = true;

}

}

if ((i - 1 >= 0))

{ // 检测上方空格是否为空

if (bombButton[i - 1][j].isBomb == false

&& bombButton[i - 1][j].isClicked == false

&& bombButton[i - 1][j].isRight == false)

{

bombButton[i - 1][j]

.setText((bombButton[i - 1][j].BombRoundCount) + "");

bombButton[i - 1][j].setEnabled(false);

bombButton[i - 1][j].isClicked = true;

}

}

if ((i - 1 >= 0) && (j + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

{ // 检测右上方是否为空

if (bombButton[i - 1][j + 1].isBomb == false

&& bombButton[i - 1][j + 1].isClicked == false

&& bombButton[i - 1][j + 1].isRight == false)

{

bombButton[i - 1][j + 1]

.setText((bombButton[i - 1][j + 1].BombRoundCount)

+ "");

bombButton[i - 1][j + 1].setEnabled(false);

bombButton[i - 1][j + 1].isClicked = true;

}

}

if ((j - 1 >= 0))

{ // 检测左边是否为空

if (bombButton[i][j - 1].isBomb == false

&& bombButton[i][j - 1].isClicked == false

&& bombButton[i][j - 1].isRight == false)

{

bombButton[i][j - 1]

.setText((bombButton[i][j - 1].BombRoundCount) + "");

bombButton[i][j - 1].setEnabled(false);

bombButton[i][j - 1].isClicked = true;

}

}

if ((i >= 0) && (j + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

{ // 检测右边空格是否是空

if (bombButton[i][j + 1].isBomb == false

&& bombButton[i][j + 1].isClicked == false

&& bombButton[i][j + 1].isRight == false)

{

bombButton[i][j + 1]

.setText((bombButton[i][j + 1].BombRoundCount) + "");

bombButton[i][j + 1].setEnabled(false);

bombButton[i][j + 1].isClicked = true;

}

}

if ((j - 1 >= 0) && (i + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

{ // 检测左下空格是否是空

if (bombButton[i + 1][j - 1].isBomb == false

&& bombButton[i + 1][j - 1].isClicked == false

&& bombButton[i + 1][j - 1].isRight == false)

{

bombButton[i + 1][j - 1]

.setText((bombButton[i + 1][j - 1].BombRoundCount)

+ "");

bombButton[i + 1][j - 1].setEnabled(false);

bombButton[i + 1][j - 1].isClicked = true;

}

}

if ((i + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

{ // 检测下边空格是否是空

if (bombButton[i + 1][j].isBomb == false

&& bombButton[i + 1][j].isClicked == false

&& bombButton[i + 1][j].isRight == false)

{

bombButton[i + 1][j]

.setText((bombButton[i + 1][j].BombRoundCount) + "");

bombButton[i + 1][j].setEnabled(false);

bombButton[i + 1][j].isClicked = true;

}

}

if ((j + 1 <= ((int) Math.sqrt(BlockNum) - 1))

&& (i + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

{ // 检测右下边空格是否是空

if (bombButton[i + 1][j + 1].isBomb == false

&& bombButton[i + 1][j + 1].isClicked == false

&& bombButton[i + 1][j + 1].isRight == false)

{

bombButton[i + 1][j + 1]

.setText((bombButton[i + 1][j + 1].BombRoundCount)

+ "");

bombButton[i + 1][j + 1].setEnabled(false);

bombButton[i + 1][j + 1].isClicked = true;

}

}

if ((i - 1 >= 0) && (j - 1 >= 0))// 检测左上

isNull(bombButton, bombButton[i - 1][j - 1]);

if ((i - 1 >= 0))

isNull(bombButton, bombButton[i - 1][j]);// 检测上方

if ((i - 1 >= 0) && (j + 1 <= (int) Math.sqrt(BlockNum) - 1))

isNull(bombButton, bombButton[i - 1][j + 1]);// 检测右上if ((j - 1 >= 0))

isNull(bombButton, bombButton[i][j - 1]);// 检测左边

if ((i >= 0) && (j + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

isNull(bombButton, bombButton[i][j + 1]);// 检测右边

if ((j - 1 >= 0) && (i + 1 <= ((int) Math.sqrt(BlockNum) - 1)))

isNull(bombButton, bombButton[i + 1][j - 1]); // 检测左下if ((i + 1 <= ((int) Math.sqrt(BlockNum) - 1))) // 检测下

isNull(bombButton, bombButton[i + 1][j]);

if ((j + 1 <= ((int) Math.sqrt(BlockNum) - 1))

&& (i + 1 <= ((int) Math.sqrt(BlockNum) - 1))) // 检测右下isNull(bombButton, bombButton[i + 1][j + 1]);

}

}

public void actionPerformed(ActionEvent e)

{

CountRoundBomb();

if (((Bomb) e.getSource()).isBomb == false

&& ((Bomb) e.getSource()).isClicked == false)

{

((Bomb) e.getSource())

.setText((((Bomb) e.getSource()).BombRoundCount) + "");

((Bomb) e.getSource()).isClicked = true;

((Bomb) e.getSource()).setIcon(null);

((Bomb) e.getSource()).setEnabled(false);

if ((((Bomb) e.getSource()).BombRoundCount) == 0)

isNull(bombButton, (Bomb) e.getSource());

isWin();

} else if (((Bomb) e.getSource()).isBomb == true)

{

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].setIcon(icon_bomb);

}

((Bomb) e.getSource()).setIcon(icon_bomb_big);

JOptionPane msg = new JOptionPane();

JOptionPane.showMessageDialog(this, "你踩到地雷了,按确定重来", "你踩到地雷了", 2);

replay();

}

}

public void mouseClicked(MouseEvent e)

{

Bomb bombSource = (Bomb) e.getSource();

boolean right = SwingUtilities.isRightMouseButton(e);

if ((right == true) && (bombSource.isClicked == false))

{

bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;

if (bombSource.BombFlag == 1)

{

if (BombNum > 0 && bombSource.isRight == false)

{

bombSource.setIcon(icon_flag);

bombSource.isRight = true;

BombNum--;

}

isWin();

nowBomb.setText("当前雷数" + "" + BombNum + "");

} else if (bombSource.BombFlag == 2)

{

if ((BombNum != 0)

|| (BombNum == 0 && (bombSource.getIcon() == icon_flag)))

BombNum++;

bombSource.setIcon(icon_question);

nowBomb.setText("当前雷数" + "" + BombNum + "");

} else if (bombSource.BombFlag == 0)

{

bombSource.setIcon(null);

bombSource.isRight = false;

}

}

}

public void mouseEntered(MouseEvent e)

{

}

public void mouseReleased(MouseEvent e)

{

}

public void mouseExited(MouseEvent e)

{

}

public void mousePressed(MouseEvent e)

{

}

}

/* 主类*/

public class MineSweeping

{

public static void main(String args[])

{

(new Main()).show();

}

}

相关文档