使用Java实现三种等级的扫雷游戏(完整版)

作者:陈橘又青 时间:2023-05-10 07:34:17 

一、效果展示

初级难度

使用Java实现三种等级的扫雷游戏(完整版)

中级难度

使用Java实现三种等级的扫雷游戏(完整版)

高级难度

使用Java实现三种等级的扫雷游戏(完整版)

测试界面

使用Java实现三种等级的扫雷游戏(完整版)

二、项目介绍

项目背景

扫雷是一款大众类的益智小游戏。根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏通过简单的玩法,加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力。

功能分析

完成 难度选择,雷随机生成,数字生成,左右键翻开 等功能实现

游戏四种状态: 难度选择、游戏状态、游戏胜利、游戏失败

游戏难度: 初级、中级、高级(不同难度对应不同的雷区大小和雷数量)

游戏核心: 二维数组 的相关操作

其他: 窗口绘制、界面规划、操作计数、重新开始。

三、代码展示

图形界面设计(gui包)

主类:AppWindows类

AppWindow类负责创建游戏的主窗口,该类含有main方法,程序从该类开始执行。

package ch8.gui;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import ch8.view.MineArea;
import ch8.view.ShowRecord;
public class AppWindow extends JFrame implements MenuListener,ActionListener{
    JMenuBar bar;
    JMenu fileMenu;
    JMenu gradeOne,gradeTwo,gradeThree;//扫雷级别
    JMenuItem gradeOneList,gradeTwoList,gradeThreeList;//初,中,高级英雄榜
    MineArea mineArea=null;                //扫雷区域
    ShowRecord showHeroRecord=null;        //查看英雄榜
    public AppWindow(){
        bar=new JMenuBar();
        fileMenu=new JMenu("扫雷游戏");
        gradeOne=new JMenu("初级");
        gradeTwo=new JMenu("中级");
        gradeThree=new JMenu("高级");
        gradeOneList=new JMenuItem("初级英雄榜");
        gradeTwoList=new JMenuItem("中级英雄榜");
        gradeThreeList=new JMenuItem("高级英雄榜");
        gradeOne.add(gradeOneList);
        gradeTwo.add(gradeTwoList);
        gradeThree.add(gradeThreeList);
        fileMenu.add(gradeOne);
        fileMenu.add(gradeTwo);
        fileMenu.add(gradeThree);
        bar.add(fileMenu);
        setJMenuBar(bar);
        gradeOne.addMenuListener(this);
        gradeTwo.addMenuListener(this);
        gradeThree.addMenuListener(this);
        gradeOneList.addActionListener(this);
        gradeTwoList.addActionListener(this);
        gradeThreeList.addActionListener(this);
        mineArea=new MineArea(9,9,10,gradeOne.getText());//创建初级扫雷区
        add(mineArea,BorderLayout.CENTER);
        showHeroRecord=new ShowRecord();
        setBounds(300,100,500,450);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        validate();
    }
    public void menuSelected(MenuEvent e){
       if(e.getSource()==gradeOne){
             mineArea.initMineArea(9,9,10,gradeOne.getText());
             validate();
       }
       else if(e.getSource()==gradeTwo){
             mineArea.initMineArea(16,16,40,gradeTwo.getText());
             validate();
       }
       else if(e.getSource()==gradeThree){
             mineArea.initMineArea(22,30,99,gradeThree.getText());
             validate();
       }
    }
    public void menuCanceled(MenuEvent e){}
    public void menuDeselected(MenuEvent e){}
    public void actionPerformed(ActionEvent e){
       if(e.getSource()==gradeOneList){
             showHeroRecord.setGrade(gradeOne.getText());
             showHeroRecord.showRecord();
       }
       else if(e.getSource()==gradeTwoList){
             showHeroRecord.setGrade(gradeTwo.getText());
             showHeroRecord.showRecord();
       }
       else if(e.getSource()==gradeThreeList){
             showHeroRecord.setGrade(gradeThree.getText());
             showHeroRecord.showRecord();
       }
   }
   public static void main(String args[]){
       new AppWindow();
   }
}

用户操作设计(data包)

Block类

