基于java的掃雷游戲設(shè)計(jì)與實(shí)現(xiàn)_第1頁
已閱讀1頁,還剩127頁未讀 繼續(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>  JAVA程序設(shè)計(jì)A課程設(shè)計(jì)</p><p>  題 目 基于JAVA的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn) </p><p>  院 (系) 信息工程學(xué)院 </p><p>  專 業(yè) 班 級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)(2)班

2、 </p><p>  學(xué) 生 姓 名 </p><p>  學(xué) 號(hào) </p><p>  設(shè) 計(jì) 地 點(diǎn) 教(13)軟件實(shí)驗(yàn)室 </p><p>  指 導(dǎo) 教 師

3、 </p><p>  起止時(shí)間: 2014年 6月9日至2014年 6月13日</p><p>  《Java程序設(shè)計(jì)A》課程設(shè)計(jì)任務(wù)分工及成績(jī)</p><p>  院(系):信息工程學(xué)院 教研室:軟件教研室</p><p>  基于JAVA的掃雷游戲的設(shè)計(jì)與實(shí)

4、現(xiàn)</p><p><b>  摘 要</b></p><p>  隨著時(shí)代的發(fā)展,電腦進(jìn)入了普通老百姓的生活,越來越多的人使用電腦 辦公、娛樂、上網(wǎng),游戲行業(yè)發(fā)展一日千里,該行業(yè)極大的影響和改變了人們的 生活和娛樂方式, 游戲?yàn)橄M(fèi)者提供豐富多彩的虛擬空間,使消費(fèi)者可以自由自 在的享受虛擬世界的樂趣,實(shí)現(xiàn)自己在現(xiàn)實(shí)生活著那個(gè)可能永遠(yuǎn)不能實(shí)現(xiàn)的夢(mèng) 想,滿足了消費(fèi)者

5、的心理和精神需求。 </p><p>  掃雷游戲是 Windows 操作系統(tǒng)自帶的一款小游戲,本系統(tǒng)要是模仿 WINDOWS 系統(tǒng)的掃雷,對(duì)于實(shí)現(xiàn)過程中出現(xiàn)的 bug 進(jìn)行調(diào)試解決。我這里用的是 C#編寫 了與它功能相似的掃雷游戲。 </p><p>  程序的功能是隨機(jī)生成地雷數(shù),通過鼠標(biāo)操作玩游戲,不接受鍵盤,按任意 鍵結(jié)束程序。 單擊屏幕上的笑臉可以重新開始游戲。當(dāng)鼠標(biāo)左鍵單擊到地

6、雷時(shí)提 示游戲失敗。 報(bào)告首先介紹了進(jìn)行該游戲課程設(shè)計(jì)的目的,然后是任務(wù)描述和設(shè) 計(jì)的相關(guān)要求, 最后是最重要的需求分析和設(shè)計(jì)方案。重點(diǎn)介紹了在游戲過程中 各事件的處理,其中又以鼠標(biāo)事件和清除未靠近地雷區(qū)方塊這兩方面最為最要, 鼠標(biāo)事件是利用鼠標(biāo)所發(fā)出的信息了解用戶的意圖,進(jìn)而做出相對(duì)應(yīng)的動(dòng)作。清 除未靠近地雷區(qū)的方塊較為復(fù)雜。</p><p>  關(guān)鍵詞:掃雷游戲,算法設(shè)計(jì),事件,JAVA</p>

7、<p><b>  目 錄</b></p><p><b>  1 概 述1</b></p><p>  1.1選題的目的及意義1</p><p>  1.2程序設(shè)計(jì)任務(wù)與要求1</p><p><b>  2需求分析2</b></p>

8、<p>  2.1 掃雷游戲的需求分析2</p><p>  2.2 掃雷游戲的基本功能操作2</p><p>  2.3 功能要求2</p><p><b>  3 詳細(xì)設(shè)計(jì)4</b></p><p>  3.1 系統(tǒng)總體設(shè)計(jì)4</p><p>  3.1.1 算法思想4

9、</p><p>  3.1.2 設(shè)計(jì)思想4</p><p>  3.1.3 功能分析5</p><p>  3.2系統(tǒng)詳細(xì)設(shè)計(jì)5</p><p>  3.2.1類的設(shè)計(jì)5</p><p>  3.2.2 模塊的劃分及調(diào)用關(guān)系6</p><p>  4系統(tǒng)測(cè)試與實(shí)現(xiàn)7</p&g

10、t;<p>  4.1 程序測(cè)試結(jié)果7</p><p>  4.1.1 游戲玩家通過右擊鼠標(biāo)來進(jìn)行掃雷,并顯示“雷”7</p><p>  4.1.2 游戲玩家因觸到雷而導(dǎo)致游戲結(jié)束8</p><p>  4.1.3 游戲玩家掃雷成功8</p><p>  4.1.4 游戲玩家可選擇游戲難度9</p>&

11、lt;p><b>  總 結(jié)10</b></p><p><b>  參考文獻(xiàn)11</b></p><p><b>  附 錄12</b></p><p><b>  1概 述</b></p><p>  1.1選題的目的及意義&l

12、t;/p><p>  本次課程設(shè)計(jì)的主要目的是為了通過具體的程序來加深對(duì)Java語言的掌握,提高自己的編程水平。選擇的題目來自《Java課程設(shè)計(jì)(第二版)》中的掃雷游戲,這是一個(gè)綜合性的題目,可以對(duì)Java中的各項(xiàng)功能有更好的理解和使用,同時(shí)也為以后的工作打下一定的基礎(chǔ)。</p><p>  1.2程序設(shè)計(jì)任務(wù)與要求</p><p>  掃雷游戲是一個(gè)很有趣的游戲。本章

