java编写的扫雷游戏 2008-07-23 10:18

字号:    

一个简单的JAVA 扫雷游戏 基本功能实现,含有背景音乐、可设置雷的数目等

 ************main****

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*主类*/

public class Main
{
 public static void main(String args[])
 {
  (new MainBomb()).show(); 
 
 }
}

//***********MainBomb*****

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

/*窗口及算法实现类*/

class MainBomb extends JFrame implements ActionListener,MouseListener
{
 
 public JTextField text; 
 public JLabel nowBomb,setBomb;
 public int BlockNum,BombNum;                                                //当前方块数当前雷数
 public Icon icon_bomb = new ImageIcon("Bomb.gif");                          //踩雷
 public Icon icon_bomb_big = new ImageIcon("bomb_big.gif");                  //踩雷标记
 public Icon icon_flag = new ImageIcon("flag.gif");                          //雷标记
 public Icon icon_question = new ImageIcon("question.gif");                  //疑惑是否有雷
 public JButton start = new JButton(" 开始 ");
 public JPanel MenuPanel = new JPanel();
 public JPanel mainPanel = new JPanel(); 
 public Bomb[][] bombButton;
 public JMenuBar mb=new JMenuBar();                    //定义菜单栏
 public JMenu m_games,m_help;                       
 public JMenuItem item1,item2,item3,item4,item5,item6;//定义菜单项
 bottomPanel bmPanel=new bottomPanel();//定义底部文本条
 Sound bkMusic = new Sound("music.mid");
 int musicFlag = 1;
 TimeLable  timelable=new TimeLable();      //定义背景音乐

 /*界面设计*/
 
