掃雷小程式!Java的

來源:互聯網
上載者:User

這段時間,為了複習Java2的GUI編程,參考有關資料,寫了一個掃雷的小程式,只是寫得很清楚,希望能給大家一些協助!呵呵

/**<br /> * @(#)Block.java<br /> *該類用於建立Block對象,將其放到遊戲區的每個格子裡面,裡面存放著該“格子”的一些屬性:<br /> * *************************<br /> * ——1. String name -->是雷時,存入“雷”<br /> * 屬性 ——|-2. boolean boo -->是雷時,為true,否則為false。我稱為“雷性”<br /> * ——3. int number -->用於儲存周邊,九回宮格內周邊八個方格內的雷數<br /> * *************************<br /> * ——1. void setName(String name) -->設定name<br /> * |-2. void setNumber(int i) -->設定周邊雷數<br /> * 方法 ——|-3. int getNumber() -->得到周邊雷數<br /> * |-4. String getName() -->得到name<br /> * |-5. boolean isMine() -->判斷雷性<br /> * ——6. void setIsMine(boolean boo) -->設定雷性<br /> * ***********************<br /> *<br /> * @author 宋俊林<br /> * @version 1.00 2009/4/25<br /> */</p><p>public class Block {</p><p> String name; //是雷時,存入“雷”<br /> int number; //用於儲存周邊,九回宮格內周邊八個方格內的雷數<br /> boolean boo = false; //是雷時,為true,否則為false。我稱為“雷性”</p><p> //設定name<br /> public void setName(String name){<br /> this.name = name;<br /> }<br /> //得到name<br /> public String getName(){<br /> return name;<br /> }<br /> //設定周邊雷數<br /> public void setNumber(int i){<br /> this.number = i;<br /> }<br /> //得到周邊雷數<br /> public int getNumber(){<br /> return number;<br /> }<br /> //設定雷性<br /> public void setIsMine(boolean boo){<br /> this.boo = boo;<br /> }<br /> //判斷雷性<br /> public boolean isMine(){<br /> return boo;<br /> }<br />}</p><p>/**<br /> * @(#)MineFrame.java<br /> *<br /> * 該類是主表單類,該類將以Block類的執行個體和BlockView類的執行個體作為成員,並負責二者之間的互動<br /> *<br /> * @author 宋俊林<br /> * @version 1.00 2009/4/25<br /> */</p><p>import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;</p><p>public class MineFrame extends JFrame implements ActionListener{</p><p>JButton reStart;<br />Block block[][];<br />BlockView blockView[][];<br />LayMines lay;<br />int row=10,colum=12,mineCount=22;<br />int colorSwitch = 0;<br />JPanel pCenter,pNorth;<br />public MineFrame() {<br /> reStart = new JButton("重新開始"); //做一個restart按鈕<br /> pCenter = new JPanel(); //中心主遊戲區面板<br /> pNorth = new JPanel(); //上部控制台<br /> pNorth.setBackground(Color.gray);<br /> block = new Block[row][colum];<br /> for(int i=0;i<row;i++){ //執行個體化一個Block數組<br /> for(int j=0;j<colum;j++){<br /> block[i][j]=new Block();<br /> }<br /> }<br /> lay = new LayMines();<br /> lay.layMinesForBlock(block,mineCount);<br /> blockView = new BlockView[row][colum];<br /> pCenter.setLayout(new GridLayout(row,colum));<br /> for(int i=0;i<row;i++){<br /> for(int j=0;j<colum;j++){<br /> blockView[i][j] = new BlockView(); //執行個體化一個blockView數組<br /> blockView[i][j].setName(block[i][j].getName());<br /> pCenter.add(blockView[i][j]);<br /> blockView[i][j].getBlockCover().addActionListener(this); //給每一小格添加監聽器<br /> }<br /> }<br /> reStart.addActionListener(this); //給reStart添加監聽器<br /> pNorth.add(reStart); //將組件添加到視窗中<br /> add(pNorth,BorderLayout.NORTH);<br /> add(pCenter,BorderLayout.CENTER);<br /> setSize(200,232);<br /> setVisible(true);<br /> //pack();<br /> addWindowListener(new WindowAdapter(){ //添加視窗關閉事件的監聽<br /> public void windowClosing(WindowEvent e){<br /> System.exit(0);<br /> }<br /> });<br /> validate();<br /> }<br /> public void actionPerformed(ActionEvent e){<br /> JButton source = (JButton)e.getSource();<br /> if(source!=reStart){<br /> int m = -1,n=-1;<br /> for(int i=0;i<row;i++){<br /> for(int j=0;j<colum;j++){<br /> //判斷事件對象,如果是格子[i][j],則翻開,並將該Object Storage Service到[m][n]<br /> if(source==blockView[i][j].getBlockCover()){<br /> m = i;<br /> n = j;<br /> break;<br /> }<br /> }<br /> }<br /> if(block[m][n].isMine()){<br /> for(int i=0;i<row;i++){<br /> for(int j=0;j<colum;j++){<br /> //如果[m][n]是雷,則遊戲停止,移除所有格子的事件監聽,按鈕動作失效<br /> //同時翻開所有是雷的按鈕<br /> blockView[i][j].getBlockCover().removeActionListener(this);<br /> if(block[i][j].isMine())<br /> blockView[i][j].seeBlockName();<br /> }<br /> }<br /> }else{<br /> if(block[m][n].getNumber()>0)<br /> blockView[m][n].seeBlockName();<br /> else{<br /> //如果所采處雷數為0,則翻開周邊<br /> if(block[m][n].getNumber()==0){<br /> for(int k=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++){<br />for(int t=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++){<br />blockView[k][t].seeBlockName();<br />}<br />}<br />}<br /> }<br /> }<br /> }<br /> if(source==reStart){<br /> for(int i=0;i<row;i++){<br /> for(int j=0;j<colum;j++){<br /> block[i][j].setIsMine(false);<br /> }<br /> }<br /> lay.layMinesForBlock(block,mineCount);<br /> for(int i=0;i<row;i++){<br /> for(int j=0;j<colum;j++){<br /> blockView[i][j].setName(block[i][j].getName());<br /> blockView[i][j].seeBlockCover();<br /> blockView[i][j].getBlockCover().addActionListener(this);<br /> }<br /> }<br /> }<br /> }<br /> public static void main(String args[]){<br /> new MineFrame();<br /> }<br />}</p><p>/**<br /> * @(#)BlockView.java<br /> *<br /> * 該類是為Block類建立視圖,注意,要實現掃雷效果,則需要將試圖分為兩層,表層是按鈕,底層是標籤,<br /> * 所以要用到CardLayout布局。另外,想在一個個格子裡面放多各元件,得考慮用Panel容器,所以該視圖類<br /> * 繼承自Panel<br /> *<br /> * @author 宋俊林<br /> * @version 1.00 2009/4/25<br /> */</p><p>import java.awt.*;<br />import javax.swing.*;</p><p>public class BlockView extends JPanel {<br />JLabel blockName;<br />JButton blockCover;<br />CardLayout card;</p><p> BlockView(){ //在構造器中初始化各屬性<br /> card = new CardLayout();<br /> setLayout(card);<br /> blockName = new JLabel();<br /> blockCover = new JButton();<br /> add("cover",blockCover); //將blockCover添加到層面板<br /> add("name",blockName); //將blockname添加到層面板<br /> }<br /> public void setName(String name){ //設定blockName的text<br /> blockName.setText(name);<br /> }<br /> public String getName(){ //得到blockName的text<br /> return blockName.getText();<br /> }<br /> public void seeBlockName(){ //顯示blockName<br /> card.show(this,"name");<br /> validate();<br /> }<br /> public void seeBlockCover(){ //顯示blockCover<br /> card.show(this,"cover");<br /> validate();<br /> }<br /> public JButton getBlockCover(){ //得到blockCover<br /> return blockCover;<br /> }<br />}</p><p>/**<br /> * @(#)LayMines.java<br /> *<br /> * * 我感覺這個類時掃雷的演算法核心,只要搞定這個類,其他都不是問題,該類只有一個主方法<br /> * *---> void layMinesForBlock(Block block[][],int mineCount)<br /> * * 其中:<br /> * * 1.參數block[][]數組存放著整個遊戲區的方格的block對象,一個方格對應一個<br /> * * 同時,用二維數組也為實現掃描周邊的九回宮格統計雷數提供支援<br /> * * 2.參數mineCount來存放你想產生的類的個數<br /> * * 3.這裡還用到了集合LinkedList,來儲存block[][]中的所有block對象,<br /> *<br /> *<br /> * @author 宋俊林<br /> * @version 1.00 2009/4/25<br /> */</p><p>import java.util.LinkedList;</p><p>public class LayMines {<br />public void layMinesForBlock(Block block[][],int mineCount){<br />int row = block.length;<br />int column = block[0].length;<br />LinkedList<Block> list = new LinkedList<Block>(); //建立list(用到範型)<br />for(int i=0;i<row;i++){<br />for(int j=0;j<column;j++){<br />list.add(block[i][j]); //利用迴圈,將block都加到列表list裡<br />}<br />}<br />while(mineCount>0){<br />int size = list.size();<br />int randomIndex=(int)(Math.random()*size); //生產隨機數,將這些隨機數對應的block對象的屬性設為是雷的屬性<br />Block b = list.get(randomIndex); //根據隨機數,取對應的block對象<br />b.setName("雷"); //將name設為‘雷’<br />b.setIsMine(true); //將雷性設為true<br />list.remove(randomIndex); //將list中是雷的節點刪除,以免設定雷重複<br />mineCount--;<br />}<br />for(int i=0;i<row;i++){<br />for(int j=0;j<column;j++){<br />if(!block[i][j].isMine()){ //如果block[i][j]不是雷是執行下面的統計操作,掃描周邊<br />int mineNumber = 0;<br />/**<br /> * 我感覺下面是核心的核心,掃描周圍的八個(但是在遊戲區的邊界上,可能不足八個格子),所以這裡掃描是就得處理邊界問題<br /> *這裡為防止越界,用的是比較大小取值的方法,很精妙“Math.max(j-1,0)”;下面是掃描圖:<br /> * [———————————————————————————]<br /> * [(i-1,j-1)|(i-1,j)|(i-1,j+1)]<br /> * [———————————————————————————]<br /> * [ (i,j-1) | (i,j) | (i,j+1)]<br /> * [———————————————————————————]<br /> * [(i+1,j-1)|(i+i,j)|(i+1,j+1)]<br /> * [———————————————————————————]<br /> */<br />for(int k=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++){<br />for(int t=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){<br />if(block[k][t].isMine()){<br />mineNumber++;<br />}<br />}<br />}<br />block[i][j].setName(""+mineNumber); //將name存為number後邊會進行顯示<br />block[i][j].setNumber(mineNumber); //將周邊的雷數存入number中<br />}<br />}<br />}<br />}</p><p>} 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.