2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  《 面向?qū)ο蟪绦蛟O(shè)計(jì)》</p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  題 目: 掃雷游戲設(shè)計(jì) </p><p>  院 (系): 計(jì)算機(jī)與電子系 </p><p>  專業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)090

2、3班 </p><p>  學(xué)生姓名: ============ </p><p>  學(xué) 號(hào): ============ </p><p>  指導(dǎo)教師: ======= </p><p>  20 12 年 6 月 4 日至20 1

3、2 年 6 月 15 日</p><p>  面向?qū)ο蟪绦蛟O(shè)計(jì) 課程設(shè)計(jì)任務(wù)書</p><p><b>  目 錄</b></p><p>  1需求與總體設(shè)計(jì)……………………………………………………………………………1</p><p>  1.1需求分析………………………………………………………………………

4、1</p><p>  1.2總體設(shè)計(jì)………………………………………………………………………1</p><p>  2詳細(xì)設(shè)計(jì)…………………………………………………………………………………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編碼實(shí)現(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)測(cè)試…………………………………………………………………………………26</p><p>  總結(jié)…………………………………………………………………………………3

10、0</p><p><b>  1需求與總體設(shè)計(jì)</b></p><p><b>  1.1需求分析</b></p><p>  1.1.1掃雷游戲概述</p><p>  掃雷是一種具有迷惑性的對(duì)記憶和推理能力的簡(jiǎn)單測(cè)試,它是長久以來最受歡迎的 Windows 游戲之一。游戲目標(biāo):找出空方塊,同時(shí)

11、避免觸雷。</p><p>  1.1.2掃雷的操作方法</p><p>  游戲主區(qū)域由很多個(gè)方格組成。使用鼠標(biāo)隨機(jī)點(diǎn)擊一個(gè)方格,方格即被打開并顯示出方格中的數(shù)字;方格中數(shù)字則表示其周圍的8個(gè)方格隱藏了幾顆雷;如果點(diǎn)開的格子為空白格,即其周圍有0顆雷,則其周圍格子自動(dòng)打開。</p><p>  例如,方格中出現(xiàn)1,說明上下左右及斜角合計(jì)有一顆雷,依次類推,2則有2

12、顆,3則有3顆。</p><p>  1.1.3游戲具有的功能</p><p>  I.能夠顯示主菜單和界面</p><p>  游戲需要提供主菜單讓玩家進(jìn)行游戲設(shè)置,同時(shí)能夠顯示當(dāng)前剩余的地雷數(shù)量及當(dāng)前花費(fèi)時(shí)間等相關(guān)信息到界面上。</p><p>  II.能夠接收鼠標(biāo)輸入功能</p><p>  能夠接收玩家的鼠標(biāo)

13、輸入功能,左鍵和右鍵輸入。</p><p>  III. 能夠根據(jù)規(guī)則翻轉(zhuǎn)相應(yīng)的格子</p><p>  翻動(dòng)指定位置的格子。</p><p>  IV. 能夠標(biāo)示指定格子的功能</p><p>  即能夠?qū)Υ_定或者懷疑是地雷的格子進(jìn)行"旗子"和"?"符號(hào)的標(biāo)示。</p><p>

14、;  V.游戲勝負(fù)判斷功能</p><p>  當(dāng)玩家單擊的格子中有地雷時(shí),判定玩家失敗,游戲結(jié)束。當(dāng)掃雷游戲中全部格子被打開時(shí),判定玩家成功。</p><p><b>  VI英雄榜記錄更新</b></p><p>  當(dāng)有玩家把當(dāng)前等級(jí)的地雷全部掃出來后,并且時(shí)間比記錄中的時(shí)間短時(shí),在結(jié)束游戲時(shí),要求玩家把名字保存下來。游戲初始時(shí)時(shí)間為99

15、9秒。</p><p>  例如,當(dāng)?shù)谝粋€(gè)玩家把全部地雷掃出來的時(shí)間為120秒,這時(shí)玩家的記錄時(shí)間將被保存下來并作為記錄時(shí)間線。直到有玩家的時(shí)間少于120秒,才能更新當(dāng)前記錄時(shí)間線并保存玩家的名字。</p><p><b>  1.2總體設(shè)計(jì)</b></p><p>  在設(shè)計(jì)掃雷游戲時(shí),需要編寫8個(gè)Java源文件:MineGame.java、

