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

📄 minesquare.java

📁 这是一个java编的扫雷游戏源码
💻 JAVA
字号:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
public class MineSquare extends JPanel implements MouseListener
{ 
  int rows=10,cols=10,雷数=10;
  JButton buttonFace=null;
  Block block[][];             
  TimeCount time;              
  CountMine count;            
  String grade=null;          
  RandomSetMine 随机布雷者;
  FindAroundMineNumber 确定周围雷数者;
  FindSafeArea  找出无雷连通区者;
  DetermineDigArea 成片挖开者;
  DetermineMineMarkIsRightOrWrong 确定雷标记是否正确者;
  FindAroundMineMarkNumber 确定周围雷标数目者;
  DecideWinner 判断是否胜利者; 
  Record 记录对话框=null;
  public MineSquare(String grade,int mineNumber,int rows, int cols,JButton b,JDialog dialog)
   { 
     this.grade=grade;
     this.rows=rows;
     this.cols=cols;
     雷数=mineNumber;
     判断是否胜利者=new DecideWinner();
     记录对话框=(Record)dialog;
     block=new Block[rows+1][cols+1];
     buttonFace=b;
     time=new TimeCount();
     count=new CountMine(雷数);
     count.textShowMine.setText(""+雷数);
     setLayout(new GridLayout(rows,cols));
     for(int i=1;i<=rows;i++)
       {for(int j=1;j<=cols;j++)
         { 
           block[i][j]=new Block();
           block[i][j].设置在雷区中的位置(i,j);
         }
       }
     for(int i=1;i<=rows;i++)
       {for(int j=1;j<=cols;j++)
         { 
           add(block[i][j].label);
           block[i][j].addMouseListener(this);
         }
       }
     随机布雷者=new RandomSetMine();
     随机布雷者.随机布雷(雷数,block,rows,cols);
     确定周围雷数者=new FindAroundMineNumber();
     for(int i=1;i<=rows;i++)
       {for(int j=1;j<=cols;j++)
          {        
           确定周围雷数者.设置周围的雷数(i,j,block,rows,cols);
          }
       }
   }
 public void gameOver()
  {
      time.interrupt();
      buttonFace.setIcon(new ImageIcon("哭脸.gif"));
      for(int i=1;i<=rows;i++)
       { for(int j=1;j<=cols;j++)
          {
            block[i][j].removeMouseListener(this);
            if(block[i][j].判断是否是雷()&&block[i][j].isOpaque()&&block[i][j].探雷标记!=0)
               { 
                  block[i][j].requestFocus();
                  block[i][j].setOpaque(false);  
               }
            if(block[i][j].探雷标记==0&&!block[i][j].判断是否是雷())
               { 
                 block[i][j].requestFocus();
                 block[i][j].探雷标记=-1;   
                 block[i][j].repaint();
                 block[i][j].setIcon(new ImageIcon("探雷错误.gif")); 
               }
          }
       }
  } 
 public void mousePressed(MouseEvent e)
  { 
    boolean left=SwingUtilities.isLeftMouseButton(e);
    boolean right=SwingUtilities.isRightMouseButton(e);
    Block blockSource=(Block)e.getSource();
    boolean 雷=blockSource.判断是否是雷();
   if(left==true&&blockSource.isOpaque()==true&&blockSource.获取探雷标记()!=0)
   {   
       try{time.start();  
       }                  
       catch(Exception ee){   
       }
       if(雷==true)
          {  
           blockSource.requestFocus();
           blockSource.setOpaque(false);   
           blockSource.探雷标记=-1;
           blockSource.repaint();
           blockSource.setIcon(new ImageIcon("触雷.gif"));
           gameOver();                    
          }
       else
          {  
            buttonFace.setIcon(new ImageIcon("微笑脸.gif"));
            if(blockSource.周围无雷==false&&blockSource.获取探雷标记()!=0)  
              {
               blockSource.setOpaque(false);  
               blockSource.探雷标记=-1;
               blockSource.repaint();
              }
           
            if(blockSource.周围无雷==true&&blockSource.isOpaque())
              { 
               blockSource.setOpaque(false);     
               Point blockPoint=(Point)blockSource.获取在雷区中的位置();
               int i=blockPoint.x;
               int j=blockPoint.y;
               找出无雷连通区者=new FindSafeArea();
               Vector tree=找出无雷连通区者.确定无雷连通区(i,j,block,rows,cols);
               for(int index=0;index<tree.size();index++)
                 {  
                  Point p=(Point)tree.elementAt(index);
                  int m=p.x,n=p.y;
                  for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++)
                    { 
                      for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++)
                      {
                        if(block[k][t].探雷标记==0)
                            {  
                               gameOver();
                            }
                        else{  
                             block[k][t].requestFocus();
                             block[k][t].setOpaque(false);  
                             block[k][t].探雷标记=-1;
                             block[k][t].repaint();
                            }
                      } 
                    }
                 }
               tree.removeAllElements();                   
              }
          }
    }
   if(right)
    { 
      if(blockSource.探雷标记==0&&blockSource.isOpaque())
         {                                             
           count.countMineSub();                      
         }
      if(blockSource.探雷标记==1&&blockSource.isOpaque())
         {                                           
           count.countMineAdd();                    
         }
    }
 }
 public void mouseEntered(MouseEvent e)
  {}
 public void mouseReleased(MouseEvent e)
  { 
    boolean success=判断是否胜利者.判断是否成功(雷数,block,rows,cols);
    if(success==true)
    { 
           time.interrupt();                        
           记录对话框.setGrade(grade);             
           int spendTime=Integer.parseInt(time.textShowTime.getText());  
           记录对话框.setTime(spendTime);
          
           File f=new File("英雄榜.txt");
           try{
                FileInputStream in=new FileInputStream(f);
                ObjectInputStream object_in=new ObjectInputStream(in);
                Hashtable hashtable=(Hashtable)object_in.readObject();  
                object_in.close();
                in.close(); 
                String temp=(String)hashtable.get(grade);            
                StringTokenizer fenxi=new StringTokenizer(temp,"#"); 
                fenxi.nextToken();
                int recordTime=Integer.parseInt(fenxi.nextToken());  
                 if(spendTime<recordTime)                           
                   记录对话框.setVisible(true);                     
               }
            catch(Exception eee)
               {
               }
    } 
  }
 public void mouseExited(MouseEvent e)
  {}
 public void mouseClicked(MouseEvent e)
  {  
    if(SwingUtilities.isRightMouseButton(e)) 
    { Block blockSource=(Block)e.getSource();
      Point blockPoint=(Point)blockSource.获取在雷区中的位置();
               int i=blockPoint.x;
               int j=blockPoint.y;
      确定周围雷标数目者=new FindAroundMineMarkNumber();
      int 周围雷标数=确定周围雷标数目者.获取周围雷标记的数目(i,j,block,rows,cols);
      int 周围雷数=blockSource.获取周围的雷数();
      确定雷标记是否正确者=new DetermineMineMarkIsRightOrWrong();
      boolean correct=确定雷标记是否正确者.判断雷标记是否正确(i,j,block,rows,cols);
      if(blockSource.isOpaque()==false&&周围雷数>0&&correct)
       {  
          成片挖开者=new DetermineDigArea();
          Vector tree=成片挖开者.确定成片挖开区域(i,j,block,rows,cols);
          for(int index=0;index<tree.size();index++)
             {
                Point p=(Point)tree.elementAt(index);
                int m=p.x,n=p.y;
                for(int k=Math.max(m-1,1);k<=Math.min(m+1,rows);k++)
                   {
                    
                     for(int t=Math.max(n-1,1);t<=Math.min(n+1,cols);t++)
                      { 
                         if(block[k][t].isOpaque()&&!block[k][t].判断是否是雷()&&
                            block[k][t].探雷标记!=0)
                          {
                            block[k][t].requestFocus();
                            block[k][t].setOpaque(false);  
                            block[k][t].探雷标记=-1;
                            block[k][t].repaint();
                          }
                        repaint();
                      } 
                    }
              }
           tree.removeAllElements();
       } 
       if(blockSource.isOpaque()==false&&周围雷标数==周围雷数&&!correct)
       { 
         gameOver();                  
       }
      if((blockSource.isOpaque())==false&&(周围雷标数!=周围雷数))
       {
       }
   }
  }
}

⌨️ 快捷键说明

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