package ch8.data;
import javax.swing.ImageIcon;
public class Block {
    String name;                   //名字,比如"雷"或数字
    int aroundMineNumber;          //如果不是类,此数据是周围雷的数目
    ImageIcon mineIcon;            //雷的图标
    public boolean isMine=false;   //是否是雷
    boolean isMark=false;          //是否被标记
    boolean isOpen=false;          //是否被挖开
    ViewForBlock  blockView;       //方块的视图
    public void setName(String name) {
        this.name=name;
    }
    public void setAroundMineNumber(int n) {
        aroundMineNumber=n;
    }
    public int getAroundMineNumber() {
        return aroundMineNumber;
    }
    public String getName() {
        return name;  
    }
    public boolean isMine() {
        return isMine;
    }
    public void setIsMine(boolean b) {
        isMine=b;
    }
    public void setMineIcon(ImageIcon icon){
        mineIcon=icon;
    }
    public ImageIcon getMineicon(){
        return mineIcon;
    }
    public boolean getIsOpen() {
        return isOpen;
    }
    public void setIsOpen(boolean p) {
        isOpen=p;
    }
    public boolean getIsMark() {
        return isMark;
    }
    public void setIsMark(boolean m) {
        isMark=m;
    }
    public void setBlockView(ViewForBlock view){
       blockView = view;
       blockView.acceptBlock(this);
    }
    public ViewForBlock getBlockView(){
       return  blockView ;
    }
}

LayMines类

package ch8.data;
import java.util.LinkedList;
import javax.swing.ImageIcon;
public class LayMines {  
    ImageIcon mineIcon;
    public LayMines() {
         mineIcon=new ImageIcon("扫雷图片/mine.gif");
    }
    public void initBlock(Block [][] block){
        for(int i=0;i<block.length;i++) {
            for(int j=0;j<block[i].length;j++)
               block[i][j].setIsMine(false);
        }
    }
    public void layMinesForBlock(Block [][] block,int mineCount){ //在雷区布置mineCount个雷
        initBlock(block);       //先都设置是无雷
        int row=block.length;
        int column=block[0].length;
        LinkedList<Block> list=new LinkedList<Block>();
        for(int i=0;i<row;i++) {
            for(int j=0;j<column;j++)
               list.add(block[i][j]);
        }
        while(mineCount>0){                  //开始布雷
           int size=list.size();             // list返回节点的个数
           int randomIndex=(int)(Math.random()*size);
           Block b=list.get(randomIndex);
           b.setIsMine(true);
           b.setName("雷");
           b.setMineIcon(mineIcon);
           list.remove(randomIndex);        //list删除索引值为randomIndex的节点
           mineCount--;
       }
       for(int i=0;i<row;i++){             //检查布雷情况,标记每个方块周围的雷的数目
          for(int j=0;j<column;j++){
             if(block[i][j].isMine()){
                block[i][j].setIsOpen(false);
                block[i][j].setIsMark(false);
             }
             else {
                int mineNumber=0;
                for(int k=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++) {
                      for(int t=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){
                         if(block[k][t].isMine())
                             mineNumber++;
                      }
                }
                block[i][j].setIsOpen(false);
                block[i][j].setIsMark(false);      
                block[i][j].setName(""+mineNumber);
                block[i][j].setAroundMineNumber(mineNumber); //设置该方块周围的雷数目
             }
          }
       }    
   }
}

PeopleScoutMine类

package ch8.data;
import java.util.Stack;
public class PeopleScoutMine {
  public Block [][] block;    //雷区的全部方块
  Stack<Block>  notMineBlock; //存放一个方块周围区域内不是雷的方块
  int m,n ;                   //方块的索引下标
  int row,colum;              //雷区的行和列
  int mineCount;              //雷的数目
  public PeopleScoutMine(){
      notMineBlock = new Stack<Block>();
  }
  public void setBlock(Block [][] block,int mineCount){
      this.block = block;
      this.mineCount =  mineCount;
      row = block.length;
      colum = block[0].length;
  }
  public Stack<Block> getNoMineAroundBlock(Block bk){//得到方块bk附近区域不是雷的方块
      notMineBlock.clear();
      for(int i=0;i<row;i++) {   //寻找bk在雷区block中的位置索引
            for(int j=0;j<colum;j++) {
              if(bk == block[i][j]){
                 m=i;
                 n=j;
                 break;
              }
            }
       }
       if(!bk.isMine()) {     //方块不是雷
           show(m,n);        //见后面的递归方法
       }
       return notMineBlock;
  }
  public void show(int m,int n) {
     if(block[m][n].getAroundMineNumber()>0&&block[m][n].getIsOpen()==false){
         block[m][n].setIsOpen(true);
         notMineBlock.push(block[m][n]); //将不是雷的方块压栈
         return;
     }
     else if(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){
         block[m][n].setIsOpen(true);
         notMineBlock.push(block[m][n]); //将不是雷的方块压栈
         for(int k=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++) {
            for(int t=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++)
                show(k,t);
         }
     }      
  }
  public boolean verifyWin(){
      boolean isOK = false;
      int number=0;
      for(int i=0;i<row;i++) {
          for(int j=0;j<colum;j++) {
             if(block[i][j].getIsOpen()==false)
                number++;
          }
      }
      if(number==mineCount){
          isOK =true;
      }
      return isOK;
  }
}

RecordOrShowRecord类

package ch8.data;
import java.sql.*;
public class RecordOrShowRecord{
  Connection con;
  String tableName ;
  int heroNumber   = 3;   //英雄榜显示的最多英雄数目
  public  RecordOrShowRecord(){
     try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
     }
     catch(Exception e){}
  }
  public void setTable(String str){
     tableName = "t_"+str;
     connectDatabase();//连接数据库

try {
         Statement sta = con.createStatement();
         String SQL="create table "+tableName+
        "(p_name varchar(50) ,p_time int)";
         sta.executeUpdate(SQL);//创建表
         con.close();
     }
     catch(SQLException e) {//如果表已经存在,将触发SQL异常,即不再创建该表
     }
  }
  public boolean addRecord(String name,int time){
      boolean ok  = true;
     if(tableName == null)
        ok = false;
     //检查time是否达到标准(进入前heroNumber名),见后面的verifyScore方法:
      int amount = verifyScore(time);
      if(amount >= heroNumber) {
         ok = false;  
      }
      else {
         connectDatabase();  //连接数据库
         try {
            String SQL ="insert into "+tableName+" values(?,?)";
            PreparedStatement sta  = con.prepareStatement(SQL);
            sta.setString(1,name);
            sta.setInt(2,time);
            sta.executeUpdate();
            con.close();
            ok = true;
         }
         catch(SQLException e) {
            ok = false;
         }
      }
      return ok;
  }
  public String [][] queryRecord(){
     if(tableName == null)
        return null;
     String [][] record  = null;
     Statement sql;
     ResultSet rs;
     try {
       sql=
       con.createStatement
      (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
       String str = "select * from "+tableName+" order by p_time ";
       rs=sql.executeQuery(str);
       boolean boo =rs.last();
       if(boo == false)
          return null;
       int recordAmount =rs.getRow();//结果集中的全部记录
       record = new String[recordAmount][2];
       rs.beforeFirst();
       int i=0;
       while(rs.next()) {
         record[i][0] = rs.getString(1);
         record[i][1] = rs.getString(2);
         i++;
       }
       con.close();
     }
     catch(SQLException e) {}
     return record;
  }
  private void connectDatabase(){
     try{  
        String uri ="jdbc:derby:record;create=true";
        con=DriverManager.getConnection(uri); //连接数据库,如果不存在就创建

}
     catch(Exception e){}
  }
  private int verifyScore(int time){
     if(tableName == null)
        return Integer.MAX_VALUE ;
     connectDatabase();    //连接数据库
     Statement sql;
     ResultSet rs;
     int amount = 0;
     String str =
     "select * from "+tableName+" where p_time < "+time;
     try {
       sql=con.createStatement();
       rs=sql.executeQuery(str);
       while(rs.next()){
          amount++;
       }                        
       con.close();
     }
     catch(SQLException e) {}
     return amount;
  }
}

ViewForBlock接口

package ch8.data;
public interface ViewForBlock {
   public void acceptBlock(Block block);//确定是哪个方块的视图
   public void setDataOnView(); //设置视图上需要显示的数据
   public void seeBlockNameOrIcon();//显示图标方块上的名字或
   public void seeBlockCover();     //显示视图上负责遮挡的组件
   public Object getBlockCover();   //得到视图上的遮挡组件
}

游戏视图设计(view包)

BlockView类