 public MainBomb()
 {
  super(" JAVA课程设计-扫雷游戏 ");
  BlockNum = 100;
  BombNum = 15;
  m_games=new JMenu("游戏");
  m_help=new JMenu("帮助");
  item1=new JMenuItem("开始");
  item2=new JMenuItem("扫雷英雄榜");
  item3=new JMenuItem("音乐开关");
  item4=new JMenuItem("帮助文档");
  item5=new JMenuItem("关于扫雷");
  item6=new JMenuItem("退出");
  m_games.add(item1);
  m_games.add(item2);
  m_games.add(item3);
  m_games.add(item6);
  m_help.add(item4);
  m_help.add(item5);
  item2.addActionListener(this);
  item3.addActionListener(this);
  item4.addActionListener(this);
  item5.addActionListener(this);
  item6.addActionListener(this);
  mb.add(m_games);
  mb.add(m_help);
  Container c=getContentPane();
  setJMenuBar(mb); 
 
  
  c.setLayout(new BorderLayout());
  text=new JTextField("15 ",3);
  nowBomb = new JLabel("当前雷数"+"  "+BombNum+"");
  setBomb= new JLabel("设置地雷数10~50");

   item1.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
   
         
     BombNum = Integer.parseInt(text.getText().trim());
     if(BombNum >= 10 && BombNum < 50 )

      replay();
     else
     {
      JOptionPane msg = new JOptionPane();
      JOptionPane.showMessageDialog(null,"您设置的地雷数太多了,请重设!","错误",2);
     }
    
    }
   } );
   start.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
   
         
     BombNum = Integer.parseInt(text.getText().trim());
     if(BombNum >= 10 && BombNum < 50 )

      replay();
     else
     {
      JOptionPane msg = new JOptionPane();
      JOptionPane.showMessageDialog(null,"您设置的地雷数太多了,请重设!","错误",2);
     }
    
    }
   } );
  MenuPanel.add(setBomb);
  MenuPanel.add(text);
  MenuPanel.add(start);
  MenuPanel.add(nowBomb);
  MenuPanel.add(timelable);
 
  c.add(mainPanel,BorderLayout.CENTER);
  c.add(MenuPanel,BorderLayout.NORTH);
  c.add(bmPanel,BorderLayout.SOUTH);
 
  mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum) , (int)Math.sqrt(BlockNum)) );
  bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][];
  for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)
  {
   bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ];
  }
  for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )
   for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ )
   {
    bombButton[ i ][ j ]=new Bomb(i,j);
    bombButton[ i ][ j ].setForeground( Color.gray);
    bombButton[ i ][ j ].addActionListener(this);
    bombButton[ i ][ j ].addMouseListener(this);
   }
  for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )
   for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ )
    mainPanel.add(bombButton[ i ][ j ]);
  bkMusic.loop();
  bkMusic.play();
  startBomb();
  setSize(450,450);
  setLocation(350,200);
  setResizable(true);
 }
 
 /*布雷*/
 
 public void startBomb()
 {
 
  for(int i=0;i<BombNum;i++)
  {
   int x =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1)); 
   int y =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));
  
   if(bombButton[ x ][ y ].isBomb==true)
    i--;
   else
    bombButton[ x ][ y ].isBomb=true ;
  }
 }
 
 /*重新开始*/
 
 public void replay()
 {
  nowBomb.setText("当前雷数"+"  "+BombNum+"");
  for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)
   for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++)
   {
    bombButton[ i ][ j ].isBomb=false;
    bombButton[ i ][ j ].isClicked=false;
    bombButton[ i ][ j ].setEnabled(true);
    bombButton[ i ][ j ].setText("");
    bombButton[ i ][ j ].setIcon(null);
   }
   startBomb();
 }
 
 /*是否挖完了所有的雷*/
 
 public void isWin()
 {
  int findBomb=0;  //找到的地雷数

  for(int i = 0;i < (int)Math.sqrt(BlockNum) ; i++)
for(int j = 0;j < (int)Math.sqrt(BlockNum ); j++)
   {
    if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight == true)
     findBomb++;
   }
  if( findBomb == Integer.parseInt(text.getText().trim()) )
  {
   JOptionPane msg = new JOptionPane();
   JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!","您胜利了",2);
  }
 }
 
 /*计算方块周围雷数 */
 
 public void CountRoundBomb()
 {
  for (int i = 0; i < (int)Math.sqrt(BlockNum); i++) {
   for (int j = 0; j < (int)Math.sqrt(BlockNum); j++) {
    int count = 0;
    //当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数
    if (bombButton[ i ][ j ].isBomb != true) {
     if ( (i - 1 >= 0) && (j - 1 >= 0)) {
      if (bombButton[i - 1][j - 1].isBomb == true) {
       count += 1; //检测左上方空格是否是地雷
      }
     }
     if ( (i - 1 >= 0)) {
      if (bombButton[i - 1][ j ].isBomb == true) {
       count += 1; //检测上方空格是否为地雷
      }
     }
     if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
      if (bombButton[i - 1][j + 1] .isBomb == true) {
       count += 1; //检测右上方是否为地雷
      }
     }
     if ( (j - 1 >= 0)) {
      if (bombButton[ i ][j - 1] .isBomb == true) {
       count += 1; //检测左边是否为地雷
      }
     }
     if ( (i >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {
      if (bombButton[ i ][j + 1].isBomb == true) {
       count += 1; //右边
      }
     }
     if ( (j - 1 >= 0) && (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
      if (bombButton[i + 1][j - 1].isBomb == true) {
       count += 1; //左下
      }
     }
     if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {
      if (bombButton[i + 1][ j ].isBomb == true) {
       count += 1; //下
      }
   }
     if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) && (i + 1 <= Math.sqrt(BlockNum)-1)) {
      if (bombButton[i + 1][j + 1].isBomb == true) {
       count += 1; //右下
      }
     }
     bombButton[ i ][ j ].BombRoundCount = count;
    }
   }
  }
 }
 
 /**当选中的位置为空,则翻开周围的地图**/
 
 public void isNull(Bomb[][] bombButton,Bomb ClickecButton)
 {
  int i,j;
  i=ClickecButton.num_x;
  j=ClickecButton.num_y;
 
  if (ClickecButton.isBomb==true) {
  
  }
  else {
  
   if ( (i - 1 >= 0) && (j - 1 >= 0)) { //检测左上方空格是否是空
    if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j - 1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) {
     bombButton[i - 1][j - 1].setText((bombButton[i - 1][j - 1].BombRoundCount)+"");
     bombButton[i - 1][j - 1].setEnabled(false);
     bombButton[i - 1][j - 1].isClicked=true;
    }
   }
  
   if ( (i - 1 >= 0)) { //检测上方空格是否为空
    if (bombButton[i - 1][ j ] .isBomb == false && bombButton[i - 1][ j ].isClicked == false && bombButton[i - 1][ j ].isRight == false) {
     bombButton[i - 1][ j ].setText((bombButton[i - 1][ j ].BombRoundCount)+"");
     bombButton[i - 1][ j ].setEnabled(false);
     bombButton[i - 1][ j ].isClicked=true;
    }
   }
   if ( (i - 1 >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右上方是否为空
    if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j + 1].isClicked == false && bombButton[i - 1][j + 1].isRight == false) {
     bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+"");
     bombButton[i - 1][j + 1].setEnabled(false);
     bombButton[i - 1][j + 1].isClicked=true;
    }
   
   }
   if ( (j - 1 >= 0)) { //检测左边是否为空
    if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j - 1].isClicked == false && bombButton[ i ][j - 1].isRight == false) {
     bombButton[ i ][j - 1].setText((bombButton[ i ][j - 1].BombRoundCount)+"");
     bombButton[ i ][j - 1].setEnabled(false);
     bombButton[ i ][j - 1].isClicked=true;
  }
   
   }
   if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右边空格是否是空
    if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j + 1].isClicked == false && bombButton[ i ][j + 1].isRight == false) {
     bombButton[ i ][j + 1].setText((bombButton[ i ][j + 1].BombRoundCount)+"");
     bombButton[ i ][j + 1].setEnabled(false);
     bombButton[ i ][j + 1].isClicked=true;
    }
   }
   if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测左下空格是否是空
    if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j - 1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) {
     bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+"");
     bombButton[i + 1][j - 1].setEnabled(false);
     bombButton[i + 1][j - 1].isClicked=true;
    }
   }
   if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测下边空格是否是空
    if (bombButton[i + 1][ j ].isBomb == false && bombButton[i + 1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) {
     bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+"");
     bombButton[i + 1][ j ].setEnabled(false);
     bombButton[i + 1][ j ].isClicked=true;
    }
   }
   if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { //检测右下边空格是否是空
    if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j + 1].isClicked == false && bombButton[i + 1][j + 1].isRight == false) {
     bombButton[i + 1][j + 1].setText((bombButton[i + 1][j + 1].BombRoundCount)+"");
     bombButton[i + 1][j + 1].setEnabled(false);
     bombButton[i + 1][j + 1].isClicked=true;
    }
   }
   if ( (i - 1 >= 0) && (j - 1 >= 0))//检测左上
    isNull(bombButton,bombButton[i - 1][j - 1]);
   if ( (i - 1 >= 0))
    isNull( bombButton,bombButton[i - 1][ j ]);//检测上方
   if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1))
    isNull( bombButton,bombButton[i - 1][j + 1]);//检测右上
   if ( (j - 1 >= 0))
    isNull(bombButton,bombButton[i][j - 1]);//检测左边
   if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) )
 isNull(bombButton,bombButton[i][j + 1]);//检测右边
   if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) )
    isNull(bombButton,bombButton[i + 1][j - 1]); //检测左下
   if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) //检测下
    isNull(bombButton,bombButton[i + 1][ j ]);
   if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) //检测右下
    isNull(bombButton,bombButton[i + 1][j + 1]);
  
  }
 }
 
 public void actionPerformed(ActionEvent e)
 { try{
  if(e.getSource()==item5){
   JOptionPane.showMessageDialog(null,"JAVA扫雷游戏\n霍雷 制作\n");
  }
  if(e.getSource()==item3){
   musicFlag++;
   if(musicFlag%2==0)
   bkMusic.stop();
   else
   {
    bkMusic.loop();
    bkMusic.play();
   }
  }

 if(e.getSource()==item6){
  System.exit(0);
 }
 if(e.getSource()==item2){
  JOptionPane.showMessageDialog(null,"第一名:999秒\n第二名:999秒\n第三名:999秒\n");
 }
 if (e.getSource()==item4)
 {
  JOptionPane.showMessageDialog(null,"这是一个和Microsoft出品的扫雷基本上一样的扫\n雷游戏,所以很多帮助可以参照Microsoft的扫\n雷,只是有几个地方不同,说明如下:\n\n 1.用左键代替了原扫雷的双键功能,使之操作\n起来更方便!\n\n 2.增加了雷区的大小调整,使之可能适用\n现在不用的显示器! \n\n 3.扫雷是一个智力和运气并存的游戏,有时我\n们真的难以确认,难道真的要以身试险吗?这时你\n可以在菜单上打开提示功能,然后如下操作:\n\n A.在你不能确定的区域的附近如果有打开\n的区域,这时先按下鼠标左键,再按下鼠标右键,\n再依次松开左键和右键!\n\n B.这是你会发现在周围的八个没有揭开没\n有标记的区域,变成凹陷状态,这是用鼠标左键点\n凹陷区域,如果有雷则不会点开,并且周围会变成\n凹陷状态,可以继续点下 " );

 }     
 
 
 
  if(((Bomb)e.getSource()).isBomb==false && ((Bomb)e.getSource()).isClicked == false)
  {
   ((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount )+"");
   ((Bomb)e.getSource()).isClicked=true;
   ((Bomb)e.getSource()).setIcon(null);
   ((Bomb)e.getSource()).setEnabled(false);
   if((((Bomb)e.getSource()).BombRoundCount) == 0)
    isNull(bombButton,(Bomb)e.getSource());
   isWin();
  }
  else if(((Bomb)e.getSource()).isBomb == true)
  {
  
   for(int i=0;i<(int)Math.sqrt(BlockNum);i++)
    for(int j=0;j<(int)Math.sqrt(BlockNum);j++)
    {
     if(bombButton[ i ][ j ].isBomb == true)
      bombButton[ i ][ j ].setIcon(icon_bomb);
    }
  
   ((Bomb)e.getSource()).setIcon(icon_bomb_big);
  
   JOptionPane msg = new JOptionPane();
   JOptionPane.showMessageDialog(this,"你踩到地雷了,按确定重来","你踩到地雷了",2);
 
  
   replay();
  } }catch(Exception e1){}
 }
 
 public void mouseClicked(MouseEvent e)
 {
  Bomb bombSource = (Bomb)e.getSource();
  boolean right = SwingUtilities.isRightMouseButton(e);
 
  if((right == true) && (bombSource.isClicked == false))
  {
   bombSource.BombFlag = (bombSource.BombFlag + 1)%3;
   if(bombSource.BombFlag == 1)
   {
   
    if(BombNum > 0 && bombSource.isRight == false ){
     bombSource.setIcon(icon_flag);
     bombSource.isRight = true;
     BombNum--;
    }
    isWin();
    nowBomb.setText("当前雷数"+"  "+BombNum+"");
   }
   else if(bombSource.BombFlag == 2)
   {
   
    if( (BombNum !=0 ) ||(BombNum ==0 &&(bombSource.getIcon()==icon_flag)) )
  BombNum++;
    bombSource.setIcon(icon_question);
    nowBomb.setText("当前雷数"+"  "+BombNum+"");
   }
   else if(bombSource.BombFlag == 0)
   { 
    bombSource.setIcon(null);
    bombSource.isRight = false;
   }
  }
 }
 
 public void mouseEntered(MouseEvent e)
 {}
 public void mouseReleased(MouseEvent e)
 {}
 public void mouseExited(MouseEvent e)
 {}
 public void mousePressed(MouseEvent e)
 {}
}