16、MineArea.java、Block.java、BlockView.java、userDefine.java、LayMines.java、Record.java和ShowRecord.java.掃雷游戲除了需要編寫上述8個(gè)Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,例如File、JButton和JLabel等類。掃雷游戲所用到的一些重要的類以及之間的組合關(guān)系如圖1-1所示,系統(tǒng)功能圖如圖1-2所示。</p&

17、gt;<p>  1.2.1 MineGame.java(主類)</p><p>  MineGame類負(fù)責(zé)創(chuàng)建掃雷游戲主窗口,該文件含有main方法。掃雷游戲從該類開始執(zhí)行。</p><p>  1.2.2 MineArea.java</p><p>  MineArea類創(chuàng)建的對(duì)象是MineArea類最重要的成員之一,代表“掃雷區(qū)域”。</p

18、><p>  1.2.3 Block.java</p><p>  Block類是雷區(qū)中“方塊”的類封裝,含有關(guān)于“方塊”的屬性以及操作,即負(fù)責(zé)為雷區(qū)創(chuàng)建代表“方塊”的Block對(duì)象。</p><p>  1.2.4 BlockView.java</p><p>  BlockView是JPanel容器的子類,BlockView創(chuàng)建的對(duì)象負(fù)責(zé)為B

19、lock對(duì)象提供視圖,以方便用戶通過該視圖與Block對(duì)象交互。</p><p>  1.2.5 LayMines.java</p><p>  LayMine類對(duì)象不需要視圖,在游戲中不需要看見該類。LayMine對(duì)象使用隨機(jī)算法指定MineArea對(duì)象中的哪些Block對(duì)象是雷,哪些Block對(duì)象不是雷。</p><p>  1.2.6 Record.java&

20、lt;/p><p>  Record類是JDialog對(duì)話框的子類,對(duì)用戶掃雷成功時(shí),Record對(duì)象負(fù)責(zé)保存用戶的成績到文件。</p><p>  1.2.7 ShowRecord.java</p><p>  ShowRecord類是JDialog對(duì)話框的子類,當(dāng)用戶查看掃雷的最好成績時(shí),ShowRecord對(duì)象負(fù)責(zé)提供讀取文件數(shù)據(jù)的界面。</p>&

21、lt;p>  1.2.8 userDefine 類</p><p>  userDefine 類是JDialog對(duì)話框的子類,當(dāng)用戶想自定義掃雷難度時(shí),ShowRecord對(duì)象負(fù)責(zé)設(shè)置用戶想要的難度設(shè)置。</p><p><b>  2詳細(xì)設(shè)計(jì)</b></p><p>  2.1 MineGame類</p><p>

22、;  MineGame類是javax.swing包中JFrame的一個(gè)子類,并實(shí)現(xiàn)了ActionListener接口。標(biāo)明該類的只要成員變量和方法的UML圖如圖2-1所示。</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。</p><p><b>  成員變量</b></p><p>  bar和fileMenu提供菜單操作,單擊

23、游戲菜單項(xiàng)為“開始”、“初級(jí)”、“中級(jí)”、“高級(jí)”、“掃雷英雄榜”、“自定義”和“退出”。單擊幫助菜單項(xiàng)為“關(guān)于”。</p><p>  mineArea是掃雷區(qū)域,提供有關(guān)掃雷的主要功能。</p><p>  “英雄榜”負(fù)責(zé)存放三個(gè)級(jí)別的掃雷最好成績。</p><p>  showHeroRecord負(fù)責(zé)顯示英雄榜中的數(shù)據(jù)。</p><p>

24、;<b>  方法</b></p><p>  MineGame()是構(gòu)造方法,負(fù)責(zé)完成窗口的初始化。</p><p>  ActionPerformed(ActionEven)方法是MineGame類實(shí)現(xiàn)的ActionListener接口中的方法,該方法負(fù)責(zé)執(zhí)行菜單發(fā)出的有關(guān)命令。用戶選擇菜單中的菜單項(xiàng)可觸發(fā)ActionEvent事件,導(dǎo)致actionPerform

25、ed(ActionEvent)方法執(zhí)行相應(yīng)的操作,例如將mineArea創(chuàng)建的雷區(qū)設(shè)置為初級(jí)、中級(jí)、高級(jí)。</p><p>  main(String[])方法是程序運(yùn)行的入口方法。</p><p>  2.2 MineArea類</p><p>  MineArea類是javax.swing包中JPanel容器的子類,實(shí)現(xiàn)了ActionListener和Mouse

26、Listener接口,所創(chuàng)建的對(duì)象:mineArea是MineGame類中最重要的成員之一,作為一個(gè)容器添加到MineGame窗口的中心。標(biāo)明MineArea類的主要成員變量、方法以及和MineGame類之間組合關(guān)系的UML圖如圖2-2所示。</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。</p><p><b>  成員變量</b></p>

27、;<p>  a. Block是Block類型的數(shù)組,用來確定雷區(qū)有多少需進(jìn)行掃雷的方塊。</p><p>  b. blockView是Blockview類型的數(shù)組,負(fù)責(zé)為block數(shù)組中的Block對(duì)象提供視圖。</p><p>  c. Lay是LayMines類型的對(duì)象,負(fù)責(zé)設(shè)置block數(shù)組中的哪些方塊是雷或不是雷。</p><p>  d.

28、 Record負(fù)責(zé)提供保存成績的界面,是一個(gè)對(duì)話框,默認(rèn)不可見。用戶只有掃雷成功后(用時(shí)最少),才能看見該對(duì)話框。</p><p>  e. reStart是一個(gè)按鈕對(duì)象,用戶單擊它重新開始游戲。</p><p>  f. time是計(jì)時(shí)器對(duì)象,負(fù)責(zé)計(jì)算用戶的用時(shí)。</p><p><b>  2)方法</b></p><p

29、>  A. initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設(shè)置雷區(qū)的寬度,高度,雷的數(shù)目以及雷區(qū)的級(jí)別。</p><p>  B. actionPerformed(ActionEvent)是MIneArea類實(shí)現(xiàn)ActionListener接口中的方法。當(dāng)用戶單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法

30、,例如,當(dāng)用鼠標(biāo)左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪?,若該方塊下又雷,actionPerformed(ActionEvent)方法將顯示BlockView對(duì)象中的標(biāo)簽,該標(biāo)簽上是一個(gè)數(shù)字,該數(shù)字代表當(dāng)前方塊的周圍的8個(gè)方塊中總共有多少顆雷。</p><p>  C. show()方法是一個(gè)遞歸方法。actionPerformed(Ac

31、tionEvent)方法執(zhí)行時(shí)將調(diào)用show方法進(jìn)行掃雷。</p><p>  D. mousePress(MouseEvent)方法是MineArea類實(shí)現(xiàn)的MouseListener接口中的方法,當(dāng)用戶按下鼠標(biāo)右鍵時(shí),mousePress(MouseEvent)方法負(fù)責(zé)讓方塊上顯示一個(gè)探雷標(biāo)記。</p><p>  E. inquireWin()方法用來判斷用戶是否掃雷成功,如果成功該

32、方法負(fù)責(zé)讓record對(duì)話框可見。所謂掃雷成功是指不僅找到了全部的雷而且用時(shí)最少。</p><p>  2.3 Block類</p><p>  Block對(duì)象負(fù)責(zé)封裝雷區(qū)中方塊中的數(shù)據(jù)以及對(duì)這些數(shù)據(jù)的操作,外觀效果由Blockview負(fù)責(zé)提供(見后面的BlockView)。</p><p>  Block類創(chuàng)建的對(duì)象是數(shù)組block的單元的對(duì)象。Block型數(shù)組b

33、lock是MineArea類的重要成員之一。標(biāo)明Block類的主要成員變量和方法以及和MineArea類之間的組合關(guān)系的UML圖如下圖2-3所示。</p><p>  圖2-3 Block類的UML圖</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)的方法的詳細(xì)說明。</p><p><b>  1)成員變量</b></p><

34、p>  a. name是方塊上的名字。</p><p>  b. aroundMineNumber是方塊周圍雷的數(shù)目。</p><p>  c. mineIcon是方塊上雷的圖標(biāo)。</p><p>  d. sMine用來表示方塊是否是雷。</p><p>  e. isMark用來表示方塊是否被標(biāo)記。</p><p

35、>  f. isOpen用來表示方塊是否被挖開。</p><p><b>  2)方法</b></p><p>  A. setAroundMineNumber(int)方法用來設(shè)置aroundMineNumber的值。</p><p>  B. getAroundMineNumber()方法用來獲取aroundMineNumber的值。

