版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《 面向對象程序設計》</p><p><b> 課程設計報告</b></p><p> 題 目: 掃雷游戲設計 </p><p> 院 (系): 計算機與電子系 </p><p> 專業(yè)班級: 計算機科學與技術090
2、3班 </p><p> 學生姓名: ============ </p><p> 學 號: ============ </p><p> 指導教師: ======= </p><p> 20 12 年 6 月 4 日至20 1
3、2 年 6 月 15 日</p><p> 面向對象程序設計 課程設計任務書</p><p><b> 目 錄</b></p><p> 1需求與總體設計……………………………………………………………………………1</p><p> 1.1需求分析………………………………………………………………………
4、1</p><p> 1.2總體設計………………………………………………………………………1</p><p> 2詳細設計…………………………………………………………………………………4</p><p> 2.1 MineGame類………………………………………………………………………4</p><p> 2.2 MineArea類…
5、……………………………………………………………………5</p><p> 2.3 Block類………………………………………………………………………6</p><p> 2.4 BlockView類………………………………………………………………………7</p><p> 2.5 LayMines類………………………………………………………………………8<
6、;/p><p> 2.6 Record類………………………………………………………………………8</p><p> 2.7 ShowRecord類……………………………………………………………………9</p><p> 2.8 userDifine類………………………………………………………………………9</p><p> 3編碼實現(xiàn)……
7、……………………………………………………………………………11</p><p> 3.1 MineGame類……………………………………………………………11</p><p> 3.2 MineArea類………………………………………………………………14</p><p> 3.3 Block類………………………………………………………………………17<
8、/p><p> 3.4 BlockView類………………………………………………………………………18</p><p> 3.5 LayMines類………………………………………………………………………19</p><p> 3.6 Record類………………………………………………………………………20</p><p> 3.7 Sho
9、wRecord類…………………………………………………………………21</p><p> 3.8 userDifine類………………………………………………………………………24</p><p> 4系統(tǒng)測試…………………………………………………………………………………26</p><p> 總結…………………………………………………………………………………3
10、0</p><p><b> 1需求與總體設計</b></p><p><b> 1.1需求分析</b></p><p> 1.1.1掃雷游戲概述</p><p> 掃雷是一種具有迷惑性的對記憶和推理能力的簡單測試,它是長久以來最受歡迎的 Windows 游戲之一。游戲目標:找出空方塊,同時
11、避免觸雷。</p><p> 1.1.2掃雷的操作方法</p><p> 游戲主區(qū)域由很多個方格組成。使用鼠標隨機點擊一個方格,方格即被打開并顯示出方格中的數(shù)字;方格中數(shù)字則表示其周圍的8個方格隱藏了幾顆雷;如果點開的格子為空白格,即其周圍有0顆雷,則其周圍格子自動打開。</p><p> 例如,方格中出現(xiàn)1,說明上下左右及斜角合計有一顆雷,依次類推,2則有2
12、顆,3則有3顆。</p><p> 1.1.3游戲具有的功能</p><p> I.能夠顯示主菜單和界面</p><p> 游戲需要提供主菜單讓玩家進行游戲設置,同時能夠顯示當前剩余的地雷數(shù)量及當前花費時間等相關信息到界面上。</p><p> II.能夠接收鼠標輸入功能</p><p> 能夠接收玩家的鼠標
13、輸入功能,左鍵和右鍵輸入。</p><p> III. 能夠根據(jù)規(guī)則翻轉相應的格子</p><p> 翻動指定位置的格子。</p><p> IV. 能夠標示指定格子的功能</p><p> 即能夠對確定或者懷疑是地雷的格子進行"旗子"和"?"符號的標示。</p><p>
14、; V.游戲勝負判斷功能</p><p> 當玩家單擊的格子中有地雷時,判定玩家失敗,游戲結束。當掃雷游戲中全部格子被打開時,判定玩家成功。</p><p><b> VI英雄榜記錄更新</b></p><p> 當有玩家把當前等級的地雷全部掃出來后,并且時間比記錄中的時間短時,在結束游戲時,要求玩家把名字保存下來。游戲初始時時間為99
15、9秒。</p><p> 例如,當?shù)谝粋€玩家把全部地雷掃出來的時間為120秒,這時玩家的記錄時間將被保存下來并作為記錄時間線。直到有玩家的時間少于120秒,才能更新當前記錄時間線并保存玩家的名字。</p><p><b> 1.2總體設計</b></p><p> 在設計掃雷游戲時,需要編寫8個Java源文件:MineGame.java、
16、MineArea.java、Block.java、BlockView.java、userDefine.java、LayMines.java、Record.java和ShowRecord.java.掃雷游戲除了需要編寫上述8個Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,例如File、JButton和JLabel等類。掃雷游戲所用到的一些重要的類以及之間的組合關系如圖1-1所示,系統(tǒng)功能圖如圖1-2所示。</p&
17、gt;<p> 1.2.1 MineGame.java(主類)</p><p> MineGame類負責創(chuàng)建掃雷游戲主窗口,該文件含有main方法。掃雷游戲從該類開始執(zhí)行。</p><p> 1.2.2 MineArea.java</p><p> MineArea類創(chuàng)建的對象是MineArea類最重要的成員之一,代表“掃雷區(qū)域”。</p
18、><p> 1.2.3 Block.java</p><p> Block類是雷區(qū)中“方塊”的類封裝,含有關于“方塊”的屬性以及操作,即負責為雷區(qū)創(chuàng)建代表“方塊”的Block對象。</p><p> 1.2.4 BlockView.java</p><p> BlockView是JPanel容器的子類,BlockView創(chuàng)建的對象負責為B
19、lock對象提供視圖,以方便用戶通過該視圖與Block對象交互。</p><p> 1.2.5 LayMines.java</p><p> LayMine類對象不需要視圖,在游戲中不需要看見該類。LayMine對象使用隨機算法指定MineArea對象中的哪些Block對象是雷,哪些Block對象不是雷。</p><p> 1.2.6 Record.java&
20、lt;/p><p> Record類是JDialog對話框的子類,對用戶掃雷成功時,Record對象負責保存用戶的成績到文件。</p><p> 1.2.7 ShowRecord.java</p><p> ShowRecord類是JDialog對話框的子類,當用戶查看掃雷的最好成績時,ShowRecord對象負責提供讀取文件數(shù)據(jù)的界面。</p>&
21、lt;p> 1.2.8 userDefine 類</p><p> userDefine 類是JDialog對話框的子類,當用戶想自定義掃雷難度時,ShowRecord對象負責設置用戶想要的難度設置。</p><p><b> 2詳細設計</b></p><p> 2.1 MineGame類</p><p>
22、; MineGame類是javax.swing包中JFrame的一個子類,并實現(xiàn)了ActionListener接口。標明該類的只要成員變量和方法的UML圖如圖2-1所示。</p><p> 以下是UML圖中有關數(shù)據(jù)和方法的詳細說明。</p><p><b> 成員變量</b></p><p> bar和fileMenu提供菜單操作,單擊
23、游戲菜單項為“開始”、“初級”、“中級”、“高級”、“掃雷英雄榜”、“自定義”和“退出”。單擊幫助菜單項為“關于”。</p><p> mineArea是掃雷區(qū)域,提供有關掃雷的主要功能。</p><p> “英雄榜”負責存放三個級別的掃雷最好成績。</p><p> showHeroRecord負責顯示英雄榜中的數(shù)據(jù)。</p><p>
24、;<b> 方法</b></p><p> MineGame()是構造方法,負責完成窗口的初始化。</p><p> ActionPerformed(ActionEven)方法是MineGame類實現(xiàn)的ActionListener接口中的方法,該方法負責執(zhí)行菜單發(fā)出的有關命令。用戶選擇菜單中的菜單項可觸發(fā)ActionEvent事件,導致actionPerform
25、ed(ActionEvent)方法執(zhí)行相應的操作,例如將mineArea創(chuàng)建的雷區(qū)設置為初級、中級、高級。</p><p> main(String[])方法是程序運行的入口方法。</p><p> 2.2 MineArea類</p><p> MineArea類是javax.swing包中JPanel容器的子類,實現(xiàn)了ActionListener和Mouse
26、Listener接口,所創(chuàng)建的對象:mineArea是MineGame類中最重要的成員之一,作為一個容器添加到MineGame窗口的中心。標明MineArea類的主要成員變量、方法以及和MineGame類之間組合關系的UML圖如圖2-2所示。</p><p> 以下是UML圖中有關數(shù)據(jù)和方法的詳細說明。</p><p><b> 成員變量</b></p>
27、;<p> a. Block是Block類型的數(shù)組,用來確定雷區(qū)有多少需進行掃雷的方塊。</p><p> b. blockView是Blockview類型的數(shù)組,負責為block數(shù)組中的Block對象提供視圖。</p><p> c. Lay是LayMines類型的對象,負責設置block數(shù)組中的哪些方塊是雷或不是雷。</p><p> d.
28、 Record負責提供保存成績的界面,是一個對話框,默認不可見。用戶只有掃雷成功后(用時最少),才能看見該對話框。</p><p> e. reStart是一個按鈕對象,用戶單擊它重新開始游戲。</p><p> f. time是計時器對象,負責計算用戶的用時。</p><p><b> 2)方法</b></p><p
29、> A. initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設置雷區(qū)的寬度,高度,雷的數(shù)目以及雷區(qū)的級別。</p><p> B. actionPerformed(ActionEvent)是MIneArea類實現(xiàn)ActionListener接口中的方法。當用戶單擊blockView中的某個方塊時,actionPerformed(ActionEvent)方法負責執(zhí)行有關算法
30、,例如,當用鼠標左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪?,若該方塊下又雷,actionPerformed(ActionEvent)方法將顯示BlockView對象中的標簽,該標簽上是一個數(shù)字,該數(shù)字代表當前方塊的周圍的8個方塊中總共有多少顆雷。</p><p> C. show()方法是一個遞歸方法。actionPerformed(Ac
31、tionEvent)方法執(zhí)行時將調(diào)用show方法進行掃雷。</p><p> D. mousePress(MouseEvent)方法是MineArea類實現(xiàn)的MouseListener接口中的方法,當用戶按下鼠標右鍵時,mousePress(MouseEvent)方法負責讓方塊上顯示一個探雷標記。</p><p> E. inquireWin()方法用來判斷用戶是否掃雷成功,如果成功該
32、方法負責讓record對話框可見。所謂掃雷成功是指不僅找到了全部的雷而且用時最少。</p><p> 2.3 Block類</p><p> Block對象負責封裝雷區(qū)中方塊中的數(shù)據(jù)以及對這些數(shù)據(jù)的操作,外觀效果由Blockview負責提供(見后面的BlockView)。</p><p> Block類創(chuàng)建的對象是數(shù)組block的單元的對象。Block型數(shù)組b
33、lock是MineArea類的重要成員之一。標明Block類的主要成員變量和方法以及和MineArea類之間的組合關系的UML圖如下圖2-3所示。</p><p> 圖2-3 Block類的UML圖</p><p> 以下是UML圖中有關數(shù)據(jù)的方法的詳細說明。</p><p><b> 1)成員變量</b></p><
34、p> a. name是方塊上的名字。</p><p> b. aroundMineNumber是方塊周圍雷的數(shù)目。</p><p> c. mineIcon是方塊上雷的圖標。</p><p> d. sMine用來表示方塊是否是雷。</p><p> e. isMark用來表示方塊是否被標記。</p><p
35、> f. isOpen用來表示方塊是否被挖開。</p><p><b> 2)方法</b></p><p> A. setAroundMineNumber(int)方法用來設置aroundMineNumber的值。</p><p> B. getAroundMineNumber()方法用來獲取aroundMineNumber的值。
36、</p><p> 2.4 BlockView類</p><p> BlockView創(chuàng)建的對象負責為Block對象提供視圖,以便用戶通過該視圖與Block對象交互。BlockView對象使用一個標簽和按鈕為Block對象提供視圖,標簽和按鈕按著卡片布局層疊在一起,默認狀態(tài)按鈕遮擋住標簽。當用戶單擊按鈕后,如果Block對象時雷,BlockView對象中的標簽顯示的事雷的圖標;如果Bl
37、ock對象不是雷,標簽顯示的是周圍雷的總數(shù)。</p><p> BlockView類是javax。swing包中JPanel類的一個子類,創(chuàng)建的對象是數(shù)組blockView的單元中的對象。BlockView型數(shù)組BlockView是MineArea類的重要成員之一。標明BlockView類的主要成員變量和方法以及和MineArea類之間的組合關系的UML圖如圖2-4所示。</p><p>
38、; 圖2-4 BlockView類的UML圖</p><p> 以下是UML圖中有關數(shù)據(jù)的方法的詳細說明。</p><p><b> 1)成員變量</b></p><p> a. blockNameOrIcon用來顯示Block對象的name,number和mineIcon屬性。</p><p> b. blo
39、ckCover用來遮擋blockNameOrIcon。</p><p> c. card卡片布局。</p><p><b> 2)方法</b></p><p> A. giveView(Block block)方法給參數(shù)指定的Block對象提供視圖,如果Block對象的isMine屬性為true,即方塊是雷,那么blockNameOrIc
40、on標簽上設置的文本就是Block對象的name屬性的值,同時blockNameOrIcon標簽上設置的圖標就是Block對象的mineIcon指定的圖標。如果Block對象的isMine屬性為false,blockNameOrIcon標簽上設置的圖標就是Block對象的aroundMineNumber屬性的值,及周圍雷的數(shù)目</p><p> B. seeblockNameOrIcon()方法讓用戶看見視圖中
41、的標簽,無法看見按鈕。</p><p> C. seeblockNameOrIcon(0方法讓用戶看見視圖中的按鈕,無法看見標簽。</p><p> 2.5 LayMines類</p><p> LayMines對象使用隨機算法制定MineArea對象中的哪些Block對象是雷,哪些對象不是雷,沒有可現(xiàn)實的效果圖。</p><p>
42、LayMines創(chuàng)建的對象Lay是MineArea中的重要成員,表明該類的主要成員變量和方法以及和MineArea類之間組合關系的UML圖如圖2-5所示。</p><p> 圖2-5 LayMines類的UML圖</p><p> 以下是UML圖中有關數(shù)據(jù)的方法的詳細說明。</p><p><b> 1)成員變量</b></p&g
43、t;<p> mineIcon用來存放一個格式為gif的圖像。</p><p><b> 2)方法</b></p><p> layMinesForBlock(Block[][],in)方法對參數(shù)指定的Block數(shù)組進行設置,其中int參數(shù)指定雷的數(shù)目,當指定Block數(shù)組中每個單元中的方塊是雷時,就將該房快上的圖標設置為mineIcon,當指定B
44、lock數(shù)組中每個單元中的方塊不是雷時,就將該方塊的名字設置為周圍的雷的數(shù)目。</p><p> 2.6 Record類</p><p> Record創(chuàng)建的對象負責提供保存成績的界面。</p><p> Record是javax。swing包中jDialog對話框的子類,并實現(xiàn)了ActionListener接口。Record創(chuàng)建的對象:record是Mine
45、Area類的成員之一,當用戶掃雷成功時,該對象提供了保存成績到文件的界面。標明Record類的主要成員變量,方法以及和MineArea類之間組合關系的UML圖如圖2-6所示。</p><p> 圖2-6 Record類的UML圖</p><p> 以下是UML圖中有關數(shù)據(jù)的方法的詳細說明。</p><p><b> 1)成員變量</b>
46、</p><p> ·textName提供用戶掃雷優(yōu)勝者輸入姓名</p><p> ·用戶單擊”確定“按鈕,可以保存成績</p><p><b> 2)方法</b></p><p> ·actionPerformed(ActionEvent)方法是Record類實現(xiàn)的ActionLi
47、stener接口中的方法,當用戶單擊”確定“按鈕后,該方法被執(zhí)行,所執(zhí)行的操作就是獲取用戶輸入的名字和用時然后調(diào)用writeRecord(String,String)方法將信息寫入”英雄榜“中。</p><p> ·writeRecord(String,String)方法負責將有關信息掃雷用時,掃雷級別,掃雷優(yōu)勝者姓名等心思寫入到”英雄榜“文件。</p><p> 2.7 S
48、howRecord類</p><p> ShowRecord創(chuàng)建的對象負責提供顯示成績的界面。</p><p> ShowRecord是javax。swing包中JDialog對話框的子類,并實現(xiàn)了ActionListener接口。ShowReacord創(chuàng)建的對象showHeroRecord是MineGame類的成員之一,當用戶選擇查看"英雄榜“菜單項時,該對話框可見,提供了
49、查看掃雷的最好成績的界面。標明ShowRecord類的主要成員變量,方法以及和MineGame類之間組合關系的UML圖如圖2-7所示。</p><p> 圖2-7 ShowRecord類的UML圖</p><p> 以下是UML圖中有關數(shù)據(jù)的方法的詳細說明。</p><p><b> 成員變量</b></p><p&
50、gt; ·File存放文件的引用</p><p> ·用戶單擊”顯示成績“按鈕,可以查看各個級別掃雷的最好成績。</p><p> ·用戶單擊”重新計分“按鈕,可以將”英雄榜“中的成績恢復為初始值。</p><p><b> 2)方法</b></p><p> ·acti
51、onPerformed(ActionEvent)方法是ShowRecord類實現(xiàn)的ActionListener接口中的方法,當用戶單擊”顯示成績“按鈕后,該方法被執(zhí)行,所執(zhí)行的操作就是調(diào)用readAndShow()方法。</p><p> ·readAndShow()方法負責讀取存放在文件中的各個級別的掃雷最好成績以及掃雷者姓名,并顯示這些相關信息。</p><p> 2.8
52、 userDefine 類</p><p> userDefine是java.awt包中Rame框架的子類,并實現(xiàn)了ActionListener接口。userDefine創(chuàng)建的對像:usedefine是MineArea類的成員之一,當用戶點擊菜單欄中的游戲->自定義時,彈出界面,在界面的文本框中輸入相應的數(shù)字。然后單擊確定即可,或者單擊取消退出界面。標明userDefine類的主要成員變量、方法以及和Mi
53、neArea類之間的組合關系的UML圖如圖2-8所示。</p><p> 以下是UML圖中有關數(shù)據(jù)和方法的詳細說明。</p><p><b> 1)成員變量</b></p><p> a. row,colum,mineCount,score:分別用來顯示行數(shù),列數(shù),雷數(shù),分數(shù)</p><p> b. row1,c
54、olum1, mineCount1,score1:用來自定義雷區(qū)的長度值,寬度值,所有的雷數(shù)值以及每贏一局所得的分數(shù)</p><p> c. ex1,ex2,ex3,ex4::用來說明上述內(nèi)容</p><p> d. con1,con2,con3,con4:用來裝Label 和TextFiled,以方便布局</p><p> e. 確定,取消;單擊“確定”后,
55、如果輸入的內(nèi)容合法,就會實現(xiàn)自定義的雷區(qū),如果不合法的話,就會彈出一個警告框,提示輸入有誤;單擊“取消”退出自定義窗口。</p><p><b> 2)方法</b></p><p> actionPerformrd(ActonEvent)方法是userDefine類中實現(xiàn)的ActionListener接口中的方法,當用戶單擊界面的“確定”,該方法被執(zhí)行,所執(zhí)行的操
56、作就是,將用戶輸入的信息傳入程序,實驗自定義雷區(qū)的難度級別。當用戶單擊界面的“取消”,該方法被執(zhí)行,所執(zhí)行的操作就是,退出用戶自定義界面。</p><p><b> 3編碼實現(xiàn)</b></p><p> 各個類的的主要源代碼實現(xiàn)如下:</p><p> 3.1 MineGame.java(主類)</p><p>
57、 import java.awt.event.*;//包含事件類</p><p> import java.awt.*;//包含抽象窗口工具集中的圖形文本、窗口GUI類</p><p> import javax.swing.*;//包含SWING組件</p><p> import javax.swing.Box.Filler;</p>&l
58、t;p> import javax.swing.border.*;//包含布局類</p><p> import java.util.*;//包含有用的數(shù)據(jù)類型類</p><p> import java.util.List;</p><p> import java.io.*;//包含輸入流和輸出流類</p><p> im
59、port javax.swing.ImageIcon;//包含圖標</p><p> public class MineGame extends JFrame implements ActionListener{</p><p> JMenuBar menubar; //負責創(chuàng)建菜單條</p><p> JMenuItem 開始,初級,中級,高級,掃雷英
60、雄榜,自定義,退出,關于;//負責創(chuàng)建菜單項</p><p> JMenu fileMenu,helpMenu;//負責創(chuàng)建菜單</p><p> ImageIcon app;//負責創(chuàng)建標題欄的圖標</p><p> JLabel l1,l2,l3,l4;</p><p> JTextArea ta;</p><
61、p> MineArea mineArea=null; </p><p> File 英雄榜=new File("英雄榜.txt");//創(chuàng)建文件保存記錄</p><p> Hashtable hashtable=null;</p><p> ShowRecord showHeroRecord=null;</p>
62、<p> userDefine userdefine=new userDefine();//調(diào)用userDefine類 </p><p> MineGame(){</p><p> mineArea=new MineArea(8,8,10,1);</p><p> add(mineArea,BorderLayout.CENTER);
63、 </p><p> app=new ImageIcon("app.gif");//給標題欄創(chuàng)建圖標</p><p> setIconImage(app.getImage());//獲取圖標并調(diào)用類實現(xiàn)</p><p> setTitle("掃雷"); //加入標題字段 &l
64、t;/p><p> menubar=new JMenuBar();//創(chuàng)建菜單條</p><p> JMenu fileMenu=new JMenu("游戲(G)");//創(chuàng)建菜單</p><p> JMenu helpMenu=new JMenu("幫助(H)");//創(chuàng)建菜單</p><p>
65、fileMenu.setMnemonic('G');</p><p> helpMenu.setMnemonic('H'); </p><p> 開始=new JMenuItem("開始");//創(chuàng)建菜單項</p><p> 開始.setAccelerator(KeyStroke.getKey
66、Stroke(KeyEvent.VK_F2,0));//添加快捷方式</p><p> 初級=new JMenuItem("初級");</p><p> 中級=new JMenuItem("中級");</p><p> 高級=new JMenuItem("高級");</p><p&
67、gt; 掃雷英雄榜=new JMenuItem("掃雷英雄榜"); </p><p> 掃雷英雄榜.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0));</p><p> 自定義=new JMenuItem("自定義",KeyEvent.VK_S);</p><p
68、> 自定義.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));</p><p> 退出=new JMenuItem("退出");</p><p> 關于 = new JMenuItem("關于");</p><p> 關于.setAccelerato
69、r(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0)); </p><p> fileMenu.add(開始); //加入菜單的容器 </p><p> fileMenu.addSeparator();//加入分隔符</p><p> fileMenu.add(初級);</p><
70、;p> fileMenu.add(中級);</p><p> fileMenu.add(高級);</p><p> fileMenu.addSeparator();</p><p> fileMenu.add(掃雷英雄榜);</p><p> fileMenu.addSeparator();</p><p&
71、gt; fileMenu.add(自定義);</p><p> fileMenu.addSeparator();</p><p> fileMenu.add(退出);</p><p> helpMenu.add(關于); </p><p> menubar.add(fileMenu);//加入菜單條的容器</p
72、><p> menubar.add(helpMenu); </p><p> setJMenuBar(menubar);//完成封裝</p><p><b> //添加事件監(jiān)聽器</b></p><p> 開始.addActionListener(this);</p><p>
73、 初級.addActionListener(this);</p><p> 中級.addActionListener(this);</p><p> 高級.addActionListener(this);</p><p> 掃雷英雄榜.addActionListener(this);</p><p> 自定義.addActionLi
74、stener(this);</p><p> 退出.addActionListener(this);</p><p> 關于.addActionListener(this);</p><p><b> //設置英雄榜</b></p><p> hashtable=new Hashtable();</p>
75、;<p> hashtable.put("初級","初級#"+999+"#匿名"); </p><p> hashtable.put("中級","中級#"+999+"#匿名");</p><p> hashtable.put("高級"
76、;,"高級#"+999+"#匿名");</p><p> if(!英雄榜.exists()) {</p><p> try{ FileOutputStream out=new FileOutputStream(英雄榜);</p><p> ObjectOutputStream objectOut=new ObjectOu
77、tputStream(out);</p><p> objectOut.writeObject(hashtable);</p><p> objectOut.close();</p><p> out.close();</p><p><b> }</b></p><p> catch(
78、IOException e){}</p><p><b> }</b></p><p> showHeroRecord=new ShowRecord(this,hashtable);</p><p> setBounds(100,100,300,300);</p><p> setVisible(true);//
79、設為可見</p><p> setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//結束窗體所在的應用程序</p><p> validate(); }</p><p> //負責執(zhí)行菜單發(fā)出的有關命令</p><p> public void actionPerformed(Acti
80、onEvent e){</p><p> if(e.getSource()==開始){</p><p> mineArea.initMineArea(8,8,10,1);//默認為初級 }</p><p> if(e.getSource()==初級){</p><p> mineArea.initMineArea(8,8,10,1);
81、</p><p> setBounds(100,100,300,300);</p><p> mineArea.showTime.setText("0");</p><p> mineArea.time.stop(); }</p><p> if(e.getSource()==中級){</p>&
82、lt;p> mineArea.initMineArea(16,16,40,2);</p><p> setBounds(100,100,500,500);</p><p> mineArea.showTime.setText("0");</p><p> mineArea.time.stop(); }</p>&l
83、t;p> if(e.getSource()==高級){</p><p> mineArea.initMineArea(22,22,99,3);</p><p> setBounds(100,100,650,650);</p><p> mineArea.showTime.setText("0");</p><p&
84、gt; mineArea.time.stop(); }</p><p> if(e.getSource()==掃雷英雄榜){ </p><p> if(showHeroRecord!=null)</p><p> showHeroRecord.setVisible(true); }</p><p> if(e.getSou
85、rce()==自定義){</p><p> userdefine.setVisible(true); }</p><p> if(e.getSource()==退出){</p><p> System.exit(0); }</p><p> if(e.getSource()==關于){</p><p>
86、; JDialog dialog=new JDialog();</p><p> dialog.setTitle("關于幫助"); </p><p> FlowLayout fl=new FlowLayout();</p><p> dialog.setLayout(fl); </p><
87、;p> dialog.setSize(500,500);</p><p> dialog.setVisible(true); </p><p> String s="掃雷游戲的規(guī)則如下:";</p><p> final JLabel l1 = new JLabel();</p><p>
88、l1.setText(s); </p><p> l1.setForeground(new Color(0,0,0));</p><p> l1.setFont(new Font("Dialog",10,20));</p><p> // l1.setBounds(60,84,345,26);
89、 </p><p> final JLabel l2 = new JLabel("1,游戲區(qū)包括雷區(qū)、地雷計數(shù)器和計時器.");</p><p> final JLabel l3 = new JLabel("2,通過單擊即可挖開方塊,如果挖開的是地雷,則您輸?shù)粲螒?");</p><p> final JLabel
90、 l4 = new JLabel("3,如果方塊上出現(xiàn)數(shù)字,表示在其周圍的八個方塊中共有多少顆地雷"); </p><p> dialog.add(l1);</p><p> dialog.add(l2);</p><p> dialog.add(l3);</p><p
91、> dialog.add(l4);</p><p> setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); </p><p> if(dialog!=null){</p><p> dialog.setVisible(true); }</p><
92、p><b> }</b></p><p> validate(); }</p><p> public static void main(String args[]){</p><p> MineGame mg = new MineGame();}</p><p><b> }</b>
93、;</p><p> 3.2 MineArea.java</p><p> public MineArea(int row,int colum,int mineCount,int grade) {</p><p> reStart=new JButton("重新開始");</p><p> mark=new Ima
94、geIcon("flag.gif"); //探雷標記</p><p> time=new Timer(1000,this); </p><p> showTime=new JTextField(3);</p><p> showMarkedMineCount=new JTextField(3);</p>&l
95、t;p> showTime.setHorizontalAlignment(JTextField.CENTER);</p><p> showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);</p><p> showMarkedMineCount.setFont(new Font("Arial&quo
96、t;,Font.BOLD,16));</p><p> showTime.setFont(new Font("Arial",Font.BOLD,16)); </p><p> showTime.setEditable(false);//不可更改</p><p> showMarkedMineCount.setEditable(false);
97、 </p><p> pCenter=new JPanel();//創(chuàng)建面板</p><p> pSouth=new JPanel();</p><p> la1 = new JLabel(new ImageIcon("app.gif"));</p><p> la2 = new JLabel(new ImageI
98、con("time.gif")); </p><p> pCenter.setBorder(BorderFactory.createLoweredBevelBorder());</p><p> lay=new LayMines(); </p><p> initMineArea(row,colum,
99、mineCount,grade); //初始化雷區(qū)</p><p> reStart.addActionListener(this);</p><p> pSouth.add(la1);</p><p> pSouth.add(showMarkedMineCount);</p><p> pSouth.add(reStart); &l
100、t;/p><p> pSouth.add(showTime);</p><p> pSouth.add(la2);</p><p> setLayout(new BorderLayout());</p><p> add(pSouth,BorderLayout.SOUTH);</p><p> add(pCent
101、er,BorderLayout.CENTER); }</p><p> public void initMineArea(int row,int colum,int mineCount,int grade){</p><p> pCenter.removeAll();</p><p> spendTime=0;</p><p>
102、 markMount=mineCount;</p><p> this.row=row;</p><p> this.colum=colum;</p><p> this.mineCount=mineCount; </p><p> this.grade=grade; </p><p> block=new
103、Block[row][colum];</p><p> for(int i=0;i<row;i++){</p><p> for(int j=0;j<colum;j++)</p><p> block[i][j]=new Block();</p><p><b> }</b></p>&
104、lt;p> lay.layMinesForBlock(block,mineCount); </p><p> blockView=new BlockView[row][colum];</p><p> pCenter.setLayout(new GridLayout(row,colum));</p><p> for(int i=0;i<r
105、ow;i++) {</p><p> for(int j=0;j<colum;j++) {</p><p> blockView[i][j]=new BlockView(); </p><p> blockView[i][j].giveView(block[i][j]); //給block[i][j]提供視圖</p><p>
106、pCenter.add(blockView[i][j]);</p><p> blockView[i][j].getBlockCover().addActionListener(this);</p><p> blockView[i][j].getBlockCover().addMouseListener(this);</p><p> blockView[i
107、][j].seeBlockCover();</p><p> blockView[i][j].getBlockCover().setEnabled(true);</p><p> blockView[i][j].getBlockCover().setIcon(null);</p><p><b> }</b></p><
108、;p><b> }</b></p><p> showMarkedMineCount.setText(""+markMount); </p><p> validate();</p><p><b> }</b></p><p> //當用戶單擊BlockView
109、中的某個方塊時,執(zhí)行有關算法</p><p> public void actionPerformed(ActionEvent e) {</p><p> //點擊Block方塊區(qū)域 </p><p> if(e.getSource()!=reStart&&e.getSource()!=time) {</p><p>
110、; time.start(); //開始計時</p><p> int m=-1,n=-1; </p><p> for(int i=0;i<row;i++) {</p><p> for(int j=0;j<colum;j++) {</p><p> if(e.getSource()==blockView[i][j]
111、.getBlockCover()){</p><p><b> m=i;</b></p><p><b> n=j;</b></p><p><b> break;</b></p><p><b> }</b></p><p&g
112、t;<b> }</b></p><p><b> }</b></p><p> //鼠標左鍵單擊方塊上的按鈕,</p><p> if(block[m][n].isMine()) {//如果該方塊有雷,則用戶輸?shù)舯揪?lt;/p><p> for(int i=0;i<row;i++)
113、{</p><p> for(int j=0;j<colum;j++) {</p><p> blockView[i][j].getBlockCover().setEnabled(false);</p><p> if(block[i][j].isMine())</p><p> blockView[i][j].seeBlock
114、NameOrIcon();</p><p><b> }</b></p><p><b> }</b></p><p> time.stop();</p><p> spendTime=0;</p><p> markMount=mineCount;</p&g
115、t;<p><b> }</b></p><p> else { //若該方塊下面沒有雷</p><p> show(m,n); //見本類后面的show方法</p><p><b> }</b></p><p><b> }</b>&
116、lt;/p><p> else if(e.getSource()==reStart) {</p><p> initMineArea(row,colum,mineCount,grade);</p><p> time.stop();</p><p> showTime.setText("0");</p>
117、<p><b> }</b></p><p> else if(e.getSource()==time){</p><p> spendTime++;</p><p> showTime.setText(""+spendTime);</p><p><b> }</
118、b></p><p> inquireWin();</p><p><b> }</b></p><p><b> //顯示周圍雷數(shù)</b></p><p> public void show(int m,int n) { if(block[m][n].getAroundMin
119、eNumber()>0&&block[m][n].getIsOpen()==false){ //周圍有雷</p><p> blockView[m][n].seeBlockNameOrIcon();</p><p> block[m][n].setIsOpen(true);</p><p><b> return;&l
120、t;/b></p><p><b> }</b></p><p> else if(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){</p><p><b> //周圍沒有雷</b></p>
121、<p> blockView[m][n].seeBlockNameOrIcon();</p><p> block[m][n].setIsOpen(true);</p><p> for(int k=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++) {</p><p> for(int t=Math.m
122、ax(n-1,0);t<=Math.min(n+1,colum-1);t++)</p><p> show(k,t);</p><p><b> } </b></p><p><b> } </b></p><p><b> }</b></p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論