package ch8.view;
import javax.swing.*;
import java.awt.*;
import ch8.data.*;
public class BlockView extends JPanel implements ViewForBlock{
    JLabel blockNameOrIcon; //用来显示Block对象的name、number和mineIcon属性
    JButton blockCover;     //用来遮挡blockNameOrIcon.
    CardLayout card;        //卡片式布局
    Block block ;           //被提供视图的方块
    BlockView(){
       card=new CardLayout();
       setLayout(card);
       blockNameOrIcon=new JLabel("",JLabel.CENTER);
       blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER);
       blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER);
       blockCover=new JButton();
       add("cover",blockCover);
       add("view",blockNameOrIcon);
    }
    public void acceptBlock(Block block){
        this.block = block;
    }
    public void setDataOnView(){
       if(block.isMine()){
          blockNameOrIcon.setText(block.getName());
          blockNameOrIcon.setIcon(block.getMineicon());
       }
       else {
          int n=block.getAroundMineNumber();
          if(n>=1)
            blockNameOrIcon.setText(""+n);
          else
            blockNameOrIcon.setText(" ");
       }
    }
    public void seeBlockNameOrIcon(){
       card.show(this,"view");
       validate();
    }
    public void seeBlockCover(){
       card.show(this,"cover");
       validate();
    }
    public JButton getBlockCover(){
       return blockCover;
    }
}

MineArea类