36、</p><p>  2.4 BlockView類</p><p>  BlockView創(chuàng)建的對(duì)象負(fù)責(zé)為Block對(duì)象提供視圖,以便用戶通過該視圖與Block對(duì)象交互。BlockView對(duì)象使用一個(gè)標(biāo)簽和按鈕為Block對(duì)象提供視圖,標(biāo)簽和按鈕按著卡片布局層疊在一起,默認(rèn)狀態(tài)按鈕遮擋住標(biāo)簽。當(dāng)用戶單擊按鈕后,如果Block對(duì)象時(shí)雷,BlockView對(duì)象中的標(biāo)簽顯示的事雷的圖標(biāo);如果Bl

37、ock對(duì)象不是雷,標(biāo)簽顯示的是周圍雷的總數(shù)。</p><p>  BlockView類是javax。swing包中JPanel類的一個(gè)子類,創(chuàng)建的對(duì)象是數(shù)組blockView的單元中的對(duì)象。BlockView型數(shù)組BlockView是MineArea類的重要成員之一。標(biāo)明BlockView類的主要成員變量和方法以及和MineArea類之間的組合關(guān)系的UML圖如圖2-4所示。</p><p>

38、;  圖2-4 BlockView類的UML圖</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)的方法的詳細(xì)說明。</p><p><b>  1)成員變量</b></p><p>  a. blockNameOrIcon用來顯示Block對(duì)象的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對(duì)象提供視圖,如果Block對(duì)象的isMine屬性為true,即方塊是雷,那么blockNameOrIc

40、on標(biāo)簽上設(shè)置的文本就是Block對(duì)象的name屬性的值,同時(shí)blockNameOrIcon標(biāo)簽上設(shè)置的圖標(biāo)就是Block對(duì)象的mineIcon指定的圖標(biāo)。如果Block對(duì)象的isMine屬性為false,blockNameOrIcon標(biāo)簽上設(shè)置的圖標(biāo)就是Block對(duì)象的aroundMineNumber屬性的值,及周圍雷的數(shù)目</p><p>  B. seeblockNameOrIcon()方法讓用戶看見視圖中

41、的標(biāo)簽,無法看見按鈕。</p><p>  C. seeblockNameOrIcon(0方法讓用戶看見視圖中的按鈕,無法看見標(biāo)簽。</p><p>  2.5 LayMines類</p><p>  LayMines對(duì)象使用隨機(jī)算法制定MineArea對(duì)象中的哪些Block對(duì)象是雷,哪些對(duì)象不是雷,沒有可現(xiàn)實(shí)的效果圖。</p><p>  

42、LayMines創(chuàng)建的對(duì)象Lay是MineArea中的重要成員,表明該類的主要成員變量和方法以及和MineArea類之間組合關(guān)系的UML圖如圖2-5所示。</p><p>  圖2-5 LayMines類的UML圖</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)的方法的詳細(xì)說明。</p><p><b>  1)成員變量</b></p&g

43、t;<p>  mineIcon用來存放一個(gè)格式為gif的圖像。</p><p><b>  2)方法</b></p><p>  layMinesForBlock(Block[][],in)方法對(duì)參數(shù)指定的Block數(shù)組進(jìn)行設(shè)置,其中int參數(shù)指定雷的數(shù)目,當(dāng)指定Block數(shù)組中每個(gè)單元中的方塊是雷時(shí),就將該房快上的圖標(biāo)設(shè)置為mineIcon,當(dāng)指定B

44、lock數(shù)組中每個(gè)單元中的方塊不是雷時(shí),就將該方塊的名字設(shè)置為周圍的雷的數(shù)目。</p><p>  2.6 Record類</p><p>  Record創(chuàng)建的對(duì)象負(fù)責(zé)提供保存成績的界面。</p><p>  Record是javax。swing包中jDialog對(duì)話框的子類,并實(shí)現(xiàn)了ActionListener接口。Record創(chuàng)建的對(duì)象:record是Mine

45、Area類的成員之一,當(dāng)用戶掃雷成功時(shí),該對(duì)象提供了保存成績到文件的界面。標(biāo)明Record類的主要成員變量,方法以及和MineArea類之間組合關(guān)系的UML圖如圖2-6所示。</p><p>  圖2-6 Record類的UML圖</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)的方法的詳細(xì)說明。</p><p><b>  1)成員變量</b>

