⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findbomb.java

📁 扫雷游戏
💻 JAVA
字号:
import javax.swing.*;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.net.MalformedURLException;
import java.util.*;

public class FindBomb{

	/**
	 * @param args
	 */
	//JFrame OFrame;
	
	
	public FindBomb(){
		String ll=JOptionPane.showInputDialog("","请输入长度");                //输入参数
		final int l=Integer.parseInt(ll);
		String ww=JOptionPane.showInputDialog("","请输入宽度");
		final int w=Integer.parseInt(ww);
		String nn=JOptionPane.showInputDialog("","请输入雷的个数");
		int n=Integer.parseInt(nn);
		final boolean[][] bombrand = new boolean[w][l];
		java.util.Random rand = new java.util.Random();             
		for(int i=0;i<w;i++)
			for(int j=0;j<l;j++){
				bombrand[i][j] = false;
			}
		for(int i=0;i<n;i++){                                                //随机生成地雷
			int tempw=rand.nextInt(w);
			int templ=rand.nextInt(l);
			while(bombrand[tempw][templ]){
				tempw=rand.nextInt(w);
				templ=rand.nextInt(l);
			}
			bombrand[tempw][templ]=true;
		}
		final int[][] bombnum = new int[w][l];                               //根据地雷排布生成数字
		for(int i=0;i<w;i++)
			for(int j=0;j<l;j++){
				int count = 0;
				if(!bombrand[i][j]){
					if(i>0){
						if(bombrand[i-1][j]) count++;
						if(j>0) if (bombrand[i-1][j-1]) count++;
						if(j<l-1) if (bombrand[i-1][j+1]) count++;
					}
					if(i<w-1){
						if(bombrand[i+1][j]) count++;
						if(j>0) if (bombrand[i+1][j-1]) count++;
						if(j<l-1) if (bombrand[i+1][j+1]) count++;
					}
					if(j>0) if (bombrand[i][j-1]) count++;
					if(j<l-1) if (bombrand[i][j+1]) count++;
				}
				bombnum[i][j] = count;
			}
		final JLabel[][] Unicase = new JLabel[w][l];
		Image iconLogo= new ImageIcon("image/Logo.gif").getImage();   //Logo
		final ImageIcon iconflat= new ImageIcon("image/flat.gif");   //旗子的图案
		final ImageIcon iconfail= new ImageIcon("image/fail.gif");   //fail时的图案
		final ImageIcon iconwin= new ImageIcon("image/win.gif");    //win时的图案
		final ImageIcon icon0= new ImageIcon("image/bbb0.gif");   //初始格子的图案
		final ImageIcon icon1= new ImageIcon("image/bbb1.gif");   //鼠标放上格子的图案
		final ImageIcon icon2= new ImageIcon("image/bbb2.gif");   //地雷的图案
		final ImageIcon icon3= new ImageIcon("image/bbb3.gif");   //空白图案
		final ImageIcon[] iconnum = new ImageIcon[8];
		for(int i=0;i<8;i++) iconnum[i]= new ImageIcon("image/bbbb"+i+".gif");   //i的图案
		/*final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //2的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //3的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //4的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //5的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //6的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //7的图案
		final ImageIcon iconnum[]= new ImageIcon("image/bbb.gif");   //8的图案*/
		final boolean[][] isClicked = new boolean[w][l];
		final boolean[][] flat = new boolean[w][l];
		JFrame frame = new JFrame("扫雷      prog by Sunny");
		frame.setIconImage(iconLogo);
		frame.setLayout(new GridLayout(w,l));
		for(int i=0;i<w;i++)                                                               //对每个格子进行事件处理
			for(int j=0;j<l;j++){
				Unicase[i][j] = new JLabel(icon0);
				final JLabel p = Unicase[i][j];
				final int ii = i;
				final int jj = j;
				frame.add(Unicase[i][j]);
				if (bombrand[i][j])															//踩到地雷的事件处理
					Unicase[i][j].addMouseListener(new MouseAdapter(){
			        	public void mouseEntered(MouseEvent e){
			        		if((!isClicked[ii][jj])&&(!flat[ii][jj]))p.setIcon(icon1);
			        	}
			        	public void mouseExited(MouseEvent e){
			        		if((!isClicked[ii][jj])&&(!flat[ii][jj]))p.setIcon(icon0);
			        	}
			        	public void mouseClicked(MouseEvent e){                           //右击标旗子
			        		if(e.getButton()==MouseEvent.BUTTON3) {
			        			if(!flat[ii][jj]) {
			        				flat[ii][jj]=true;p.setIcon(iconflat);}
			        			else {
			        				flat[ii][jj]=false;p.setIcon(icon0);}
			        			}
			        		else {
			        			p.setIcon(icon2);
			        			for(int k=0;k<w;k++)
			        				for(int g=0;g<l;g++)
			        					if(bombrand[k][g]) {
			        						Unicase[k][g].setIcon(icon2);
			        						isClicked[k][g]=true;
			        					}
			        			File file0 = new File("audio/fail.wav"); 					//失败声音
			        		       try {
			        				AudioClip sound1 = Applet.newAudioClip(file0.toURL());
			        				sound1.play();
			        			} catch (MalformedURLException e1) {
			        				// TODO Auto-generated catch block
			        				e1.printStackTrace();
			        			} 
			        		JOptionPane output = new JOptionPane();
			        		output.showMessageDialog(null,iconfail,"You Lost~~",JOptionPane.WARNING_MESSAGE);
			        		                                                  //显示游戏失败
			        	}
			        	}
					});
				else 
					Unicase[i][j].addMouseListener(new MouseAdapter(){
						public void mouseEntered(MouseEvent e){
			        		if((!isClicked[ii][jj])&&(!flat[ii][jj]))p.setIcon(icon1);
			        	}
			        	public void mouseExited(MouseEvent e){
			        		if((!isClicked[ii][jj])&&(!flat[ii][jj]))p.setIcon(icon0);
			        	}
			        	public void mouseClicked(MouseEvent e){                           //右击标旗子
			        		if(e.getButton()==MouseEvent.BUTTON3) {
			        			if(!flat[ii][jj]) {
			        				flat[ii][jj]=true;p.setIcon(iconflat);}
			        			else {
			        				flat[ii][jj]=false;p.setIcon(icon0);}
			        			}
			        		else {
			        		if(!isClicked[ii][jj]){
			        			File file1 = new File("audio/click.wav"); 
			        		       try {
			        				AudioClip sound1 = Applet.newAudioClip(file1.toURL());
			        				sound1.play();
			        			} catch (MalformedURLException e1) {
			        				// TODO Auto-generated catch block
			        				e1.printStackTrace();
			        			} 
			        			if(bombnum[ii][jj]!=0) p.setIcon(iconnum[bombnum[ii][jj]-1]);//踩到数字非0的格子,显示格子里的数字
			        			
			        			else {														//踩到数字为0的格子
			        				boolean f=true;
			        				boolean[][] temp = new boolean[w][l]; //用于标记
			        				for(int k=0;k<w;k++)
		        						for(int g=0;g<l;g++) temp[k][g]=false;
			        				temp[ii][jj]=true;
			        				while (f){												//标记其他与这个“0”格子相连接的“0”格子
			        					f=false;
			        					for(int k=0;k<w;k++)
			        						for(int g=0;g<l;g++)
			        							if(temp[k][g]){
			        								if(k>0){
			        									if(bombnum[k-1][g]==0&&(!temp[k-1][g])) {f=true;temp[k-1][g]=true;}
			        									if(g>0) if(bombnum[k-1][g-1]==0&&(!temp[k-1][g-1])) {f=true; temp[k-1][g-1]=true;}
			        									if(g<l-1) if(bombnum[k-1][g+1]==0&&(!temp[k-1][g+1])) {f=true; temp[k-1][g+1]=true;}
			        								}
			        								if(k<w-1){
			        									if(bombnum[k+1][g]==0&&(!temp[k+1][g])) {f=true; temp[k+1][g]=true;}
			        									if(g>0) if(bombnum[k+1][g-1]==0&&(!temp[k+1][g-1])) {f=true; temp[k+1][g-1]=true;}
			        									if(g<l-1) if(bombnum[k+1][g+1]==0&&(!temp[k+1][g+1])) {f=true; temp[k+1][g+1]=true;}
			        								}
			        								if(g>0) if(bombnum[k][g-1]==0&&(!temp[k][g-1])) {f=true; temp[k][g-1]=true;}
			        								if(g<l-1) if(bombnum[k][g+1]==0&&(!temp[k][g+1])) {f=true; temp[k][g+1]=true;}
			        							}
			        				}
			        				for(int k=0;k<w;k++)												//显示所有这些“0”格子和周围的非0的格子
		        						for(int g=0;g<l;g++)
		        							if(temp[k][g]){
		        								if(!isClicked[k][g]){isClicked[k][g]=true;if(bombnum[k][g]!=0)Unicase[k][g].setIcon(iconnum[bombnum[k][g]-1]); else Unicase[k][g].setIcon(icon3);}
		        								if(k>0){
		        									if(!isClicked[k-1][g]) {isClicked[k-1][g]=true;if(bombnum[k-1][g]!=0)Unicase[k-1][g].setIcon(iconnum[bombnum[k-1][g]-1]);else Unicase[k-1][g].setIcon(icon3);}
		        									if(g>0) if(!isClicked[k-1][g-1]) {isClicked[k-1][g-1]=true;if(bombnum[k-1][g-1]!=0)Unicase[k-1][g-1].setIcon(iconnum[bombnum[k-1][g-1]-1]);else Unicase[k-1][g-1].setIcon(icon3);}
		        									if(g<l-1) if(!isClicked[k-1][g+1]) {isClicked[k-1][g+1]=true;if(bombnum[k-1][g+1]!=0)Unicase[k-1][g+1].setIcon(iconnum[bombnum[k-1][g+1]-1]);else Unicase[k-1][g+1].setIcon(icon3);}
		        								}
		        								if(k<w-1){
		        									if(!isClicked[k+1][g]) {isClicked[k+1][g]=true;if(bombnum[k+1][g]!=0)Unicase[k+1][g].setIcon(iconnum[bombnum[k+1][g]-1]);else Unicase[k+1][g].setIcon(icon3);}
		        									if(g>0) if(!isClicked[k+1][g-1]) {isClicked[k+1][g-1]=true;if(bombnum[k+1][g-1]!=0)Unicase[k+1][g-1].setIcon(iconnum[bombnum[k+1][g-1]-1]);else Unicase[k+1][g-1].setIcon(icon3);}
		        									if(g<l-1) if(!isClicked[k+1][g+1]) {isClicked[k+1][g+1]=true;if(bombnum[k+1][g+1]!=0)Unicase[k+1][g+1].setIcon(iconnum[bombnum[k+1][g+1]-1]);else Unicase[k+1][g+1].setIcon(icon3);}
		        								}
		        								if(g>0) if(!isClicked[k][g-1]) {isClicked[k][g-1]=true;if(bombnum[k][g-1]!=0)Unicase[k][g-1].setIcon(iconnum[bombnum[k][g-1]-1]);else Unicase[k][g-1].setIcon(icon3);}
		        								if(g<l-1) if(!isClicked[k][g+1]) {isClicked[k][g+1]=true;if(bombnum[k][g+1]!=0)Unicase[k][g+1].setIcon(iconnum[bombnum[k][g+1]-1]);else Unicase[k][g+1].setIcon(icon3);}
		        							}
			        			}
			        			isClicked[ii][jj] = true;
			        			boolean tempf=true;																//判断是否获胜
			        			for(int k=0;k<w;k++)
	        						for(int g=0;g<l;g++)
	        							if(isClicked[k][g]==bombrand[k][g]) tempf=false;
			        			if(tempf) {
			        				File file2 = new File("audio/win.wav"); 
			        			       try {
			        					AudioClip sound1 = Applet.newAudioClip(file2.toURL());					//获胜声音
			        					sound1.play();
			        				} catch (MalformedURLException e1) {
			        					// TODO Auto-generated catch block
			        					e1.printStackTrace();
			        				} 
			        				JOptionPane output = new JOptionPane();
			        				output.showMessageDialog(null,iconwin,"You win!!",JOptionPane.INFORMATION_MESSAGE);
			        			}
			        		}
			        	}
			        	}
					});
		}
		frame.pack( );
        frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FindBomb findBomb = new FindBomb();
	}

}
//支持原版,更多精彩尽在iJava.Sunny

//因为就用了一个晚上编的,也许没有符合一些规范要求,请助教谅解

//MouseInputAdapter,mouseClicked(MouseEvent e)
//网格结构frame GridLayout

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -