




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java程序課程設計任務書1設計內容及要求1.1 掃雷游戲的基本要求 Windows 2000/XP系統(tǒng)提供的掃雷游戲是一個很有趣的游戲。本章的課程設計使用Java語言編寫一個與其類似的掃雷游戲。具體要求如下:(1)選擇級別后將出現(xiàn)相應級別的掃雷區(qū)域,這是用戶使用鼠標左鍵單擊雷區(qū)中任何一個方塊便啟動計時器。(2)用戶要揭開某個方塊,可單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下五雷,則顯示一個數字,該數字代表方塊的周圍的8個方塊中共有多少顆雷。(3) 如果用戶認為某個方塊下埋著雷,單擊右鍵可以在方塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記。用戶每標記出一個掃雷標記(無論用戶
2、的標記是否正確),程序將顯示的剩余雷數減少一個。(4)掃雷勝利后,顯示游戲勝利。(5) 用戶可以右擊空格,可以選擇標記為“旗幟”、“問號”或者返回成空格。計劃進度1 12月28日- 12 月28日:搜集資料、查閱文獻,確定選題2 12月29日- 12月29日:需求分析,系統(tǒng)設計,系統(tǒng)功能模塊完善3 12月30日- 1月 1日:編程實現(xiàn)系統(tǒng)、系統(tǒng)測試與修改4 1月2日- 1月3日:課程設計報告撰寫5 1月7日- 1月7日:課程設計報告答辯任務分工1.2 需實現(xiàn)的主要功能(1)用戶點擊笑臉實現(xiàn)復位操作。調用repaint()和validate()函數對界面進行重置以及刷新操作(2)可以顯示用戶完全
3、掃雷成功所花時間。 文本框TF記錄掃雷成功所花的時間(3)在失敗和勝利后跳出失敗或勝利的文本框 JoptionPane 該類用來調出對話框并提示勝利2需求分析2.1 掃雷棋盤的布局設計系統(tǒng)的整體布局為:CardLayout布局, 采用了文本框、按鈕、面板、框架等組件,菜單主要有run按鈕笑臉和哭臉,按鈕的功能是重新開始新的游戲。2.2 雷區(qū)的設計MineArea類是javax.swing包中Jpanel容器的子類,實現(xiàn)了ActionListener和MouseListener接口,所創(chuàng)建的對象:mineArea是MineGame類中最重要的成員之一,作為一個容器添加到MineGame窗口的中心
4、。標明MineArea類的主要成員變量、方法以及和MineGame類之間組合關系的UML圖如下圖所示。MineArea類的UML圖以下是UML圖中有關數據和方法的詳細說明。1、成員變量(1)block是Block類型的數組,用來確定雷區(qū)有多少需進行掃雷的方塊。(2)blockView是BlockView類型的數組,負責為block數組中的Block對象提供視圖。(3)lay是LayMines類型的對象,負責設置block數組中的哪些方塊是雷或不是雷。(4)run是一個按鈕對象,用戶單擊它重新開始游戲。(6)time是計時器對象,負責計算用戶的用時。2、方法(1)setbounds(int, i
5、nt, int ,int)方法可根據參數提供的數據設置雷區(qū)的寬度、高度、雷的數目。(2)actionPerformed(ActionEvent)是MineArea類實現(xiàn)的ActionListener接口中的方法。當用戶單擊blockView中的某個方塊時,actionPerformed(ActionEvent)方法負責執(zhí)行有關算法,例如,當用鼠標左鍵單擊方塊上的按鈕后,若該方塊下有雷,lost(ActionEvent)方法將使用戶輸掉本局,若該方塊下無雷,getboomcount(ActionEvent)方法將顯示icon對象中的標簽,該標簽上是一個數字,該數字代表當前方塊的周圍的8個方塊中共
6、有多少顆雷。 (3) Mouse_Handler (MouseEvent)方法是MineArea類實現(xiàn)的MouseListener接口中的方法,當用戶按下鼠標有件事mouseReleased(MouseEvent)方法負責讓方塊上顯示一個探雷標記。(4)iswin函數判斷是否掃雷成功當雷數全部被正確的排除,或者無雷區(qū)已經被全部點開,只剩雷時,判定為勝利,JoptionPane類創(chuàng)建的對象講調用方法showMessageDialog()彈出對話框提示:YOU WIN!3總體設計 總體流程圖4主要功能設計流程4.1雷區(qū)設計流程圖雷區(qū)設計流程圖在實現(xiàn)以上功能時,主要需解決的功能模塊如下:1、怎樣產生
7、雷?setBoomPosi()方法中posi數組用來記錄雷的位置,先在雷區(qū)中隨機產生一個雷,記錄為posi0,并記錄其X,Y坐標位置,然后再使用Math.random()*maxPosi+1方法產生第二個雷,并判斷其X坐標是否與POSI0重復,若重復,重新產生一個雷,并再次進行判斷,直至坐標相異為止,若不重復,則用posi1記錄該雷,并記錄其XY坐標位置。同理,以此類推,便可產生所有的雷。2、游戲中怎樣判斷是否累的位置?用isBoomPosi(int ,int )方法來實現(xiàn)該功能,主要思想是鼠標所點擊的網格的坐標是否與隨機產生的40個雷中的某個坐標相同,若相同,則是雷,若不同,則不是雷。3、若
8、點擊的位置不是雷,怎樣顯示周圍的雷數,又或者怎么才能把周圍的格子拓展開來?getBoomCount(int ,int )該方法主要是來實現(xiàn)如下功能:點擊的網格若不是雷,則計算出周圍8個格子的坐標。getBoomCount(int, int )主要根據上一個方法中所得到的8個坐標計算出這些格子哪些與40個雷的坐標有相同的,并記錄個數count4、當點擊到雷時如何判斷根據點擊的位置,若是該位置為雷,則調用LOSE(int,int)方法,該方法判定玩家為輸,標志為RUN文本框中笑臉變?yōu)榭弈?。當玩家點擊哭臉時,調用以上所提的過的2個方法重置界面,并更新。5、怎樣標記雷的位置mouseReleased(
9、)該方法用來實現(xiàn)此功能,若玩家認為該網格內有雷,右擊鼠標一次,該方法調用getico()方法標記為紅旗,同時,計數文本框的數目減一,若玩家不能判定該網格,可以右擊鼠標2次,以問號為記,計數器減一后又加一。若玩家標記過問號后,能確定該網格內無雷,可再次右擊一次,標記回到原始狀態(tài)。5代碼實現(xiàn)5.1運行效果圖2-7運行主界面效果圖2-8游戲失敗效果圖2-9游戲成功效果圖6總結與說明經過編寫這個掃雷游戲,我認識到應該注意細節(jié)問題,雖然是很小的問題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴謹性,同時還可以為以后的編程積累經驗。編寫完這個掃雷游戲,我發(fā)現(xiàn)自己有很多的不足,我想如果讓我來單獨來編
10、寫這個游戲,我感覺很吃力,因為這個游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實實的打基礎!通過該課程設計,全面系統(tǒng)的理解了程序構造的一般原理和基本實現(xiàn)方法。把死板的課本知識變得生動有趣,激發(fā)了學習的積極性。把學過的計算機編譯原理的知識強化,能夠把課堂上學的知識通過自己設計的程序表示出來,加深了對理論知識的理解?,F(xiàn)在通過自己動手做實驗,從實踐上認識了操作系統(tǒng)是如何處理命令的,課程設計中程序比較復雜,在調試時應該仔細。 在這次課程設計中,我就是按照實驗指導的思想來完成。加深了理解文件系統(tǒng)的內部功能及內部實現(xiàn),培養(yǎng)實踐動手能力和程序開發(fā)能力的目的。7原代碼/初始化方法public void i
11、nit(int row,int col,int boomNum)this.getContentPane().removeAll();if(mytime!=null)mytime.stop();tf.setText("0");bf.setText(boomNum+"");time=0;runFlag=false;this.row=row;this.col=col;this.boomNum=boomNum;viewBoomNum=10;setBoomPosi();this.setBounds(200,200,col*boomWidth+6,row*boomW
12、idth+6+20+40);this.setLayout(null);pan=new JPanel(new GridLayout(row,col);pan.setBounds(0,40,col*boomWidth,row*boomWidth);this.add(pan);but=new JButtonrowcol;hbut=new Handlerrowcol;mh=new Mouse_Handlerrowcol;for(int i=0;i<but.length;i+)for(int j=0;j<buti.length;j+)butij=new JButton(ico0);hbuti
13、j=new Handler(i,j);butij.addActionListener(hbutij);mhij=new Mouse_Handler(this,i,j);butij.addMouseListener(mhij);pan.add(butij);/頂部面板pan2=new JPanel(null);pan2.setBounds(0,5,col*boomWidth,30);bf=new JTextField();bf.setBounds(10,5,30,20);pan2.add(bf);tf=new JTextField();tf.setBounds(pan2.getWidth()-4
14、0,5,30,20);pan2.add(tf);run=new JButton(ico15);run.setBounds(pan2.getWidth()-24)/2,3,24,24);pan2.add(run);this.add(pan2);bf.setText(boomNum+"");tf.setText("0");bf.setEditable(false);tf.setEditable(false);bf.setHorizontalAlignment(JTextField.CENTER);tf.setHorizontalAlignment(JText
15、Field.CENTER);mytime=new SetTime(this);mytime.setDaemon(true);this.repaint();this.validate();run.addActionListener(new ActionListener()public void actionPerformed(ActionEvent arg0) init(9,9,10););/設定雷的位置public void setBoomPosi()posi=new intboomNum;int maxPosi=row*col;posi0=(int)(Math.random()*maxPos
16、i+1);for(int i=1;i<boomNum;)int temp=(int)(Math.random()*maxPosi+1);boolean flag=true;for(int j=0;j<i;j+)if(temp=posij)flag=false;break;if(flag)posii=temp;i+;Arrays.sort(posi);class Handler implements ActionListenerint x,y;public Handler(int x, int y) this.x = x;this.y = y;public void actionPe
17、rformed(ActionEvent arg0) if(!butxy.getIcon().equals(ico2)if(!runFlag)mytime.start();runFlag=true;setType(x,y);isWin();/根據坐標得到位置public int getPosi(int x,int y)return x*col+y+1;/判斷是否是雷的位置public boolean isBoomPosi(int x,int y)int p=getPosi(x,y);for(int i=0;i<posi.length;i+)if(posii=p)return true;re
18、turn false;/得到周圍雷的個數public int getBoomCount(int x,int y)int bounds=this.getBounds(x, y);int count=0;for(int i=0;i<bounds.length;i+)int tx=boundsi0;int ty=boundsi1;if(this.isOK(tx, ty)&&this.isBoomPosi(tx, ty)count+;return count;/得到周圍格子坐標public int getBounds(int x,int y)return new intx-1,y
19、-1,x-1,y,x-1,y+1,x,y+1,x+1,y+1,x+1,y,x+1,y-1,x,y-1;/檢查坐標是否合法public boolean isOK(int x,int y)if(x>=0&&x<row&&y>=0&&y<col)return true;return false;/延展public void setType(int x,int y)if(this.isOK(x, y)&&this.isBoomPosi(x, y)/顯現(xiàn)所有的雷lost(x,y);butxy.setIcon(ico1
20、3);/移除所有監(jiān)聽器removeListener();/停止計時mytime.stop();/改變初始圖標run.setIcon(ico14);else if(this.isOK(x, y)&&!this.isBoomPosi(x, y)/butxy.setBackground(Color.WHITE);if(this.getBoomCount(x,y)!=0)/butxy.setText(this.getBoomCount(x, y)+"");butxy.setIcon(icothis.getBoomCount(x, y)+3);elsebutxy.se
21、tIcon(ico1);int bounds=this.getBounds(x, y);for(int i=0;i<bounds.length;i+)int tx=boundsi0;int ty=boundsi1;if(this.isOK(tx, ty)&&buttxty.getIcon().equals(ico0)setType(tx,ty);/判斷是否贏了public void isWin()int count=0;for(int i=0;i<row;i+)for(int j=0;j<col;j+)if(butij.getIcon().equals(ico
22、0)|butij.getIcon().equals(ico2)|butij.getIcon().equals(ico3)count+;if(count=this.boomNum)removeListener();JOptionPane.showMessageDialog(null,"YOU WIN!");public JButton getBut() return but;public void setBut(JButton but) this.but = but;public int getBoomNum() return boomNum;public void setB
23、oomNum(int boomNum) this.boomNum = boomNum;public int getRow() return row;public void setRow(int row) this.row = row;public int getCol() return col;public void setCol(int col) this.col = col;public int getPosi() return posi;public void setPosi(int posi) this.posi = posi;public static int getBoomWidt
24、h() return boomWidth;public static void setBoomWidth(int boomWidth) Boom.boomWidth = boomWidth;public JPanel getPan() return pan;public void setPan(JPanel pan) this.pan = pan;/輸了public void lost(int x,int y)for(int i=0;i<but.length;i+)for(int j=0;j<buti.length;j+)for(int k=0;k<posi.length;k
25、+)if(this.getPosi(i, j)=posik)butij.setIcon(ico12);break;/移除雷按鈕監(jiān)聽器public void removeListener()for(int i=0;i<but.length;i+)for(int j=0;j<buti.length;j+)butij.removeActionListener(hbutij);butij.removeMouseListener(mhij);public Icon getIco() return ico;public void setIco(Icon ico) this.ico = ico;
26、/改變時間public void setTime()this.time+;tf.setText(time+"");/改變雷數量public void setBoomNum(boolean type)if(type)viewBoomNum+;elseviewBoomNum-;bf.setText(viewBoomNum+"");public JTextField getBf() return bf;public void setBf(JTextField bf) this.bf = bf;public JTextField getTf() return t
27、f;public void setTf(JTextField tf) this.tf = tf;3Mouse_Handler.java、package boom;import java.awt.Color;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JButton;public class Mouse_Handler implements MouseListenerprivate Boom win;private int x,y;public Mouse_Hand
28、ler(Boom win,int x,int y) this.win = win;this.x=x;this.y=y;public void mouseClicked(MouseEvent arg0) public void mouseEntered(MouseEvent arg0) public void mouseExited(MouseEvent arg0) public void mousePressed(MouseEvent arg0) public void mouseReleased(MouseEvent arg0) if(arg0.isPopupTrigger()if(win.getBut()xy.getIcon().equals(win.getIco()0)win.getBut()xy.setIcon(win.getIco()2);win.setBoomNum(false);else if(win.getBut()xy.getIcon().equals(win.getIco()2)win.getBut()xy.setIcon(win.getIco()3);win.setBoomNum(true);else if(win.getBut
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)級智能零售解決方案協(xié)議
- 鋼鐵制品生產加工投資協(xié)議
- 傲慢與偏見節(jié)選英文閱讀與理解教學教案
- 人工智能人才培訓合作協(xié)議
- 車間場地租賃合同
- 高中生英語閱讀理解征文
- 農業(yè)項目管理方案
- 保密信息及非競爭協(xié)議條款
- 智能機器人研發(fā)與生產計劃書
- 童年小說人物解析作文
- 鋼樓梯計算書
- 中藥貼敷療法
- 2024年江蘇農牧科技職業(yè)學院單招職業(yè)適應性測試題庫各版本
- DZ∕T 0054-2014 定向鉆探技術規(guī)程(正式版)
- 頭療加盟方案
- 間質性腎炎課件
- 院感基礎知識培訓
- 《建筑工程質量與安全管理》教案
- 19J102-1 19G613混凝土小型空心砌塊墻體建筑與結構構造
- 建筑垃圾清運及處置 投標方案(技術方案)
- 2024年常州信息職業(yè)技術學院單招職業(yè)技能測試題庫及答案解析
評論
0/150
提交評論