13、的課程設(shè)計(jì)使用Java語言編寫一個(gè)與其類似的掃雷游戲。具體要求如下:</p><p>  (1) 掃雷游戲分為初級(jí)、中級(jí)和高級(jí)三個(gè)級(jí)別。單擊游戲菜單可以選擇“初級(jí)”、“中級(jí)”和“高級(jí)”。</p><p>  (2) 選擇級(jí)別后將出現(xiàn)相應(yīng)級(jí)別的掃雷區(qū)域,這是用戶使用鼠標(biāo)左鍵單擊雷區(qū)中任何一個(gè)方塊便啟動(dòng)計(jì)時(shí)器。</p><p>  (3) 用戶要揭開某個(gè)方塊,可單擊它。

14、若所揭方塊下有淚,用戶便輸了這一局,若所揭方塊下五雷,則顯示一個(gè)數(shù)字,該數(shù)字代表方塊的周圍的8個(gè)方塊中共有多少顆雷。</p><p>  (4) 如果用戶認(rèn)為某個(gè)方塊下埋著雷,單擊右鍵可以在方塊上標(biāo)識(shí)一個(gè)用戶認(rèn)為是雷的圖標(biāo),即給出一個(gè)掃雷標(biāo)記‘雷’。用戶每標(biāo)記出一個(gè)掃雷標(biāo)記(無論用戶的標(biāo)記是否正確),程序?qū)@示的剩余雷數(shù)減少一個(gè)。</p><p>  (5) 掃雷勝利后,游戲中的標(biāo)簽會(huì)顯示

15、“你贏了!”</p><p>  (6)如果在掃雷過程中一不小心碰到了雷,游戲會(huì)顯示“你輸了,這個(gè)游戲不適合你!”。</p><p><b>  2需求分析</b></p><p>  2.1 掃雷游戲的需求分析</p><p>  隨著社會(huì)的不斷進(jìn)步,人們的壓力也不斷的提高,在游戲?qū)映霾桓F的時(shí)刻,掃雷游戲任然受到不少人

16、的青睞,,其本身的性質(zhì),決定了人們對(duì)它的喜愛的程度,不需要特殊的技巧,不需要不斷的升級(jí),還不需要太多的時(shí)間進(jìn)行熟悉,簡(jiǎn)簡(jiǎn)單單卻趣味無窮。</p><p>  2.2 掃雷游戲的基本功能操作</p><p>  本程序需實(shí)現(xiàn)的主要功能有:</p><p>  (1)用戶可以自定義級(jí)別,并確定雷的個(gè)數(shù)。</p><p>  (2)具有計(jì)時(shí)功能

17、,即顯示用戶完成掃雷所花費(fèi)的時(shí)間。</p><p>  (3)點(diǎn)擊開始進(jìn)行掃雷。</p><p>  (4)用戶識(shí)別雷右擊可標(biāo)記“雷”。</p><p><b>  2.3 功能要求</b></p><p>  (1)程序的總體功能如圖2.1所示。</p><p>  圖2.1 總體功能圖<

18、;/p><p>  (2)程序總體流程如圖2.2所示。</p><p>  圖2.2 總體流程圖</p><p><b>  3 詳細(xì)設(shè)計(jì)</b></p><p>  3.1 系統(tǒng)總體設(shè)計(jì)</p><p>  3.1.1 算法思想</p><p>  (1)計(jì)算按鈕周圍雷數(shù)。&

19、lt;/p><p>  (2)隨機(jī)分布。掃雷游戲要求在M行N列的網(wǎng)格游戲區(qū)隨即的不上bon個(gè)雷,且bon的取值應(yīng)小于M和N的乘積。這可以在一張M*N的網(wǎng)格上通過均勻分布的隨即算法視線。其中bon的網(wǎng)格是雷區(qū),剩下的網(wǎng)格是非雷區(qū)。游戲的目標(biāo)是盡可能快地找到所有的雷區(qū),而不踩到地雷。Java提供了視線隨即算法的類Math,通過Math類的random()方法這可以很方便的實(shí)現(xiàn)隨即布雷的功能。</p><

20、;p>  3.1.2 設(shè)計(jì)思想</p><p> ?。?)掃雷棋盤的布局設(shè)計(jì)</p><p>  系統(tǒng)的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板…等組件,菜單主要包括開始,選擇級(jí)別,標(biāo)記, 按鈕的功能是重新開始新的游戲。</p><p><b>  (2)雷區(qū)的設(shè)計(jì)</b></p><p> 

21、 ScanLei1類是繼承了JFrame實(shí)現(xiàn)了ActionListener接口,該類里聲明了組鍵,并進(jìn)行布局,go方法通過設(shè)置是否顯示窗體,主方法main()實(shí)例化窗體對(duì)象,out()方法是ScanLei1類中的重要方法之一,也就是掃雷的算法。</p><p>  actionPerformed(ActionEvent e)就是單擊按鈕觸發(fā)的事件,如果是初級(jí)按鈕觸發(fā),分配初級(jí)雷區(qū)按鈕布局。如果是中級(jí)按鈕觸發(fā),分配

