欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Java實現(xiàn)三種等級的掃雷游戲(完整版)

 更新時間:2023年01月10日 09:05:23   作者:陳橘又青  
掃雷是一款大眾類的益智小游戲,根據(jù)點擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,下面這篇文章主要給大家介紹了關于使用Java實現(xiàn)三種等級的掃雷游戲的相關資料,需要的朋友可以參考下

一、效果展示

初級難度

中級難度

高級難度

測試界面

二、項目介紹

項目背景

掃雷是一款大眾類的益智小游戲。根據(jù)點擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸。這款游戲有著很長的歷史,從掃雷被開發(fā)出來到現(xiàn)在進行了無數(shù)次的優(yōu)化,這款游戲通過簡單的玩法,加上一個好看的游戲界面,每一處的細節(jié)都體現(xiàn)了掃雷的魅力。

功能分析

完成 難度選擇,雷隨機生成,數(shù)字生成,左右鍵翻開 等功能實現(xiàn)

游戲四種狀態(tài): 難度選擇、游戲狀態(tài)、游戲勝利、游戲失敗

游戲難度: 初級、中級、高級(不同難度對應不同的雷區(qū)大小和雷數(shù)量)

游戲核心: 二維數(shù)組 的相關操作

其他: 窗口繪制、界面規(guī)劃、操作計數(shù)、重新開始。

三、代碼展示

圖形界面設計(gui包)

主類:AppWindows類

AppWindow類負責創(chuàng)建游戲的主窗口,該類含有main方法,程序從該類開始執(zhí)行。

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;                //掃雷區(qū)域
     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());//創(chuàng)建初級掃雷區(qū)
         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;                   //名字,比如"雷"或數(shù)字
     int aroundMineNumber;          //如果不是類,此數(shù)據(jù)是周圍雷的數(shù)目
     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){ //在雷區(qū)布置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返回節(jié)點的個數(shù)
            int randomIndex=(int)(Math.random()*size);
            Block b=list.get(randomIndex);
            b.setIsMine(true);
            b.setName("雷");
            b.setMineIcon(mineIcon);
            list.remove(randomIndex);        //list刪除索引值為randomIndex的節(jié)點
            mineCount--;
        } 
        for(int i=0;i<row;i++){             //檢查布雷情況,標記每個方塊周圍的雷的數(shù)目
           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); //設置該方塊周圍的雷數(shù)目
              }
           } 
        }    
    }
}

PeopleScoutMine類

package ch8.data;
import java.util.Stack;
public class PeopleScoutMine {
   public Block [][] block;    //雷區(qū)的全部方塊
   Stack<Block>  notMineBlock; //存放一個方塊周圍區(qū)域內不是雷的方塊
   int m,n ;                   //方塊的索引下標
   int row,colum;              //雷區(qū)的行和列
   int mineCount;              //雷的數(shù)目
   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附近區(qū)域不是雷的方塊
       notMineBlock.clear();
       for(int i=0;i<row;i++) {   //尋找bk在雷區(qū)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;   //英雄榜顯示的最多英雄數(shù)目
   public  RecordOrShowRecord(){
      try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      }
      catch(Exception e){}
   }
   public void setTable(String str){
      tableName = "t_"+str;
      connectDatabase();//連接數(shù)據(jù)庫
     
      try {
          Statement sta = con.createStatement();
          String SQL="create table "+tableName+
         "(p_name varchar(50) ,p_time int)";
          sta.executeUpdate(SQL);//創(chuàng)建表
          con.close();
      }
      catch(SQLException e) {//如果表已經(jīng)存在,將觸發(fā)SQL異常,即不再創(chuàng)建該表
      }
   }
   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();  //連接數(shù)據(jù)庫
          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); //連接數(shù)據(jù)庫,如果不存在就創(chuàng)建
         
      }
      catch(Exception e){} 
   }
   private int verifyScore(int time){
      if(tableName == null)
         return Integer.MAX_VALUE ;
      connectDatabase();    //連接數(shù)據(jù)庫
      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(); //設置視圖上需要顯示的數(shù)據(jù)
    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;                  //雷區(qū)的方塊
     BlockView [][] blockView;          //方塊的視圖
     LayMines lay;                      //負責布雷
     PeopleScoutMine peopleScoutMine;   //負責掃雷
     int row,colum,mineCount,markMount;//雷區(qū)的行數(shù)、列數(shù)以及地雷個數(shù)和用戶給出的標記數(shù)
     ImageIcon mark;                   //探雷作的標記
     String grade;                     //游戲級別 
     JPanel pCenter,pNorth;            //布局用的面板
     JTextField showTime,showMarkedMineCount; //顯示用時和探雷作的標記數(shù)目(不一定是雷哦)
     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);                //計時器,每個一秒觸發(fā)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();                      //創(chuàng)建布雷者
         peopleScoutMine = new PeopleScoutMine(); //創(chuàng)建掃雷者
         initMineArea(row,colum,mineCount,grade); //初始化雷區(qū),見下面的initMineArea方法
         reStart.addActionListener(this);
         pNorth.add(new JLabel("剩余雷數(shù)(千萬別弄錯啊):"));
         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];       //創(chuàng)建方塊的視圖
       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]的數(shù)據(jù)放入視圖
               pCenter.add(blockView[i][j]);
               blockView[i][j].getBlockCover().addActionListener(this);//注冊監(jiān)視器
               blockView[i][j].getBlockCover().addMouseListener(this);
               blockView[i][j].seeBlockCover(); //初始時蓋住block[i][j]的數(shù)據(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()) { //用戶輸?shù)粲螒?
             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(); //視圖顯示方塊上的數(shù)據(jù)信息
                }
             }
             time.stop();
             spendTime=0;             //恢復初始值
             markMount=mineCount;      //恢復初始值
             playMusic.playMusic();    //播放類爆炸的聲音
         }
         else {  //掃雷者得到block[m][n]周圍區(qū)域不是雷的方塊
             Stack<Block> notMineBlock =peopleScoutMine.getNoMineAroundBlock(block[m][n]);
             while(!notMineBlock.empty()){
                Block bk = notMineBlock.pop();
                ViewForBlock viewforBlock = bk.getBlockView();
                viewforBlock.seeBlockNameOrIcon();//視圖顯示方塊上的數(shù)據(jù)信息
                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;//負責查詢數(shù)據(jù)庫的對象
   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);
      }
   }
} 