class bottomPanel extends JPanel implements ActionListener   //底部文本框设置
{
 javax.swing.Timer time=new javax.swing.Timer(50,this);
 int x=0;
 int y=9; 
 String str;
 
 public void setTime()
 {
  Calendar calendar=new GregorianCalendar(); 
  str="欢迎使用此软件   计051班 霍雷";
  
 }
 public bottomPanel(){
  
  time.start();
 }
 public void actionPerformed(ActionEvent e){  
  this.repaint();
  
 }
 
 protected void paintComponent(Graphics g){
  super.paintComponent(g);
  x+=1;
  if(x==300)x=0;
  this.setTime();
  g.drawString(str,x,y);
 }
}

 

class TimeLable extends JPanel implements ActionListener{
 int hour=0;
 int minutes=0;
 int seconds=0;
 public static String message="";
 javax.swing.Timer timer=new javax.swing.Timer(1000,this);
 void setTime(){
  Calendar calendar=new GregorianCalendar();
  hour=calendar.getTime().getHours();
  minutes=calendar.getTime().getMinutes();
  seconds=calendar.getTime().getSeconds();
  message="TIME IS:  "+hour+":"+minutes+":"+seconds;
 }
 
 public TimeLable(){
  this.add(new JLabel("                                   "));
  timer.start();    
 }
 public void actionPerformed(ActionEvent e){
  repaint();
 }
 public void paintComponent(Graphics g){
  super.paintComponent(g);
  this.setTime();
  g.drawString(message,5,18);
 }
}
//***************Bomb************

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*按扭类*/