46、</p><p>  ·textName提供用戶掃雷優(yōu)勝者輸入姓名</p><p>  ·用戶單擊”確定“按鈕,可以保存成績</p><p><b>  2)方法</b></p><p>  ·actionPerformed(ActionEvent)方法是Record類實(shí)現(xiàn)的ActionLi

47、stener接口中的方法,當(dāng)用戶單擊”確定“按鈕后,該方法被執(zhí)行,所執(zhí)行的操作就是獲取用戶輸入的名字和用時(shí)然后調(diào)用writeRecord(String,String)方法將信息寫入”英雄榜“中。</p><p>  ·writeRecord(String,String)方法負(fù)責(zé)將有關(guān)信息掃雷用時(shí),掃雷級(jí)別,掃雷優(yōu)勝者姓名等心思寫入到”英雄榜“文件。</p><p>  2.7 S

48、howRecord類</p><p>  ShowRecord創(chuàng)建的對(duì)象負(fù)責(zé)提供顯示成績的界面。</p><p>  ShowRecord是javax。swing包中JDialog對(duì)話框的子類,并實(shí)現(xiàn)了ActionListener接口。ShowReacord創(chuàng)建的對(duì)象showHeroRecord是MineGame類的成員之一,當(dāng)用戶選擇查看"英雄榜“菜單項(xiàng)時(shí),該對(duì)話框可見,提供了

49、查看掃雷的最好成績的界面。標(biāo)明ShowRecord類的主要成員變量,方法以及和MineGame類之間組合關(guān)系的UML圖如圖2-7所示。</p><p>  圖2-7 ShowRecord類的UML圖</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)的方法的詳細(xì)說明。</p><p><b>  成員變量</b></p><p&

50、gt;  ·File存放文件的引用</p><p>  ·用戶單擊”顯示成績“按鈕,可以查看各個(gè)級(jí)別掃雷的最好成績。</p><p>  ·用戶單擊”重新計(jì)分“按鈕,可以將”英雄榜“中的成績恢復(fù)為初始值。</p><p><b>  2)方法</b></p><p>  ·acti

51、onPerformed(ActionEvent)方法是ShowRecord類實(shí)現(xiàn)的ActionListener接口中的方法,當(dāng)用戶單擊”顯示成績“按鈕后,該方法被執(zhí)行,所執(zhí)行的操作就是調(diào)用readAndShow()方法。</p><p>  ·readAndShow()方法負(fù)責(zé)讀取存放在文件中的各個(gè)級(jí)別的掃雷最好成績以及掃雷者姓名,并顯示這些相關(guān)信息。</p><p>  2.8

52、 userDefine 類</p><p>  userDefine是java.awt包中Rame框架的子類,并實(shí)現(xiàn)了ActionListener接口。userDefine創(chuàng)建的對(duì)像:usedefine是MineArea類的成員之一,當(dāng)用戶點(diǎn)擊菜單欄中的游戲->自定義時(shí),彈出界面,在界面的文本框中輸入相應(yīng)的數(shù)字。然后單擊確定即可,或者單擊取消退出界面。標(biāo)明userDefine類的主要成員變量、方法以及和Mi

53、neArea類之間的組合關(guān)系的UML圖如圖2-8所示。</p><p>  以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。</p><p><b>  1)成員變量</b></p><p>  a. row,colum,mineCount,score:分別用來顯示行數(shù),列數(shù),雷數(shù),分?jǐn)?shù)</p><p>  b. row1,c

54、olum1, mineCount1,score1:用來自定義雷區(qū)的長度值,寬度值,所有的雷數(shù)值以及每贏一局所得的分?jǐn)?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)容合法,就會(huì)實(shí)現(xiàn)自定義的雷區(qū),如果不合法的話,就會(huì)彈出一個(gè)警告框,提示輸入有誤;單擊“取消”退出自定義窗口。</p><p><b>  2)方法</b></p><p>  actionPerformrd(ActonEvent)方法是userDefine類中實(shí)現(xiàn)的ActionListener接口中的方法,當(dāng)用戶單擊界面的“確定”,該方法被執(zhí)行,所執(zhí)行的操

56、作就是,將用戶輸入的信息傳入程序,實(shí)驗(yàn)自定義雷區(qū)的難度級(jí)別。當(dāng)用戶單擊界面的“取消”,該方法被執(zhí)行,所執(zhí)行的操作就是,退出用戶自定義界面。</p><p><b>  3編碼實(shí)現(xiàn)</b></p><p>  各個(gè)類的的主要源代碼實(shí)現(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;//包含圖標(biāo)</p><p>  public class MineGame extends JFrame implements ActionListener{</p><p>  JMenuBar menubar; //負(fù)責(zé)創(chuàng)建菜單條</p><p>  JMenuItem 開始,初級(jí),中級(jí),高級(jí),掃雷英

60、雄榜,自定義,退出,關(guān)于;//負(fù)責(zé)創(chuàng)建菜單項(xiàng)</p><p>  JMenu fileMenu,helpMenu;//負(fù)責(zé)創(chuàng)建菜單</p><p>  ImageIcon app;//負(fù)責(zé)創(chuàng)建標(biāo)題欄的圖標(biāo)</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");//給標(biāo)題欄創(chuàng)建圖標(biāo)</p><p>  setIconImage(app.getImage());//獲取圖標(biāo)并調(diào)用類實(shí)現(xiàn)</p><p>  setTitle("掃雷"); //加入標(biāo)題字段 &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)建菜單項(xiàng)</p><p>  開始.setAccelerator(KeyStroke.getKey

66、Stroke(KeyEvent.VK_F2,0));//添加快捷方式</p><p>  初級(jí)=new JMenuItem("初級(jí)");</p><p>  中級(jí)=new JMenuItem("中級(jí)");</p><p>  高級(jí)=new JMenuItem("高級(jí)");</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>  關(guān)于 = new JMenuItem("關(guān)于");</p><p>  關(guān)于.setAccelerato

69、r(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0)); </p><p>  fileMenu.add(開始); //加入菜單的容器 </p><p>  fileMenu.addSeparator();//加入分隔符</p><p>  fileMenu.add(初級(jí));</p><

70、;p>  fileMenu.add(中級(jí));</p><p>  fileMenu.add(高級(jí));</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(關(guān)于); </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、  初級(jí).addActionListener(this);</p><p>  中級(jí).addActionListener(this);</p><p>  高級(jí).addActionListener(this);</p><p>  掃雷英雄榜.addActionListener(this);</p><p>  自定義.addActionLi

74、stener(this);</p><p>  退出.addActionListener(this);</p><p>  關(guān)于.addActionListener(this);</p><p><b>  //設(shè)置英雄榜</b></p><p>  hashtable=new Hashtable();</p>

75、;<p>  hashtable.put("初級(jí)","初級(jí)#"+999+"#匿名"); </p><p>  hashtable.put("中級(jí)","中級(jí)#"+999+"#匿名");</p><p>  hashtable.put("高級(jí)"

76、;,"高級(jí)#"+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、設(shè)為可見</p><p>  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//結(jié)束窗體所在的應(yīng)用程序</p><p>  validate(); }</p><p>  //負(fù)責(zé)執(zhí)行菜單發(fā)出的有關(guān)命令</p><p>  public void actionPerformed(Acti

80、onEvent e){</p><p>  if(e.getSource()==開始){</p><p>  mineArea.initMineArea(8,8,10,1);//默認(rèn)為初級(jí) }</p><p>  if(e.getSource()==初級(jí)){</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()==中級(jí)){</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()==高級(jí)){</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()==關(guān)于){</p><p>

86、;  JDialog dialog=new JDialog();</p><p>  dialog.setTitle("關(guān)于幫助"); </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ū)、地雷計(jì)數(shù)器和計(jì)時(shí)器.");</p><p>  final JLabel l3 = new JLabel("2,通過單擊即可挖開方塊,如果挖開的是地雷,則您輸?shù)粲螒?");</p><p>  final JLabel

90、 l4 = new JLabel("3,如果方塊上出現(xiàn)數(shù)字,表示在其周圍的八個(gè)方塊中共有多少顆地雷"); </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"); //探雷標(biāo)記</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>  //當(dāng)用戶單擊BlockView

109、中的某個(gè)方塊時(shí),執(zhí)行有關(guān)算法</p><p>  public void actionPerformed(ActionEvent e) {</p><p>  //點(diǎn)擊Block方塊區(qū)域 </p><p>  if(e.getSource()!=reStart&&e.getSource()!=time) {</p><p>

110、;  time.start(); //開始計(jì)時(shí)</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>  //鼠標(biāo)左鍵單擊方塊上的按鈕,</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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論