使用Java實(shí)現(xiàn)三種等級(jí)的掃雷游戲(完整版)
一、效果展示
初級(jí)難度
中級(jí)難度
高級(jí)難度
測(cè)試界面
二、項(xiàng)目介紹
項(xiàng)目背景
掃雷是一款大眾類的益智小游戲。根據(jù)點(diǎn)擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤皆輸。這款游戲有著很長(zhǎng)的歷史,從掃雷被開(kāi)發(fā)出來(lái)到現(xiàn)在進(jìn)行了無(wú)數(shù)次的優(yōu)化,這款游戲通過(guò)簡(jiǎn)單的玩法,加上一個(gè)好看的游戲界面,每一處的細(xì)節(jié)都體現(xiàn)了掃雷的魅力。
功能分析
完成 難度選擇,雷隨機(jī)生成,數(shù)字生成,左右鍵翻開(kāi) 等功能實(shí)現(xiàn)
游戲四種狀態(tài): 難度選擇、游戲狀態(tài)、游戲勝利、游戲失敗
游戲難度: 初級(jí)、中級(jí)、高級(jí)(不同難度對(duì)應(yīng)不同的雷區(qū)大小和雷數(shù)量)
游戲核心: 二維數(shù)組 的相關(guān)操作
其他: 窗口繪制、界面規(guī)劃、操作計(jì)數(shù)、重新開(kāi)始。
三、代碼展示
圖形界面設(shè)計(jì)(gui包)
主類:AppWindows類
AppWindow類負(fù)責(zé)創(chuàng)建游戲的主窗口,該類含有main方法,程序從該類開(kāi)始執(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;//掃雷級(jí)別 JMenuItem gradeOneList,gradeTwoList,gradeThreeList;//初,中,高級(jí)英雄榜 MineArea mineArea=null; //掃雷區(qū)域 ShowRecord showHeroRecord=null; //查看英雄榜 public AppWindow(){ bar=new JMenuBar(); fileMenu=new JMenu("掃雷游戲"); gradeOne=new JMenu("初級(jí)"); gradeTwo=new JMenu("中級(jí)"); gradeThree=new JMenu("高級(jí)"); gradeOneList=new JMenuItem("初級(jí)英雄榜"); gradeTwoList=new JMenuItem("中級(jí)英雄榜"); gradeThreeList=new JMenuItem("高級(jí)英雄榜"); 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)建初級(jí)掃雷區(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(); } }
用戶操作設(shè)計(jì)(data包)
Block類
package ch8.data; import javax.swing.ImageIcon; public class Block { String name; //名字,比如"雷"或數(shù)字 int aroundMineNumber; //如果不是類,此數(shù)據(jù)是周圍雷的數(shù)目 ImageIcon mineIcon; //雷的圖標(biāo) public boolean isMine=false; //是否是雷 boolean isMark=false; //是否被標(biāo)記 boolean isOpen=false; //是否被挖開(kāi) 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個(gè)雷 initBlock(block); //先都設(shè)置是無(wú)雷 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){ //開(kāi)始布雷 int size=list.size(); // list返回節(jié)點(diǎn)的個(gè)數(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é)點(diǎn) mineCount--; } for(int i=0;i<row;i++){ //檢查布雷情況,標(biāo)記每個(gè)方塊周圍的雷的數(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è)置該方塊周圍的雷數(shù)目 } } } } }
PeopleScoutMine類
package ch8.data; import java.util.Stack; public class PeopleScoutMine { public Block [][] block; //雷區(qū)的全部方塊 Stack<Block> notMineBlock; //存放一個(gè)方塊周圍區(qū)域內(nèi)不是雷的方塊 int m,n ; //方塊的索引下標(biāo) 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); //見(jià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ù)庫(kù) 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是否達(dá)到標(biāo)準(zhǔn)(進(jìn)入前heroNumber名),見(jiàn)后面的verifyScore方法: int amount = verifyScore(time); if(amount >= heroNumber) { ok = false; } else { connectDatabase(); //連接數(shù)據(jù)庫(kù) 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();//結(jié)果集中的全部記錄 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ù)庫(kù),如果不存在就創(chuàng)建 } catch(Exception e){} } private int verifyScore(int time){ if(tableName == null) return Integer.MAX_VALUE ; connectDatabase(); //連接數(shù)據(jù)庫(kù) 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);//確定是哪個(gè)方塊的視圖 public void setDataOnView(); //設(shè)置視圖上需要顯示的數(shù)據(jù) public void seeBlockNameOrIcon();//顯示圖標(biāo)方塊上的名字或 public void seeBlockCover(); //顯示視圖上負(fù)責(zé)遮擋的組件 public Object getBlockCover(); //得到視圖上的遮擋組件 }
游戲視圖設(shè)計(jì)(view包)
BlockView類
package ch8.view; import javax.swing.*; import java.awt.*; import ch8.data.*; public class BlockView extends JPanel implements ViewForBlock{ JLabel blockNameOrIcon; //用來(lái)顯示Block對(duì)象的name、number和mineIcon屬性 JButton blockCover; //用來(lái)遮擋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; //負(fù)責(zé)布雷 PeopleScoutMine peopleScoutMine; //負(fù)責(zé)掃雷 int row,colum,mineCount,markMount;//雷區(qū)的行數(shù)、列數(shù)以及地雷個(gè)數(shù)和用戶給出的標(biāo)記數(shù) ImageIcon mark; //探雷作的標(biāo)記 String grade; //游戲級(jí)別 JPanel pCenter,pNorth; //布局用的面板 JTextField showTime,showMarkedMineCount; //顯示用時(shí)和探雷作的標(biāo)記數(shù)目(不一定是雷哦) Timer time; //計(jì)時(shí)器 int spendTime=0; //掃雷的用時(shí) Record record; //負(fù)責(zé)記錄到英雄榜 PlayMusic playMusic; //負(fù)責(zé)播放雷爆炸的聲音 public MineArea(int row,int colum,int mineCount,String grade) { record = new Record(); //負(fù)責(zé)保存成績(jī)到英雄榜 reStart=new JButton("重新開(kāi)始"); mark=new ImageIcon("掃雷圖片/mark.png"); //探雷標(biāo)記 time=new Timer(1000,this); //計(jì)時(shí)器,每個(gè)一秒觸發(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ū),見(jiàn)下面的initMineArea方法 reStart.addActionListener(this); pNorth.add(new JLabel("剩余雷數(shù)(千萬(wàn)別弄錯(cuò)啊):")); pNorth.add(showMarkedMineCount); pNorth.add(reStart); pNorth.add(new JLabel("用時(shí):")); pNorth.add(showTime); setLayout(new BorderLayout()); add(pNorth,BorderLayout.NORTH); add(pCenter,BorderLayout.CENTER); playMusic = new PlayMusic(); //負(fù)責(zé)播放觸雷爆炸的聲音 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); //準(zhǔn)備掃雷 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]); //方塊設(shè)置自己的視圖 blockView[i][j].setDataOnView(); //將block[i][j]的數(shù)據(jù)放入視圖 pCenter.add(blockView[i][j]); blockView[i][j].getBlockCover().addActionListener(this);//注冊(cè)監(jiān)視器 blockView[i][j].getBlockCover().addMouseListener(this); blockView[i][j].seeBlockCover(); //初始時(shí)蓋住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);//用戶單擊無(wú)效了 if(block[i][j].isMine()) blockView[i][j].seeBlockNameOrIcon(); //視圖顯示方塊上的數(shù)據(jù)信息 } } time.stop(); spendTime=0; //恢復(fù)初始值 markMount=mineCount; //恢復(fù)初始值 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); //彈出錄入到英雄榜對(duì)話框 } } public void mousePressed(MouseEvent e){ //探雷:給方塊上插一個(gè)小旗圖標(biāo)(再次單擊取消) 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("記錄你的成績(jī)"); 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,"成績(jī)不能上榜","消息框", 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;//負(fù)責(zé)查詢數(shù)據(jù)庫(kù)的對(duì)象 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,"沒(méi)人上榜呢","消息框", JOptionPane.WARNING_MESSAGE); } else { for(int i =0 ;i<record.length;i++){ int m = i+1; showMess.append("\n英雄"+m+":"+record[i][0]+" "+"成績(jī):"+record[i][1]); showMess.append("\n--------------------------------"); } setVisible(true); } } }
四、代碼測(cè)試
這里我們創(chuàng)建test包,實(shí)現(xiàn)AppTest類來(lái)進(jìn)行代碼的測(cè)試,代碼如下:
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); //準(zhǔn)備掃雷 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","■ "); //輸出■表示未挖開(kāi)方塊 } 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(); } } }
五、項(xiàng)目結(jié)構(gòu)
六、設(shè)計(jì)總結(jié)
本次項(xiàng)目設(shè)計(jì)是通過(guò) Java語(yǔ)言編制一個(gè)掃雷游戲,Java語(yǔ)言是當(dāng)今較為流行的網(wǎng)絡(luò)編程語(yǔ)言,它具有面向?qū)ο?、跨平臺(tái)、分布應(yīng)用等特點(diǎn)。這次設(shè)計(jì),還有利于加深對(duì) Java課程的進(jìn)一步了解,也可以鞏固所學(xué) Java語(yǔ)言基本知識(shí),增進(jìn) Java語(yǔ)言編輯基本功,拓寬常用類庫(kù)的應(yīng)用。采用面向?qū)ο笏枷氲某绦?,鍛煉了面向?qū)ο蟮脑O(shè)計(jì)能力,使編程者通過(guò)該教學(xué)環(huán)節(jié)與手段,把所學(xué)課程及相關(guān)知識(shí)加以融會(huì)貫通,全面掌握 Java語(yǔ)言的編程思想及面向?qū)ο蟪绦蛟O(shè)計(jì)的方法。
總結(jié)
到此這篇關(guān)于使用Java實(shí)現(xiàn)三種等級(jí)的掃雷游戲的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)掃雷游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis的動(dòng)態(tài)Sql組合模式詳情
這篇文章主要介紹了Mybatis的動(dòng)態(tài)Sql組合模式詳情,這篇文章從組合模式的角度分析了Mybatis動(dòng)態(tài)sql的部分,SqlNode是組合模式的Component接口,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-08-08Java創(chuàng)建樹(shù)形結(jié)構(gòu)算法實(shí)例代碼
本篇文章主要介紹了Java創(chuàng)建樹(shù)形結(jié)構(gòu)算法實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(使用數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01SpringBoot的父級(jí)依賴:spring-boot-starter-parent詳解
SpringBoot通過(guò)父級(jí)依賴spring-boot-starter-parent實(shí)現(xiàn)項(xiàng)目快速構(gòu)建,它依賴于spring-boot-dependencies來(lái)統(tǒng)一管理項(xiàng)目中的依賴版本,省去了手動(dòng)指定版本信息的麻煩,這種機(jī)制不僅規(guī)定了默認(rèn)的Java版本和編碼格式2024-09-09Java中FileWriter的用法及wirte()重載方法詳解
這篇文章主要介紹了Java中FileWriter的用法及wirte()重載方法詳解,FileWriter是Java編程語(yǔ)言中的一個(gè)類,用于將字符寫(xiě)入文件,它提供了一種簡(jiǎn)單而方便的方式來(lái)創(chuàng)建、打開(kāi)和寫(xiě)入文件,通過(guò)使用FileWriter,我們可以將字符數(shù)據(jù)寫(xiě)入文本文件,需要的朋友可以參考下2023-10-10