1、 package sweeper; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.ImageIcon; import javax.swing.
2、JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; public class JMine extends JFrame{ public int col = 10;//扫雷面板的列数 public int r
3、ow = 10;//扫雷面板好行数 private int mineNum = 10;//地雷的个数 private int mineRemainNum = mineNum; JButton[][] innitBoard = new JButton[row][col];//初始化面板 char[][] board = new char[row][col]; private int isClick[][] = new int[row][col];//用于记录按钮是否被点击过,点击过赋值为1,否则为0 private int count[][] = new int[row]
4、[col];//统计每个坐标周围地雷的个数 private boolean ismine = false;//判断是否踩到地雷 private boolean finish_click = true; private boolean iswin = true ; private int flagnum = 0;//记录插在地雷上小旗个个数 private MyThread mythread = new MyThread(); private static int time_start = 0; private static int time =0;//用于计时
5、 JLabel remain1 = new JLabel();//4个标签显示剩余地雷个数; JLabel remain2 = new JLabel(new ImageIcon((mineRemainNum/100)+".png")); JLabel remain3 = new JLabel(new ImageIcon((mineRemainNum/10)+".png")); JLabel remain4 = new JLabel(new ImageIcon((mineRemainNum%10)+".png")); static JLabel time1 = new JL
6、abel(new ImageIcon("0.png")); static JLabel time2 = new JLabel(new ImageIcon("0.png")); static JLabel time3 = new JLabel(new ImageIcon("0.png")); JButton restart; public void innit(){ this.setSize(400,450); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
7、 JPanel panel = new JPanel(new BorderLayout());//主面板 this.setContentPane(panel); layMines(); //随机布雷 JMenuBar bar = createBar(); //调用创建菜单栏的方法 this.setJMenuBar(bar); //与面板的添加的菜单栏无关,是窗体里面自带的添加菜单的方法 JPanel mineBoard = createBoard(); //调用创建扫雷主面板的方法 JPanel state = createState(); //
8、调用创建状态栏的方法
panel.add(mineBoard,BorderLayout.CENTER);
panel.add(state,BorderLayout.NORTH);
for(int i=0;i 9、t(row,col));
for(int i=0;i 10、建菜单的函数
JMenuBar bar = new JMenuBar();
JMenu file =new JMenu("文件");
JMenu edit = new JMenu("编辑");
JMenu help = new JMenu("帮助");
JMenuItem start = new JMenuItem("开始");
JMenuItem exit = new JMenuItem("退出");
JMenuItem as = new JMenuItem("关于");
file.add(start);
file.add(exit);
11、
help.add(as);
bar.add(file);
bar.add(edit);
bar.add(help);
return bar;
}
public JPanel createState(){ //创建状态栏的函数
JPanel state = new JPanel(new FlowLayout());
restart = new JButton(new ImageIcon("smile1.png"));
Insets space = new Insets(0,0,0,0);
restart.setMargin(s 12、pace);//设置按钮上图片与四周的间距
restart.setPressedIcon(new ImageIcon("shy.png"));//按钮按下换图片
//JLabel time5 = new JLabel(new ImageIcon("负号.png"));
//JLabel time4 = new JLabel(new ImageIcon("0.png"));
state.add(remain1);
state.add(remain2);
state.add(remain3);
state.add(remain4);
stat 13、e.add(restart);
state.add(time1);
state.add(time2);
//state.add(time5);
//state.add(time4);
state.add(time3);
return state;
}
public void layMines(){ //随机布雷
for(int i = 0;i 14、Math.random()*10);
if(board[x][y] == '雷')
i--;
else
board[x][y] = '雷';
}
for(int i=0;i 15、<=(x+1);i++) //对8个方向进行遍历
for(int j = (y-1);j<=(y+1);j++)
if(i>=0&&i 16、 public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if(e.getButton()==MouseEvent.BUTTON1){
JMine.time=0;
JMine.time_start=0;
restart.setIcon(new ImageIcon("smile1.png"));
for(int i=0;i 17、){
innitBoard[i][j].setIcon(null);
innitBoard[i][j].setEnabled(true);
board[i][j]=' ';
isClick[i][j]=0;
}
mineRemainNum = mineNum;
remain2.setIcon(new ImageIcon((mineRemainNum/100)+".png"));
remain3.setIcon(new ImageIcon((mineRemainNum/10)+" 18、png"));
remain4.setIcon(new ImageIcon((mineRemainNum%10)+".png"));
JMine.time1.setIcon(new ImageIcon(time/100+".png"));
JMine.time2.setIcon(new ImageIcon(time%100/10+".png"));
JMine.time3.setIcon(new ImageIcon(time%10+".png"));
ismine = false;
layMi 19、nes();
}
}
});}
class myClick implements MouseListener{ //添加按钮的鼠标事件
@Override
public void mouseClicked(MouseEvent e){
reStartButton();
if(ismine)
return;
JMine.time_start++;
for(int i=0;i 20、){
if((e.getSource()==innitBoard[i][j])){
if(isClick[i][j]==0&&e.getButton()==MouseEvent.BUTTON1){//左击
isClick[i][j] = 1;
if(time_start==1){ //第一次点击按钮,启动线程
mythread= new MyThread();
mythread.start();
}
if (board[i][j] == '雷') {
21、 mythread.stop();
//结束线程
for (int a = 0; a < board.length; a++)
for (int b = 0; b < board[a].length; b++)
if (board[a][b] == '雷'){
isClick[a][b] = 1;
innitBoard[a][b].setIcon(new ImageIcon("地雷.png"));
}
ismine = 22、true;
restart.setIcon(new ImageIcon("cry.png"));
JOptionPane.showMessageDialog(JMine.this, "踩到地雷,游戏结束");
}
else{
if(count[i][j]!=0){
isClick[i][j] = 1;
innitBoard[i][j].setIcon(new ImageIcon(count[i][j]+".gif"));
}
els 23、e{
isClick[i][j] = 1;
innitBoard[i][j].setEnabled(false);//为零让按钮不可点
move(i,j);
}
isWin();
}
}
if(isClick[i][j]%2==0&&(e.getButton()==MouseEvent.BUTTON3)){//右击
isClick[i][j]+=2;
if(isClick[i][j]%4==0){
24、isClick[i][j]=0;
innitBoard[i][j].setIcon(new ImageIcon(""));
mineRemainNum++;//地雷个数加1
if(board[i][j]=='雷')
flagnum--;
}
else if(isClick[i][j]%4!=0){
innitBoard[i][j].setIcon(new ImageIcon("flag.jpg"));
mineRemainNum--;//地雷个数减1
25、
if(board[i][j]=='雷')
flagnum++;
}
isWin();
if(mineRemainNum>=0&&mineRemainNum<=99){//地雷个数是两位数
remain2.setIcon(new ImageIcon((mineRemainNum/100)+".png"));
remain3.setIcon(new ImageIcon((mineRemainNum/10)+".p 26、ng"));
remain4.setIcon(new ImageIcon((mineRemainNum%10)+".png"));
}
else if(mineRemainNum<0){
remain2.setIcon(new ImageIcon("负号.png"));
remain3.setIcon(new ImageIcon((Math.abs(mineRemainNum)/10)+".png"));
remain4.setIcon(new ImageIcon((Math.abs(mi 27、neRemainNum)%10)+".png"));
}
}
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseRe 28、leased(MouseEvent e) {}
}
public void move(int x,int y){
for(int i = x-1;i<=(x+1);i++) //对8个方向进行遍历
for(int j = y-1;j<=(y+1);j++)
if(i>=0&&i 29、[i][j] = 1;
innitBoard[i][j].setEnabled(false);
move(i,j);
}
else{
isClick[i][j] = 1;
innitBoard[i][j].setIcon( new ImageIcon(count(i,j)+".gif"));
}
}
}
public void isWin(){
for(int i =0;i 30、ick[i].length;j++){
if(isClick[i][j]==0){
finish_click = false;
break;
}
else
finish_click = true;
}
if(finish_click&&flagnum==10){
iswin =true;
JOptionPane.showMessageDialog(JMine.this, "恭喜你,胜利了!!");
mythread.stop();
}
}
c 31、lass MyThread extends Thread{
@Override
public void run() {
try {
while(true){
time++;
JMine.time1.setIcon(new ImageIcon(time/100+".png"));
JMine.time2.setIcon(new ImageIcon(time%100/10+".png"));
JMine.time3.setIcon(new ImageIcon(time%10+".png"));
Thread.sleep(1000);
}
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
JMine mine = new JMine();
mine.innit();
}
}






