Java 游戏 扫雷 Applet 多媒体版

来源:互联网 发布:中信淘宝会员信用卡 编辑:程序博客网 时间:2024/05/17 12:19

//所需音频,和图片资源,请按照下图所示位置及名字来存放和命名****//////////////////////
 
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;}}

	
				
		
原创粉丝点击