📄 findbomb.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 + -