22、中級(jí)雷區(qū)按鈕布局。如果是高級(jí)按鈕觸發(fā),分配高級(jí)雷區(qū)按扭布局。如果是開始按鈕觸發(fā),開始計(jì)數(shù),并隨機(jī)分配雷,并計(jì)算沒有雷的按鈕周圍有雷的數(shù)目。如果按鈕按鍵觸發(fā),調(diào)用ScanLei1類中的out()方法進(jìn)行掃雷。</p><p>  NormoreMouseEvent()繼承了鼠標(biāo)適配器,當(dāng)右擊按鈕后,根據(jù)該按鈕上的圖標(biāo)來判斷該按鈕是否被右擊過,如果有圖標(biāo),將圖標(biāo)刪除,并雷的個(gè)數(shù)加一。如果該按鈕沒有被右擊過,在該按鈕中

23、添加圖標(biāo),并將雷的個(gè)數(shù)減一。</p><p>  雷區(qū)設(shè)計(jì)流程圖如圖3.3所示。</p><p>  圖3.3 雷區(qū)設(shè)計(jì)流程圖</p><p>  3.1.3 功能分析</p><p>  用戶可以玩掃雷游戲并能自定義級(jí)別(初等,中等,高等);具有計(jì)時(shí)功能,即顯示用戶完成掃雷任務(wù)所花費(fèi)的時(shí)間。</p><p><

24、b>  3.2系統(tǒng)詳細(xì)設(shè)計(jì)</b></p><p><b>  3.2.1類的設(shè)計(jì)</b></p><p>  (1)initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設(shè)置雷區(qū)的寬度、高度以及雷區(qū)的級(jí)別。</p><p>  (2)actionPerformed(ActionEvent)是Min

25、eArea類實(shí)現(xiàn)的ActionListener接口中的方法。當(dāng)用戶單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法,例如,當(dāng)用鼠標(biāo)左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪?,若該方塊下無雷,actionPerformed(ActionEvent)方法將顯示blockView對(duì)象中的標(biāo)簽,該標(biāo)簽上是一

26、個(gè)數(shù)字,該數(shù)字代表當(dāng)前方塊的周圍的8個(gè)方塊中共有多少顆雷。</p><p>  (3)show()方法是一個(gè)遞歸方法。actionPerformed(ActionEvent)方法執(zhí)行時(shí)將調(diào)用show方法進(jìn)行掃雷。</p><p>  (4)mousePressed(MouseEvent)方法是MineArea類實(shí)現(xiàn)的MouseListener接口中的方法,當(dāng)用戶按下鼠標(biāo)有件事mousePr

27、essed(MouseEvent)方法負(fù)責(zé)讓方塊上顯示一個(gè)探雷標(biāo)記。</p><p>  (5)inquireWin()方法用來判斷用戶是否掃雷成功,如果成功該方法負(fù)責(zé)讓record對(duì)話框可見。所謂掃雷成功是指不僅找到了全部的累而且用時(shí)最少。</p><p>  3.2.2 模塊的劃分及調(diào)用關(guān)系</p><p><b>  圖3.4 關(guān)系圖</b&g

28、t;</p><p><b>  4系統(tǒng)測(cè)試與實(shí)現(xiàn)</b></p><p>  4.1 程序測(cè)試結(jié)果</p><p>  4.1.1 游戲玩家通過右擊鼠標(biāo)來進(jìn)行掃雷,并顯示“雷”</p><p><b>  圖4.1掃雷圖</b></p><p>  4.1.2 游戲玩家因觸

29、到雷而導(dǎo)致游戲結(jié)束</p><p>  圖4.2 掃雷失敗圖</p><p>  4.1.3 游戲玩家掃雷成功</p><p><b>  圖4.3掃雷成功圖</b></p><p>  4.1.4 游戲玩家可選擇游戲難度</p><p><b>  圖4.4游戲幫助圖</b>

30、;</p><p><b>  總 結(jié)</b></p><p>  這個(gè)掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過程中也遇到很多問題,有些問題比較簡(jiǎn)單但就不知道錯(cuò)在哪里,有些大問題之道在哪就是不知道怎么辦才好,后來經(jīng)過自己的不斷調(diào)試,這個(gè)掃雷游戲終于大功告成。</p><p>  經(jīng)過編寫這個(gè)掃雷游戲,我認(rèn)識(shí)到應(yīng)

31、該注意細(xì)節(jié)問題,雖然是很小的問題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴(yán)謹(jǐn)性,同時(shí)還可以為以后的編程積累經(jīng)驗(yàn)。編寫完這個(gè)掃雷游戲,我發(fā)現(xiàn)自己有很多的不足,我想如果讓我來單獨(dú)來編寫這個(gè)游戲,我感覺能編出來的可能性很小,因?yàn)檫@個(gè)游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實(shí)實(shí)的打基礎(chǔ)!并且我感覺到只要我們自己肯下功夫?qū)W習(xí),我們也可以做出很好的東西,不需要每次都抄襲別人的,只有自己的才是最珍貴的!</p>&l

32、t;p><b>  參考文獻(xiàn)</b></p><p>  [1] 耿祥義.Java大學(xué)實(shí)用教程.北京:清華大學(xué)出版社,2009.</p><p>  [2] 耿祥義.Java課程設(shè)計(jì).北京:清華大學(xué)出版社,2008.</p><p>  [3] 王鵬.Java Swing圖形界面開發(fā)與案例詳解.北京:清華大學(xué)出版社,2008.</p

33、><p>  [4] 丁振凡.Java語言實(shí)驗(yàn)教程.北京:北京郵電大學(xué)出版社,2005.</p><p>  [5] 鄭莉.Java語言程序設(shè)計(jì).北京:清華大學(xué)出版社,2006.</p><p>  [6].孫全黨 王吳迪 趙楓朝,Java程序設(shè)計(jì)應(yīng)用教程,電子工業(yè)出版社,2006.2 </p><p>  [7].雷之宇,Java項(xiàng)目開發(fā)實(shí)踐—