class Bomb extends JButton 
{
 
 public int num_x,num_y;       //第几号方块
 public int BombRoundCount;    //周围雷数
 public boolean isBomb;        //是否为雷
 public boolean isClicked;     //是否被点击
 public int BombFlag;          //探雷标记
 public boolean isRight;       //是否点击右键
 
 public Bomb(int x,int y)
 {
  BombFlag = 0;
  num_x = x;
  num_y = y;
  BombRoundCount = 0;
  isBomb = false;
  isClicked = false;
  isRight = false;
 }
}

******************Sound***********  //背景音乐

import java.awt.*;
import java.applet.*;
import java.awt.Graphics;
import java.applet.AudioClip;
import java.net.URL;
import java.net.MalformedURLException;
import java.net.URLClassLoader;

public class Sound
{
 Applet ap;
 URL url;
 AudioClip soundData = null;
 public boolean hasPlayed;
 
 public Sound(String soundfile)
 {
  hasPlayed = true;
  ap = new Applet();
  
  try{
   URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
   url = urlLoader.findResource("music/"+soundfile);
  }catch(Exception e){
   url = null;
   System.err.print(e.getMessage());
  }
  getMedia();
 }
 public void getMedia()
 {
  if(url != null && soundData ==null)
  {
   soundData = ap.newAudioClip(url);
  }
  if(soundData == null){
   System.out.println("erroe");
  }
 }
 public void play()
 {
  soundData.play();
  hasPlayed = true;
 }
 public void loop()
 {
  soundData.loop();
  hasPlayed = true;
 }
 public void stop()
 {
  soundData.stop();
  hasPlayed = false;
 }
 public static void main(String[] args)
 {
  new Sound("Dominating.mp3").play();
 }
}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009