//所需音频,和图片资源,请按照下图所示位置及名字来存放和命名****////////////////////// import java.awt.event.MouseListener;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Minner extends JApplet implements MouseListener{private static final long serialVersionUID = 2040001053540391750L;private final int WIDTH=30;private final int HEIGHT=20;private final int MINNERS=120;private int countOfMines=0;private int unvisibleElement=WIDTH*HEIGHT;private Element array[][];private int xofw=30;private int yofw=30;private Image images[];private Image bang;private Image mine;private Image unvisible;private boolean lose=false;private boolean win=false;public void init(){initArray();createMinners();countMinners();printArray();images=new Image[9];for(int i=0; i<images.length; i++)images[i]=getImage(getCodeBase(), "images/"+i+".jpg");System.out.println();bang=getImage(getCodeBase(),"images/bang.jpg");mine=getImage(getCodeBase(),"images/mine.jpg");unvisible=getImage(getCodeBase(),"images/stone1.jpg");addMouseListener(this);}public void paint(Graphics g){setSize(WIDTH*xofw+1,HEIGHT*yofw+1);g.setColor(Color.blue);drawLines(g);loadArray(g);}public Position getPosition(int x,int y){return new Position(x/xofw,y/yofw);}public void loadArray(Graphics g){for(int i=0; i<HEIGHT; i++){for(int j=0; j<WIDTH; j++){if(array[i][j].getVisible())//****可见的元素{if(array[i][j].getExist())//****爆炸的地雷{if(lose)g.drawImage(bang, j*xofw+1, i*yofw+1, xofw-2, yofw-2, this);elseg.drawImage(mine, j*xofw+1, i*yofw+1, xofw-2, yofw-2, this);}else//****不是地雷的元素,显示Countg.drawImage(images[array[i][j].getCount()], j*xofw+1, i*yofw+1, xofw-2, yofw-2, this);}elseif(array[i][j].getMineMark())g.drawImage(mine, j*xofw+1, i*yofw+1, xofw-2, yofw-2, this);elseg.drawImage(unvisible, j*xofw+1, i*yofw+1, xofw-2, yofw-2, this);}}}public void drawLines(Graphics g){for(int i=0;i<=WIDTH;i++)g.drawLine(i*xofw, 0, i*xofw, HEIGHT*yofw);for(int i=0;i<=HEIGHT;i++)g.drawLine(0, i*yofw, WIDTH*xofw, i*yofw);}//初始化雷图数组public void initArray(){array=new Element[HEIGHT][WIDTH];for(int i=0;i<HEIGHT; i++)for(int j=0; j<WIDTH; j++){array[i][j]=new Element();array[i][j].resetExist();array[i][j].setCount(0);}}public void createMinners(){int x,y;for(int i=1;i<=MINNERS;){y=((int)(Math.random()*1000))%HEIGHT;x=((int)(Math.random()*1000))%WIDTH;if(!array[y][x].getExist()){array[y][x].setExist();i++;}}}public void countMinners(){for(int i=0; i<HEIGHT; i++)for(int j=0; j<WIDTH; j++){array[i][j].setCount(countMinnersAround(array,i,j));}}public int countMinnersAround(Element array[][] ,int i, int j){int count=0;for(int y=i-1; y<=i+1; y++)for(int x=j-1; x<=j+1; x++)if(y>=0&&y<HEIGHT&&x>=0&&x<WIDTH){if(array[y][x].getExist())count++;}return count;}public void printArray(){for(int i=0; i<HEIGHT; i++){for(int j=0; j<WIDTH; j++)System.out.print(array[i][j]);System.out.println();}}@Overridepublic void mouseReleased(MouseEvent e) {int x = e.getX();int y = e.getY();if(x%30==0||y%30==0)return;Position pos=getPosition(x,y);int X=pos.getX();int Y=pos.getY();if(X>=WIDTH||Y>=HEIGHT)return;if(!lose&&!win){ switch(e.getModifiers()) { case InputEvent.BUTTON1_MASK: //****点击的是鼠标左键 { System.out.println( "That 's the LEFT button "); if(!array[Y][X].getMineMark()) { if(!array[Y][X].getVisible())//不可见的位置 { if(array[Y][X].getExist())//该位置有地雷 { lose=true; bang(); this.play(getCodeBase(), "audio/lose.au"); } else//该位置没有地雷 { if(array[Y][X].getCount()==0) { exploreEightConnectedRegion( Y, X); this.play(getCodeBase(), "audio/area.au"); } else { unvisibleElement--; array[Y][X].setVisible(true); this.play(getCodeBase(), "audio/element.au"); } } } else//可见到的位置 { } } repaint(); break; } case InputEvent.BUTTON2_MASK: //****点击的是鼠标中键 { System.out.println( "That 's the MIDDLE button "); { } repaint(); break; } case InputEvent.BUTTON3_MASK: //****点击的是鼠标右键 { System.out.println( "That 's the RIGHT button "); { if(!array[Y][X].getVisible()) { if(!array[Y][X].getMineMark())//***如果还没有被标记 { array[Y][X].setMineMark(true);//***标记为可能的地雷 countOfMines++; } else { array[Y][X].setMineMark(false); countOfMines--; } this.play(getCodeBase(), "audio/mark.au"); } else//****对可见的元素,点击右键,调用函数处理 { checkSumOfMines(Y, X); } } repaint(); break; } } checkWinOrNot(); System.out.println("\n/*****/"+countOfMines+"\t"+unvisibleElement); }}public boolean checkWinOrNot(){if(countOfMines==MINNERS&&unvisibleElement==countOfMines){play(getCodeBase(), "audio/win.au");win=true;return true;}return false;}//***对可见的元素,求周围的标记数量,来与该元素的Count比较,public void checkSumOfMines(int Y, int X){int count=0;if(array[Y][X].getCount()==0)return;int i,j;for(i=Y-1; i<=Y+1; i++)////**计算周围的表及数量count{for(j=X-1; j<=X+1; j++)if(i>=0&&i<HEIGHT&&j>=0&&j<WIDTH && array[i][j].getMineMark()){count++;}}if(array[Y][X].getCount()==count)////**如果数量是正确的,核查是否,有标记是错误的,是,则雷区爆破{for(i=Y-1; i<=Y+1; i++)for(j=X-1; j<=X+1; j++)if(i>=0&&i<HEIGHT&&j>=0&&j<WIDTH && array[i][j].getMineMark()&&!array[i][j].getExist()){bang();return;}int countUnvisible=0;for(i=Y-1; i<=Y+1; i++)////**只有地雷标记全是正确饿时候,才会执行,到这里------非地雷,设为可见,count==0的元素,开拓它的八连通区域{for(j=X-1; j<=X+1; j++)if(i>=0&&i<HEIGHT&&j>=0&&j<WIDTH && !array[i][j].getMineMark() )//&& !array[i][j].getExist()){if(!array[i][j].getVisible())//***把不可见元素,设为可见,并且计算个数,并且把新增加的count=0元素,用来获取八连通区域{countUnvisible++;if(array[i][j].getCount()!=0)unvisibleElement--;array[i][j].setVisible(true);if(array[i][j].getCount()==0)exploreEightConnectedRegion(i, j);}}}if(countUnvisible>0){repaint();play(getCodeBase(), "audio/area.au");}return;}elseif(array[Y][X].getCount()<count)////**标记过多,则雷区爆破{bang();return;}elseif(array[Y][X].getCount()>count)////表及数量过少,则提示,可能的地雷所在元素{blink();return;}return;}public void blink(){}public void bang(){lose=true;for(int i=0; i<HEIGHT; i++)for(int j=0; j<WIDTH; j++)if(!array[i][j].getVisible()){unvisibleElement--;array[i][j].setVisible(true);}repaint();this.play(getCodeBase(), "audio/lose.au");}public void exploreEightConnectedRegion( int Y, int X)//种子,八连通区域{setVisible(Y, X);//******首先,把种子设为可见unvisibleElement--;int max=Math.max(Math.max(Math.abs(Y), Math.abs(Y-HEIGHT)), Math.max(Math.abs(X), Math.abs(X-WIDTH)));//算出波纹的最大半径System.out.println(max);int flag;//if(array[Y][X].getCount()>0&&!array[Y][X].getExist())//array[Y][X].setVisible(true);do{flag=0;for(int i=1; i<=max; i++)//******一圈圈往外算,每次矩形长宽都加2{for(int n=Y-i; n<Y+i; n++)//左边if(isConnectable(n, X-i)){flag++;}for(int n=X-i; n<X+i; n++)//下边if(isConnectable(Y+i, n)){flag++;}for(int n=Y+i; n>Y-i; n--)//右边if(isConnectable(n, X+i)){flag++;}for(int n=X+i; n>X-i; n--)//上边if(isConnectable(Y-i, n)){flag++;}repaint();}}while(flag>0);}public boolean isConnectable(int Y, int X){if(Y>=0&&Y<HEIGHT&&X>=0&&X<WIDTH)//确定所需判定的元素,下标,不会越界{for(int y=Y-1; y<=Y+1; y++){for(int x=X-1; x<=X+1; x++){if(y>=0&&y<HEIGHT&&x>=0&&x<WIDTH)//确定拿来参考的元素,下标也不会越界{if(array[y][x].getVisible()&&array[y][x].getCount()==0)//周围有可见的,绝对安全点(四周没有雷){if(!array[Y][X].getVisible())//需要判定的元素,暂时不可见{//if(array[Y][X].getCount()==0)//{ //unvisibleElement--;//array[Y][X].setVisible(true);//repaint();//return true;//}//elseif(!array[Y][X].getExist())//没有地雷{array[Y][X].setVisible(true); unvisibleElement--;repaint();return true;}}}}}}}return false;}public void setVisible( int Y, int X){array[Y][X].setVisible(true);}@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {}}class Element{private boolean exist;private int count;private boolean visible;private boolean mine_mark;public Element(){exist=false;count=0;visible=false;mine_mark=false;}public Element(Element e){setExist(e.getExist());setCount(e.getCount());setVisible(e.getVisible());setMineMark(e.getMineMark());}public void setVisible(boolean b){visible=b;}public void setMineMark(boolean b){mine_mark=b;}public boolean getMineMark(){return mine_mark;}public boolean getVisible(){return visible;}public void setExist(boolean b){exist=b;}public void setExist(){exist=true;}public void resetExist(){exist=false;}public void setCount(int i){if(i>=0&&i<=8){count=i;}}public boolean getExist(){return exist;}public int getCount(){return count;}public String toString(){return "\t("+(exist?"Y":" ")+", "+count+")";}}class Position{private int x;private int y;public Position(){x=0;y=0;}public Position(int n,int m){setX(n);setY(m);}public Position(Position p){setX(p.getX());setY(p.getY());}public boolean equals(Position p){if(this.getX()==p.getX()&&this.getY()==p.getY())return true;return false;}public void setX(int n){x=n;}public void setY(int n){y=n;}public int getX(){return x;}public int getY(){return y;}}