package ch8.view;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import ch8.data.*;
import java.util.Stack;
public class MineArea extends JPanel implements ActionListener,MouseListener{
    JButton reStart;
    Block [][] block;                  //雷区的方块
    BlockView [][] blockView;          //方块的视图
    LayMines lay;                      //负责布雷
    PeopleScoutMine peopleScoutMine;   //负责扫雷
    int row,colum,mineCount,markMount;//雷区的行数、列数以及地雷个数和用户给出的标记数
    ImageIcon mark;                   //探雷作的标记
    String grade;                     //游戏级别
    JPanel pCenter,pNorth;            //布局用的面板
    JTextField showTime,showMarkedMineCount; //显示用时和探雷作的标记数目(不一定是雷哦)
    Timer time;                          //计时器
    int spendTime=0;                     //扫雷的用时
    Record record;                       //负责记录到英雄榜
    PlayMusic playMusic;                 //负责播放雷 * 的声音
    public MineArea(int row,int colum,int mineCount,String grade) {
        record = new Record(); //负责保存成绩到英雄榜
        reStart=new JButton("重新开始");
        mark=new ImageIcon("扫雷图片/mark.png");  //探雷标记
        time=new Timer(1000,this);                //计时器,每个一秒触发ActionEvent事件一次
        showTime=new JTextField(5);
        showMarkedMineCount=new JTextField(5);
        showTime.setHorizontalAlignment(JTextField.CENTER);
        showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);
        showMarkedMineCount.setFont(new Font("Arial",Font.BOLD,16));
        showTime.setFont(new Font("Arial",Font.BOLD,16));        
        pCenter=new JPanel();
        pNorth=new JPanel();
        lay=new LayMines();                      //创建布雷者
        peopleScoutMine = new PeopleScoutMine(); //创建扫雷者
        initMineArea(row,colum,mineCount,grade); //初始化雷区,见下面的initMineArea方法
        reStart.addActionListener(this);
        pNorth.add(new JLabel("剩余雷数(千万别弄错啊):"));
        pNorth.add(showMarkedMineCount);
        pNorth.add(reStart);
        pNorth.add(new JLabel("用时:"));
        pNorth.add(showTime);
        setLayout(new BorderLayout());
        add(pNorth,BorderLayout.NORTH);
        add(pCenter,BorderLayout.CENTER);
        playMusic = new PlayMusic();              //负责播放触雷 * 的声音
        playMusic.setClipFile("扫雷图片/mine.wav");
   }
   public void initMineArea(int row,int colum,int mineCount,String grade){
      pCenter.removeAll();
      spendTime=0;
      markMount=mineCount;
      this.row=row;
      this.colum=colum;
      this.mineCount=mineCount;
      this.grade=grade;
      block=new Block[row][colum];
      for(int i=0;i<row;i++){
        for(int j=0;j<colum;j++)
             block[i][j]=new Block();
      }
      lay.layMinesForBlock(block,mineCount);     //布雷
      peopleScoutMine.setBlock(block,mineCount); //准备扫雷  
      blockView=new BlockView[row][colum];       //创建方块的视图
      pCenter.setLayout(new GridLayout(row,colum));
      for(int i=0;i<row;i++) {
         for(int j=0;j<colum;j++) {
              blockView[i][j]=new BlockView();
              block[i][j].setBlockView(blockView[i][j]); //方块设置自己的视图
              blockView[i][j].setDataOnView();  //将block[i][j]的数据放入视图
              pCenter.add(blockView[i][j]);
              blockView[i][j].getBlockCover().addActionListener(this);//注册监视器
              blockView[i][j].getBlockCover().addMouseListener(this);
              blockView[i][j].seeBlockCover(); //初始时盖住block[i][j]的数据信息
              blockView[i][j].getBlockCover().setEnabled(true);
              blockView[i][j].getBlockCover().setIcon(null);
         }
      }
     showMarkedMineCount.setText(""+markMount);
     repaint();
   }
  public void setRow(int row){
      this.row=row;
  }
  public void setColum(int colum){
      this.colum=colum;
  }
  public void setMineCount(int mineCount){
      this.mineCount=mineCount;
  }
  public void setGrade(String grade) {
      this.grade=grade;
  }
  public void actionPerformed(ActionEvent e) {
       if(e.getSource()!=reStart&&e.getSource()!=time) {
         time.start();
         int m=-1,n=-1;
         for(int i=0;i<row;i++) { //找到单击的方块以及它的位置索引
            for(int j=0;j<colum;j++) {
              if(e.getSource()==blockView[i][j].getBlockCover()){
                 m=i;
                 n=j;
                 break;
              }
            }
         }
         if(block[m][n].isMine()) { //用户输掉游戏
            for(int i=0;i<row;i++) {
               for(int j=0;j<colum;j++) {
                  blockView[i][j].getBlockCover().setEnabled(false);//用户单击无效了
                  if(block[i][j].isMine())
                     blockView[i][j].seeBlockNameOrIcon(); //视图显示方块上的数据信息
               }
            }
            time.stop();
            spendTime=0;             //恢复初始值
            markMount=mineCount;      //恢复初始值
            playMusic.playMusic();    //播放类 * 的声音
        }
        else {  //扫雷者得到block[m][n]周围区域不是雷的方块
            Stack<Block> notMineBlock =peopleScoutMine.getNoMineAroundBlock(block[m][n]);
            while(!notMineBlock.empty()){
               Block bk = notMineBlock.pop();
               ViewForBlock viewforBlock = bk.getBlockView();
               viewforBlock.seeBlockNameOrIcon();//视图显示方块上的数据信息
               System.out.println("ookk");
            }
        }
     }
     if(e.getSource()==reStart) {
        initMineArea(row,colum,mineCount,grade);
        repaint();
        validate();
     }
     if(e.getSource()==time){
        spendTime++;
        showTime.setText(""+spendTime);
     }
     if(peopleScoutMine.verifyWin()) {  //判断用户是否扫雷成功
        time.stop();
        record.setGrade(grade);        
        record.setTime(spendTime);
        record.setVisible(true);       //弹出录入到英雄榜对话框
     }
   }
   public void mousePressed(MouseEvent e){ //探雷:给方块上插一个小旗图标(再次单击取消)
       JButton source=(JButton)e.getSource();
       for(int i=0;i<row;i++) {
           for(int j=0;j<colum;j++) {
             if(e.getModifiers()==InputEvent.BUTTON3_MASK&&
                source==blockView[i][j].getBlockCover()){
                if(block[i][j].getIsMark()) {
                       source.setIcon(null);
                       block[i][j].setIsMark(false);
                       markMount=markMount+1;
                       showMarkedMineCount.setText(""+markMount);
                }
                else{
                       source.setIcon(mark);
                       block[i][j].setIsMark(true);
                       markMount=markMount-1;
                       showMarkedMineCount.setText(""+markMount);
                }
             }    
           }
       }
  }
  public void mouseReleased(MouseEvent e){}
  public void mouseEntered(MouseEvent e){}
  public void mouseExited(MouseEvent e){}
  public void mouseClicked(MouseEvent e){}
}

PlayMusic类