34、網(wǎng)絡(luò)篇,中國(guó)鐵道出版社,2005.5 </p><p>  [8].趙玉陽,Java從入門到精通,清華大學(xué)出版社,2006.8 </p><p>  [9].李蘢怡,Java編程實(shí)例講解,高等教育出版社,2005.11 </p><p>  [10].張利國(guó),Java實(shí)用教程案例,北京:清華大學(xué)出版社,2003.10 </p><p><

35、;b>  附 錄</b></p><p>  import java.awt.BorderLayout; //導(dǎo)入邊框布局</p><p>  import java.awt.Container; //導(dǎo)入一個(gè)容器,也是一個(gè)組件,在這個(gè)容器里你可以添加其他awt的組件</p><p>  import java.awt.Font;

36、 //導(dǎo)入字形,字體</p><p>  import java.awt.GridLayout; //導(dǎo)入網(wǎng)格式布局</p><p>  import java.awt.Insets; // Insets 對(duì)象描述容器的邊界區(qū)域。它指定一個(gè)容器在它的各個(gè)邊界上應(yīng)留出的空白區(qū)間。這個(gè)空白可以是一個(gè)邊界,一個(gè)不顯示區(qū)域或一個(gè)標(biāo)題。</p><p>  im

37、port java.awt.event.ActionEvent; // ActionEvent是一個(gè)類,指示發(fā)生了組件定義的動(dòng)作的語義事件。 </p><p>  import java.awt.event.ActionListener; // ActionListener用于接收操作事件的偵聽器接口。繼承自EventListener。</p><p>  import java

38、.awt.event.MouseAdapter; //導(dǎo)入鼠標(biāo)監(jiān)聽適配器,負(fù)責(zé)對(duì)鼠標(biāo)事件進(jìn)行監(jiān)聽</p><p>  import java.awt.event.MouseEvent; //接口</p><p>  import javax.swing.JButton;//導(dǎo)入按鈕類</p><p>  import javax.swing.JFrame;//導(dǎo)

39、入面板類</p><p>  import javax.swing.JLabel;//導(dǎo)入標(biāo)簽類</p><p>  import javax.swing.JMenu; //菜單</p><p>  import javax.swing.JMenuBar; //用來創(chuàng)建水平菜單欄</p><p>  import javax.swing.

40、JMenuItem; //創(chuàng)建帶有設(shè)置文本或圖標(biāo)的 JMenuItem 菜單項(xiàng)</p><p>  import javax.swing.JPanel; //面板</p><p>  import javax.swing.Timer; // 定時(shí)器,功能是在指定的時(shí)間間隔內(nèi)反復(fù)觸發(fā)指定窗口的定時(shí)器事件。 </p><p>  public class Scan

41、Lei1 extends JFrame implements ActionListener{</p><p>  //掃雷類繼承了JFrame實(shí)現(xiàn)了ActionListener接口</p><p>  private static final long serialVersionUID = 1L; // serialVersionUID 用來表明類的不同版本間的兼容性</p&

42、gt;<p>  private Container contentPane; //內(nèi)容面板,每一個(gè)JFrame對(duì)應(yīng)一個(gè)內(nèi)容面板,所有的組件應(yīng)該置于內(nèi)容面板之上</p><p>  private JButton btn; //聲明一個(gè)按鈕對(duì)象,開始按鈕,對(duì)象名為btn,private的意思是把變量或方法聲明成私有的,只有在本類中或本類實(shí)例可以訪問,其他類不可以</p>&

43、lt;p>  private JButton[] btns;//聲明一個(gè)按鈕數(shù)組 雷區(qū)的每一個(gè)雷都是一個(gè)按鈕,所有按鈕放置到該數(shù)組中</p><p>  private JLabel b1;//聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置剩余的雷的個(gè)數(shù)</p><p>  private JLabel b2; //聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置已經(jīng)游戲的時(shí)間</p><p&

44、gt;  private JLabel b3; //聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置游戲的結(jié)果</p><p>  private Timer timer;//聲明一個(gè)定時(shí)器對(duì)象</p><p>  private int row=9; //行,用于指定雷區(qū)的行</p><p>  private int col=9; //列 用于指定雷區(qū)的列</p>

45、;<p>  private int bon=10; //布雷的個(gè)數(shù)</p><p>  private int[][] a;//聲明一個(gè)int型的二維數(shù)組,二維數(shù)組的中元素,有以下含義,值為0說明該元素所對(duì)應(yīng)的坐標(biāo)所在的按鈕既不是雷又不是周圍有雷的按鈕,如果是100,則說明</p><p>  private int b;//聲明int型的變量b 剩余雷的個(gè)數(shù)</p

46、><p>  private int[] a1;//聲明int型數(shù)組a1,放置隨機(jī)數(shù),用于確定雷應(yīng)該布到雷區(qū)的位置</p><p>  private JPanel p,p1,p2,p3;//聲明面板</p><p>  public ScanLei1(String title){</p><p>  //定義掃雷的構(gòu)造方法,該構(gòu)造方法有個(gè)Str

47、ing類型的參數(shù),參數(shù)名為title</p><p>  super(title);//調(diào)用JFrame的構(gòu)造方法,將title字符串傳入該構(gòu)造方法,這樣的話窗體顯示時(shí),標(biāo)題欄會(huì)顯示傳入的title值</p><p>  contentPane=getContentPane();//獲取當(dāng)前JFrame對(duì)象的內(nèi)容面板,注意因?yàn)镾canLei1類繼承了JFrame對(duì)象,所以ScanLei1的

48、對(duì)象也是JFrame對(duì)象</p><p>  setSize(300,400);//設(shè)置掃雷窗體的大小事300*400像素</p><p>  this.setBounds(400, 100, 400, 500); // setBounds(x,y,width,height); x:組件在容器X軸上的起點(diǎn) y:組件在容器Y軸上的起點(diǎn) width:組件的長(zhǎng)度 height:組件的高度<

49、;/p><p>  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設(shè)置當(dāng)點(diǎn)擊窗體右上角的X按鈕時(shí)的窗體的行為,這里設(shè)置的是當(dāng)點(diǎn)擊這個(gè)按鈕時(shí)關(guān)閉并退出程序,沒有設(shè)置的話,</p><p>  timer =new Timer(1000,(ActionListener) this);//每隔1000毫秒觸發(fā)一次動(dòng)作事件的監(jiān)聽</p>

50、;<p>  a = new int[row+2][col+2];//創(chuàng)建數(shù)組a,a是一個(gè)二維數(shù)組,數(shù)組時(shí)11列,11行</p><p>  initGUI();//調(diào)用初始化圖形界面方法</p><p><b>  }</b></p><p>  public void initGUI(){//聲明初始化圖形界面方法</

51、p><p>  p3=new JPanel();//創(chuàng)建一個(gè)面板</p><p>  b=bon;//將bon的值賦值給變量b</p><p>  JMenuBar menuBar=new JMenuBar();//創(chuàng)建一個(gè)菜單欄對(duì)象</p><p>  JMenu menu1=new JMenu("游戲");//創(chuàng)建游戲菜單

52、</p><p>  JMenu menu2=new JMenu("幫助");//創(chuàng)建幫助菜單</p><p>  JMenuItem mi1=new JMenuItem("初級(jí)");//創(chuàng)建初級(jí)菜單項(xiàng)</p><p>  JMenuItem mi2 = new JMenuItem("中級(jí)");//創(chuàng)建中級(jí)

53、菜單項(xiàng)</p><p>  JMenuItem mi3 =new JMenuItem("高級(jí)");//創(chuàng)建高級(jí)菜單項(xiàng)</p><p>  mi1.addActionListener(this);//為初級(jí)菜單項(xiàng)加入動(dòng)作事件監(jiān)聽器,當(dāng)你單擊鼠標(biāo)左鍵點(diǎn)初級(jí)菜單項(xiàng)時(shí)會(huì)執(zhí)行actionPerformed(ActionEvent e)方法</p><p>

54、  menu1.add(mi1); </p><p>  mi2.addActionListener(this);</p><p>  menu1.add(mi2);</p><p>  mi3.addActionListener(this);</p><p>  menu1.add(mi3);//以上幾個(gè)操作類似</p>&l

55、t;p>  menuBar.add(menu1);//將游戲菜單加入到菜單欄</p><p>  menuBar.add(menu2);//將幫助菜單加入到菜單欄</p><p>  p3.add(menuBar); //將菜單欄加入到p3面板上去</p><p>  b1=new JLabel(bon+"");//創(chuàng)建一個(gè)標(biāo)簽,標(biāo)簽的內(nèi)

56、容是bon的值10</p><p>  a1=new int[bon];//創(chuàng)建a1數(shù)組,數(shù)組的長(zhǎng)度為10</p><p>  btn =new JButton("開始");//創(chuàng)建開始按鈕</p><p>  btn.addActionListener(this);//為開始按鈕加入動(dòng)作事件監(jiān)聽器</p><p>  b

57、2=new JLabel("0");//創(chuàng)建標(biāo)簽b2,b2的內(nèi)容是0</p><p>  b3=new JLabel("");//創(chuàng)建標(biāo)簽b3,b3暫時(shí)內(nèi)容為空</p><p>  btns=new JButton[row*col];//創(chuàng)建一個(gè)按鈕數(shù)組,數(shù)組的個(gè)數(shù)為row*col,這個(gè)程序中就是9*9個(gè),每一個(gè)雷的位置就是一個(gè)按鈕</p>

58、;<p>  p=new JPanel();//創(chuàng)建一個(gè)面板</p><p>  p.setLayout(new BorderLayout()); //設(shè)置容器的邊框布局,邊框布局的樣式大致是這樣</p><p>  contentPane.add(p); // 將panl放置到內(nèi)容面板上去,為什么將一個(gè)面板放到內(nèi)容面板,而不是將組件放到內(nèi)容面板上去呢,你可以看到pa

59、nl上最多可以直接放置五個(gè)</p><p>  p.add(p3,BorderLayout.NORTH);//p3添加到面板的北邊,也就是在北邊放上了菜單欄,結(jié)果就如圖了</p><p>  //combo=new JComboBox(new Object[]{"初級(jí)","中級(jí)","高級(jí)"} );</p><p

60、><b>  //加監(jiān)聽</b></p><p>  /*combo.addItemListener(new ItemListener(){</p><p><b>  }});*/</b></p><p>  p1=new JPanel();//創(chuàng)建一個(gè)面板</p><p><

61、b>  //在那個(gè)位置</b></p><p>  //((FlowLayout)p1.getLayout()).setAlignment(FlowLayout.RIGHT); //Alignment列隊(duì)</p><p>  p1.add(b1);//將標(biāo)簽b1添加到面板上</p><p>  p1.add(btn);//將開始按鈕添加到面板上&

62、lt;/p><p>  p1.add(b2);//將標(biāo)簽b2添加到面板上</p><p>  p1.add(b3);//將標(biāo)簽b3添加到面板上</p><p>  p.add(p3,BorderLayout.NORTH);//這行代碼重復(fù) 還是將菜單欄加入到窗體的北邊</p><p>  p.add(p1,BorderLayout.CENTER)

63、;//將帶有一個(gè)開始按鈕,三個(gè)標(biāo)簽的按鈕加入到窗體的中間位置</p><p>  p2=new JPanel();//創(chuàng)建面板p2</p><p>  p2.setLayout(new GridLayout(row,col,0,0)); // GridLayout網(wǎng)格布局,p2設(shè)置為網(wǎng)格布局,該布局的最多可以9行9列,正好可以放置81個(gè)雷按鈕,按鈕和按鈕之間的水</p>&

64、lt;p>  for(int i=0;i<row*col;i++){//為按鈕數(shù)組賦值,此處的作用是創(chuàng)建81個(gè)雷按鈕對(duì)象</p><p>  btns[i]=new JButton("");//創(chuàng)建雷按鈕</p><p>  btns[i].setMargin(new Insets(0,0,0,0));//設(shè)置雷按鈕與其他組件的間距</p>&

65、lt;p>  btns[i].setFont(new Font(null,Font.BOLD,25)); //設(shè)置字體字形。黑體25px</p><p>  btns[i].addActionListener(this);//為雷按鈕添加監(jiān)聽器,監(jiān)聽動(dòng)作事件</p><p>  btns[i].addMouseListener(new NormoreMouseEvent());//

66、添加鼠標(biāo)監(jiān)聽器,監(jiān)聽普通鼠標(biāo)事件</p><p>  p2.add(btns[i]);//將雷按鈕添加到面板p2上</p><p><b>  }</b></p><p>  contentPane.add(p,BorderLayout.NORTH);</p><p>  contentPane.add(p2,Borde

67、rLayout.CENTER);//將p2添加到窗體的中間</p><p><b>  }</b></p><p>  public void go(){//創(chuàng)建go方法</p><p>  setVisible(true);//設(shè)置是否顯示窗體,設(shè)置為true就是顯示當(dāng)前窗體</p><p><b>  

68、}</b></p><p>  public static void main(String[] args){//主方法,作用是實(shí)例化窗體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來</p><p>  new ScanLei1("11計(jì)科2班掃雷軟件").go();//實(shí)例化窗體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來</p><p>&

69、lt;b>  }</b></p><p>  public void out(int[][] a,JButton[] btns,ActionEvent e,int i,int x,int y){</p><p><b>  int p=1;</b></p><p>  if(a[x][y]==0){//如果一個(gè)按鈕既不是雷周圍

70、又沒有雷</p><p>  a[x][y]=10;//將該按鈕對(duì)應(yīng)的值設(shè)置為10</p><p>  btns[i].setEnabled(false);//且這個(gè)按鈕不可用狀態(tài)</p><p>  for(int l=y-1;l<=y+1;l++){//排除按鈕左右的位置</p><p>  int m=x-1-1;//上兩行&l

71、t;/p><p>  int n=l-1;//左兩列</p><p><b>  p=1;</b></p><p>  System.out.println(a[1][2]);</p><p>  if(n>-1&&n<col&&m>-1&&m<row)

72、</p><p>  {//如果n值和m值在雷區(qū)的范圍之內(nèi)</p><p>  for(int q=0;q<row&&p==1;q++){//col-->row;</p><p>  if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){</p><

73、p>  if(a[x-1][l]!=0&&a[x-1][l]!=10){//如果該按鈕上一行前面左右的按鈕相應(yīng)位置的值既不是雷又沒雷且又不是已經(jīng)</p><p>  btns[n+col*q].setText(a[x-1][l]+"");//那么應(yīng)該將周圍雷的個(gè)數(shù)顯示到按鈕上去</p><p>  a[x-1][l]=10;//設(shè)置按鈕對(duì)應(yīng)的位置值

74、是10</p><p>  btns[n+col*q].setEnabled(false);//設(shè)置按鈕不可用</p><p><b>  }</b></p><p>  else if(a[x-1][l]==0){//如果這個(gè)按鈕上一行前面和左右方向仍然是既不是雷又不是周圍有雷,那么遞歸判斷這個(gè)</p><p>  /

75、/a[x-1][l]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p>  out(a,btns,e,n+col*q,x-1,l); ////55////</p><p>  a[x-1][l]=10;</p><p>  btns[n+col*q].setEnabled(false

76、);</p><p><b>  }</b></p><p><b>  p=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

77、</p><p><b>  p=1;</b></p><p><b>  m=x;</b></p><p>  if(n>-1&&n<col&&m>-1&&m<col)</p><p><b>  {</b&g

78、t;</p><p>  for(int q=0;q<row&&p==1;q++){</p><p>  if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){ //如果該按鈕下一行后面以及左右的按鈕相應(yīng)位置的值既不是雷又沒雷且又不</p><p>  if(a[x+1][l

79、]!=0&&a[x+1][l]!=10){</p><p>  btns[n+col*q].setText(a[x+1][l]+"");</p><p>  a[x+1][l]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b> 

80、 }</b></p><p>  else if(a[x+1][l]==0){</p><p>  //如果這個(gè)按鈕下一行后面和左右方向仍然是既不是雷又不是周圍有雷,那么遞歸判斷這個(gè)按鈕周圍的其他按鈕是什么情況</p><p>  out(a,btns,e,n+col*q,x+1,l);///55////</p><p&g

81、t;  a[x+1][l]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b>  }</b></p><p><b>  p=0;</b></p><p><b>  }</b></p><

82、p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int m=x-1;</p><p>  int n=y-1-1;</p><p><b>  p=1;<

83、;/b></p><p>  if(n>-1&&n<col&&m>-1&&m<col)</p><p><b>  {</b></p><p>  for(int q=0;q<row&&p==1;q++){</p><p>

84、;  if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){</p><p>  if(a[x][y-1]!=0&&a[x][y-1]!=10){</p><p>  btns[n+col*q].setText(a[x][y-1]+"");</p><p>  

85、a[x][y-1]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b>  }</b></p><p>  else if(a[x][y-1]==0){</p><p>  out(a,btns,e,n+col*q,x,y-1);</p>&

86、lt;p>  a[x][y-1]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b>  }</b></p><p><b>  p=0;</b></p><p><b>  }</b></p>

87、<p><b>  }</b></p><p><b>  }</b></p><p><b>  p=1;</b></p><p><b>  m=x-1;</b></p><p><b>  n=y+1-1;</b>

88、</p><p>  if(n>-1&&n<col&&m>-1&&m<col)</p><p><b>  {</b></p><p>  for(int q=0;q<row&&p==1;q++){</p><p>  if((

89、(n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){</p><p>  if(a[x][y+1]!=0&&a[x][y+1]!=10){</p><p>  btns[n+col*q].setText(a[x][y+1]+"");</p><p>  a[x][y+

90、1]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b>  }</b></p><p>  else if(a[x][y+1]==0){</p><p>  out(a,btns,e,n+col*q,x,y+1);</p>

91、<p>  a[x][y+1]=10;</p><p>  btns[n+col*q].setEnabled(false);</p><p><b>  }</b></p><p><b>  p=0;</b></p><p><b>  }</b></p&

92、gt;<p><b>  }</b></p><p><b>  }}</b></p><p><b>  }</b></p><p>  public void actionPerformed(ActionEvent e) {</p><p>  if(e.ge

93、tActionCommand()=="初級(jí)"){//如果你單擊的是游戲菜單中初級(jí)菜單項(xiàng)</p><p>  row=9;//設(shè)置雷的行數(shù)是9</p><p>  col=9;//列數(shù)是9</p><p><b>  bon=10;</b></p><p>  a1=new int[bon];</

94、p><p><b>  b=bon;</b></p><p>  //setSize(297,377);</p><p>  a = new int[row+2][col+2];</p><p>  this.remove(p2);//從窗體中央移除雷區(qū)面板</p><p>  timer.stop(

95、);//計(jì)時(shí)器停止</p><p>  b1.setText("10");//設(shè)置標(biāo)簽b1的內(nèi)容為10</p><p>  b2.setText("0");//b2的標(biāo)簽內(nèi)容為0</p><p>  b3.setText("");//b3的標(biāo)簽內(nèi)容為空</p><p>  btns=

96、new JButton[row*col];//創(chuàng)建雷區(qū)雷按鈕數(shù)組</p><p>  p2=new JPanel();//重新創(chuàng)建面板p2</p><p>  p2.setLayout(new GridLayout(row,col,0,0));//設(shè)置p2為網(wǎng)格布局,同樣還是9行9列,每一個(gè)單元格放一個(gè)雷</p><p>  for(int i=0;i<row

97、*col;i++){</p><p>  btns[i]=new JButton(" ");//為每一個(gè)雷按鈕實(shí)例化一個(gè)按鈕對(duì)象</p><p>  btns[i].setMargin(new Insets(0,0,0,0));//設(shè)置雷按鈕的間距</p><p>  btns[i].setFont(new Font(null,Font.

98、BOLD,25));//設(shè)置雷按鈕上文字的字體為黑體 25px</p><p>  btns[i].addActionListener(this);//添加動(dòng)作事件監(jiān)聽器</p><p>  btns[i].addMouseListener(new NormoreMouseEvent());//添加普通按鈕事件監(jiān)聽器</p><p>  p2.add(btns[i]

99、);//將雷按鈕放置到p2面板上</p><p><b>  }</b></p><p>  contentPane.add(p2,BorderLayout.CENTER);</p><p>  //setSize(297,377);</p><p>  this.pack();//設(shè)置窗體的大小為緊緊包容著所有組件&l

100、t;/p><p>  for(int i=0;i<row*col;i++){</p><p>  btns[i].setText(" ");//設(shè)置所有雷按鈕的內(nèi)容為空格</p><p>  btns[i].setEnabled(true);//設(shè)置所有雷按鈕為可用狀態(tài)</p><p><b>  }</

101、b></p><p>  for(int i=0;i<row+2;i++){</p><p>  for(int j=0;j<col+2;j++){</p><p>  a[i][j]=0;//將二維數(shù)組a的所有元素初始化為0</p><p><b>  }</b></p><p&g

102、t;<b>  }</b></p><p>  }else if(e.getActionCommand()=="中級(jí)"){</p><p>  row=16;//設(shè)置雷區(qū)有16*16個(gè)雷 以下代碼作用和選初級(jí)時(shí)相同,不再注釋了</p><p><b>  col=16;</b></p>&

103、lt;p><b>  bon=40;</b></p><p>  //setSize(33*col,33*row+80);</p><p>  a1=new int[bon];</p><p>  a = new int[row+2][col+2];</p><p><b>  b=bon;</b&

104、gt;</p><p>  this.remove(p2);</p><p>  timer.stop();</p><p>  b1.setText("40");</p><p>  b2.setText("0");</p><p>  b3.setText("&qu

105、ot;);</p><p>  btns=new JButton[row*col];</p><p>  p2=new JPanel();</p><p>  p2.setLayout(new GridLayout(row,col,0,0));</p><p>  for(int i=0;i<row*col;i++){</p>

106、;<p>  btns[i]=new JButton(" ");</p><p>  btns[i].setMargin(new Insets(0,0,0,0));</p><p>  btns[i].setFont(new Font(null,Font.BOLD,25));</p><p>  btns[i].addActi

107、onListener(this);</p><p>  btns[i].addMouseListener(new NormoreMouseEvent());</p><p>  p2.add(btns[i]);</p><p><b>  }</b></p><p>  contentPane.add(p2,Border

108、Layout.CENTER);</p><p>  this.pack();</p><p>  //setSize(33*col,33*row+80);</p><p>  for(int i=0;i<row*col;i++){</p><p>  btns[i].setText("");</p>&

109、lt;p>  btns[i].setEnabled(true);</p><p><b>  }</b></p><p>  for(int i=0;i<row+2;i++){</p><p>  for(int j=0;j<col+2;j++){</p><p>  a[i][j]=0;</p&

110、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  }else if(e.getActionCommand()=="高級(jí)"){//如果選擇的是高級(jí)菜單項(xiàng)</p><p>  row=16;//設(shè)置雷區(qū)是16*32 以下代碼和初級(jí)游戲代碼作用相同

111、,不在注釋了</p><p><b>  col=32;</b></p><p><b>  bon=99;</b></p><p>  setSize(33*col,33*row+80);</p><p>  a1=new int[bon];</p><p>  a = n

112、ew int[row+2][col+2];</p><p><b>  b=bon;</b></p><p>  this.remove(p2);</p><p>  timer.stop();</p><p>  b1.setText("99");</p><p>  b2.

113、setText("0");</p><p>  b3.setText("");</p><p>  btns=new JButton[row*col];</p><p>  p2=new JPanel();</p><p>  p2.setLayout(new GridLayout(row,col,0,

114、0));</p><p>  for(int i=0;i<row*col;i++){</p><p>  btns[i]=new JButton(" ");</p><p>  btns[i].setMargin(new Insets(0,0,0,0));</p><p>  btns[i].setFont(n

115、ew Font(null,Font.BOLD,25));</p><p>  btns[i].addActionListener(this);</p><p>  btns[i].addMouseListener(new NormoreMouseEvent());</p><p>  p2.add(btns[i]);</p><p><

116、b>  }</b></p><p>  contentPane.add(p2,BorderLayout.CENTER);</p><p>  //setSize(33*col,33*row+80);</p><p>  this.pack();</p><p>  for(int i=0;i<row*col;i++){

117、</p><p>  btns[i].setText("");</p><p>  btns[i].setEnabled(true);</p><p><b>  }</b></p><p>  for(int i=0;i<row+2;i++){</p><p>  fo

118、r(int j=0;j<col+2;j++){</p><p>  a[i][j]=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(e.getS

119、ource()==btn){//如果點(diǎn)擊了開始按鈕</p><p>  timer.start();//計(jì)時(shí)器開始計(jì)時(shí)</p><p><b>  b=bon;</b></p><p>  b3.setText("");//設(shè)置標(biāo)簽b3的內(nèi)容為空</p><p>  //System.out.prin

120、tln(bon);</p><p><b>  //清空</b></p><p>  for(int i=0;i<row*col;i++){</p><p>  btns[i].setText("");//設(shè)置所有的雷區(qū)的雷按鈕的內(nèi)容為空</p><p>  btns[i].setEnabled

121、(true);//設(shè)置所有雷按鈕可用,也就是可以單擊的狀態(tài)</p><p><b>  }</b></p><p>  for(int i=0;i<row+2;i++){</p><p>  for(int j=0;j<col+2;j++){</p><p>  a[i][j]=0;//初始化數(shù)組a所有元素為

122、0值</p><p><b>  }</b></p><p><b>  }</b></p><p>  //產(chǎn)生隨機(jī)數(shù),隨機(jī)數(shù)的作用用于布雷時(shí)隨機(jī)的指定雷所在的位置,</p><p>  for(int i=0;i<bon;i++)</p><p>  { int

123、 p=1;</p><p>  int m=(int)(Math.random()*row*col);//產(chǎn)生一個(gè)0-雷按鈕數(shù)的整數(shù)</p><p>  while(p==1){</p><p><b>  int l=1;</b></p><p><b>  int j;</b></p>

124、;<p>  for( j=0;j<i&&l==1;j++){//遍歷數(shù)組,查看m值是否已經(jīng)產(chǎn)生過了,如果數(shù)組a1中已經(jīng)有m值,重新產(chǎn)生m值,如果沒有產(chǎn)生m值,那么將m值賦值</p><p>  if(a1[j]==m){</p><p>  m=(int)(Math.random()*row*col); </p><p><

125、;b>  l=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(j==i){</b></p><p><b>  a1[i]=m;</b></p>

126、<p><b>  p=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  b1.setText(bon+"");

127、</p><p>  b2.setText("0");</p><p><b>  //布雷</b></p><p>  for(int i=0;i<bon;i++){</p><p>  int x=(a1[i]/col+1);</p><p>  int y=(

128、a1[i]%col+1);</p><p>  a[x][y]=100;//布雷的位置的值為100</p><p><b>  }</b></p><p>  for(int i=0;i<row+2;i++){</p><p>  for(int j=0;j<col+2;j++){</p>&l

溫馨提示

  • 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)論