四、代碼測試

這里我們創(chuàng)建test包,實現(xiàn)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];  //雷區(qū)
       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); //在雷區(qū)布雷
       System.out.println("雷區(qū)情況:");
       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();//顯示周圍雷的數(shù)目
                 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();//顯示周圍雷的數(shù)目
                 System.out.printf("%2s",m);
              }
           }
           System.out.println();
       }  
   }
}

五、項目結構

六、設計總結

本次項目設計是通過 Java語言編制一個掃雷游戲,Java語言是當今較為流行的網(wǎng)絡編程語言,它具有面向對象、跨平臺、分布應用等特點。這次設計,還有利于加深對 Java課程的進一步了解,也可以鞏固所學 Java語言基本知識,增進 Java語言編輯基本功,拓寬常用類庫的應用。采用面向對象思想的程序,鍛煉了面向對象的設計能力,使編程者通過該教學環(huán)節(jié)與手段,把所學課程及相關知識加以融會貫通,全面掌握 Java語言的編程思想及面向對象程序設計的方法。

總結

到此這篇關于使用Java實現(xiàn)三種等級的掃雷游戲的文章就介紹到這了,更多相關Java實現(xiàn)掃雷游戲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot中的自動裝配原理解析

    SpringBoot中的自動裝配原理解析

    這篇文章主要介紹了SpringBoot中的自動裝配原理解析,自動裝配就是指 Spring 容器在不使用<constructor-arg>和<property>標簽的情況下,可以自動裝配(autowire)相互協(xié)作的Bean之間的關聯(lián)關系,將一個 Bean注入其他Bean的Property中,需要的朋友可以參考下
    2023-08-08
  • Spring Bean的線程安全問題

    Spring Bean的線程安全問題

    Spring容器中的Bean是否線程安全,本文主要介紹了Spring Bean的線程安全問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Mybatis的動態(tài)Sql組合模式詳情

    Mybatis的動態(tài)Sql組合模式詳情

    這篇文章主要介紹了Mybatis的動態(tài)Sql組合模式詳情,這篇文章從組合模式的角度分析了Mybatis動態(tài)sql的部分,SqlNode是組合模式的Component接口,更多相關內容需要的小伙伴可以參考一下
    2022-08-08
  • Java創(chuàng)建樹形結構算法實例代碼

    Java創(chuàng)建樹形結構算法實例代碼

    本篇文章主要介紹了Java創(chuàng)建樹形結構算法實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java判斷兩個浮點數(shù)相等

    Java判斷兩個浮點數(shù)相等

    本文主要介紹了Java判斷兩個浮點數(shù)相等,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • Java實現(xiàn)學生信息管理系統(tǒng)(使用數(shù)據(jù)庫)

    Java實現(xiàn)學生信息管理系統(tǒng)(使用數(shù)據(jù)庫)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java?Cloneable接口的深拷貝與淺拷貝詳解

    Java?Cloneable接口的深拷貝與淺拷貝詳解

    這篇文章主要為大家詳細介紹了Java?Cloneable接口的深拷貝與淺拷貝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot的父級依賴:spring-boot-starter-parent詳解

    SpringBoot的父級依賴:spring-boot-starter-parent詳解

    SpringBoot通過父級依賴spring-boot-starter-parent實現(xiàn)項目快速構建,它依賴于spring-boot-dependencies來統(tǒng)一管理項目中的依賴版本,省去了手動指定版本信息的麻煩,這種機制不僅規(guī)定了默認的Java版本和編碼格式
    2024-09-09
  • Java中FileWriter的用法及wirte()重載方法詳解

    Java中FileWriter的用法及wirte()重載方法詳解

    這篇文章主要介紹了Java中FileWriter的用法及wirte()重載方法詳解,FileWriter是Java編程語言中的一個類,用于將字符寫入文件,它提供了一種簡單而方便的方式來創(chuàng)建、打開和寫入文件,通過使用FileWriter,我們可以將字符數(shù)據(jù)寫入文本文件,需要的朋友可以參考下
    2023-10-10
  • 在Filter中不能注入bean的問題及解決

    在Filter中不能注入bean的問題及解決

    這篇文章主要介紹了在Filter中不能注入bean的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論