package ch8.view;
import java.net.URI;
import java.net.URL;
import java.io.File;
import java.applet.Applet;
import java.applet.AudioClip;
public class PlayMusic implements Runnable {
     String musicName;
     Thread threadPlay;
     AudioClip clip = null;
     public PlayMusic(){
        threadPlay = new Thread(this);
     }
     public void run() {
         clip.play();
     }
     public void playMusic(){
         threadPlay = new Thread(this);
         try{
            threadPlay.start();
         }
         catch(Exception exp) {}    
     }
     public void setClipFile(String name){
          musicName = name;
         if(musicName == null)
            musicName = "扫雷图像/mine.wav";
         File file=new File(musicName);
         try { URI uri=file.toURI();
               URL url=uri.toURL();
               clip=Applet.newAudioClip(url);
         }
         catch(Exception ee){}
     }
}

Record类

package ch8.view;
import javax.swing.*;
import java.awt.event.*;
import ch8.data.RecordOrShowRecord;
public class Record extends JDialog implements ActionListener{
  int time=0;
  String grade=null;
  String key=null;
  String message=null;
  JTextField textName;
  JLabel label=null;
  JButton confirm,cancel;
  public Record(){
     setTitle("记录你的成绩");
     this.time=time;
     this.grade=grade;
     setBounds(100,100,240,160);
     setResizable(false);
     setModal(true);
     confirm=new JButton("确定");
     cancel=new JButton("取消");
     textName=new JTextField(8);
     textName.setText("匿名");
     confirm.addActionListener(this);
     cancel.addActionListener(this);
     setLayout(new java.awt.GridLayout(2,1));
     label=new JLabel("输入您的大名看是否可上榜");
     add(label);
     JPanel p=new JPanel();
     p.add(textName);
     p.add(confirm);
     p.add(cancel);
     add(p);
     setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
 }
 public void setGrade(String grade){
     this.grade=grade;
 }
 public void setTime(int time){
     this.time=time;
 }
 public void actionPerformed(ActionEvent e){
    if(e.getSource()==confirm){
        String name = textName.getText();
        writeRecord(name,time);
        setVisible(false);
    }
    if(e.getSource()==cancel){
        setVisible(false);
    }  
 }
 public void  writeRecord(String name,int time){
    RecordOrShowRecord rd = new RecordOrShowRecord();
    rd.setTable(grade);
    boolean boo= rd.addRecord(name,time);
    if(boo){
      JOptionPane.showMessageDialog
         (null,"恭喜您,上榜了","消息框", JOptionPane.WARNING_MESSAGE);
    }
    else {
      JOptionPane.showMessageDialog
         (null,"成绩不能上榜","消息框", JOptionPane.WARNING_MESSAGE);
    }
 }
}

ShowRecord类

package ch8.view;
import java.awt.*;
import javax.swing.*;
import ch8.data.RecordOrShowRecord;
public class ShowRecord extends JDialog {
  String [][] record;
  JTextArea showMess;
  RecordOrShowRecord rd;//负责查询数据库的对象
  public ShowRecord() {
     rd = new RecordOrShowRecord();
     showMess = new JTextArea();
     showMess.setFont(new Font("楷体",Font.BOLD,15));
     add(new JScrollPane(showMess));
     setTitle("显示英雄榜");
     setBounds(400,200,400,300);
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  }
  public void setGrade(String grade){
     rd.setTable(grade);
  }
  public void setRecord(String [][]record){
     this.record=record;
  }
  public void showRecord() {
      showMess.setText(null);
      record = rd.queryRecord();
      if(record == null ) {
        JOptionPane.showMessageDialog
           (null,"没人上榜呢","消息框", JOptionPane.WARNING_MESSAGE);
      }  
      else {
        for(int i =0 ;i<record.length;i++){
             int m = i+1;
             showMess.append("\n英雄"+m+":"+record[i][0]+"         "+"成绩:"+record[i][1]);
             showMess.append("\n--------------------------------");
        }
        setVisible(true);
     }
  }
}

四、代码测试

这里我们创建test包,实现AppTest类来进行代码的测试,代码如下:

package ch8.test;
import ch8.data.*;
import java.util.Stack;
public class AppTest {
  public static void main(String [] args) {
      Block block[][] = new Block[5][10];  //雷区
      for(int i=0;i<block.length;i++) {  
          for(int j = 0;j<block[i].length;j++) {
            block[i][j] = new Block();
          }
      }
      LayMines layMines = new LayMines();                        //布雷者
      PeopleScoutMine peopleScoutMine  = new PeopleScoutMine();  //扫雷者
      layMines.layMinesForBlock(block,10); //在雷区布雷
      System.out.println("雷区情况:");
      intputShow(block);
      peopleScoutMine.setBlock(block,10);  //准备扫雷
      Stack<Block> stack = peopleScoutMine.getNoMineAroundBlock(block[0][0]);//扫雷
      if(block[0][0].isMine()){
         System.out.println("我的天啊,踩着地雷了啊");
         return;
      }
      System.out.println("扫雷情况:");
      intputProcess(block,stack);
      System.out.println("成功了吗:"+peopleScoutMine.verifyWin());
      if(block[3][3].isMine()){
         System.out.println("我的天啊,踩着地雷了啊");
         return;
      }
      stack = peopleScoutMine.getNoMineAroundBlock(block[3][3]);//扫雷
      System.out.println("扫雷情况:");
      intputProcess(block,stack);
      System.out.println("成功了吗:"+peopleScoutMine.verifyWin());
  }
  static void intputProcess(Block [][] block,Stack<Block> stack){
      int k = 0;
      for(int i=0;i<block.length;i++) {
          for(int j = 0;j<block[i].length;j++){
             if(!stack.contains(block[i][j])&&block[i][j].getIsOpen()==false){
                System.out.printf("%2s","■ "); //输出■表示未挖开方块
             }
             else {
                int m = block[i][j].getAroundMineNumber();//显示周围雷的数目
                System.out.printf("%2s","□"+m);
             }
          }
          System.out.println();
      }  
  }
  static void intputShow(Block [][] block){
      int k = 0;
      for(int i=0;i<block.length;i++) {
          for(int j = 0;j<block[i].length;j++){
             if(block[i][j].isMine()){
                System.out.printf("%2s","#"); //输出#表示是地雷
             }
             else {
                int m = block[i][j].getAroundMineNumber();//显示周围雷的数目
                System.out.printf("%2s",m);
             }
          }
          System.out.println();
      }  
  }
}

五、项目结构

使用Java实现三种等级的扫雷游戏(完整版)

六、设计总结

本次项目设计是通过 Java语言编制一个扫雷游戏,Java语言是当今较为流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。这次设计,还有利于加深对 Java课程的进一步了解,也可以巩固所学 Java语言基本知识,增进 Java语言编辑基本功,拓宽常用类库的应用。采用面向对象思想的程序,锻炼了面向对象的设计能力,使编程者通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握 Java语言的编程思想及面向对象程序设计的方法。

来源:https://blog.csdn.net/m0_63947499/article/details/127482467

标签:java,等级,扫雷游戏
0
投稿

猜你喜欢

  • Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解

    2022-08-05 19:49:02
  • Android开发手册TextView属性实现效果盘点

    2022-03-10 09:29:53
  • C#基础:基于const与readonly的深入研究

    2023-09-26 14:22:30
  • C#使用yield关键字让自定义集合实现foreach遍历的方法

    2022-07-21 11:44:28
  • Java下载文件时文件名乱码问题解决办法

    2023-08-23 17:37:03
  • SpringBoot整合TKMyBatis实现单表增删改查操作

    2022-01-30 19:52:28
  • Java实现英文猜词游戏的示例代码

    2023-08-07 11:40:39
  • C++实现的求解多元一次方程示例

    2022-09-26 19:45:47
  • Android实现短信验证功能的代码

    2022-08-28 19:54:15
  • Java 多线程等待优雅的实现方式之Phaser同步屏障

    2023-11-29 09:47:43
  • Android内存优化杂谈

    2023-06-18 15:46:41
  • Java打印出所有的水仙花数的实现代码

    2023-03-06 17:24:22
  • java Long类型转为String类型的两种方式及区别说明

    2022-11-12 18:03:38
  • Java方法参数传递机制原理解析

    2022-04-16 19:10:46
  • C#实现对AES加密和解密的方法

    2021-07-27 16:34:24
  • Java Web开发环境配置详解

    2023-03-05 03:32:37
  • android判断一个Activity是否处于栈顶的实例

    2021-06-24 18:37:39
  • Android studio设置文件头定制代码注释的方法

    2021-07-23 16:52:41
  • Android自定义控件之继承ViewGroup创建新容器

    2023-06-15 08:50:11
  • JavaWeb开发之【Tomcat 环境配置】MyEclipse+IDEA配置教程

    2022-05-04 12:50:18
  • asp之家 软件编程 m.aspxhome.com