基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc

上傳人:good****022 文檔編號(hào):116792426 上傳時(shí)間:2022-07-06 格式:DOC 頁(yè)數(shù):128 大小:1.67MB
收藏 版權(quán)申訴 舉報(bào) 下載
基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc_第1頁(yè)
第1頁(yè) / 共128頁(yè)
基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc_第2頁(yè)
第2頁(yè) / 共128頁(yè)
基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc_第3頁(yè)
第3頁(yè) / 共128頁(yè)

下載文檔到電腦,查找使用更方便

12 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).doc(128頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 JAVA程序設(shè)計(jì)A課程設(shè)計(jì)題 目 基于JAVA的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn) 院 (系) 信息工程學(xué)院 專 業(yè) 班 級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)(2)班 學(xué) 生 姓 名 學(xué) 號(hào) 設(shè) 計(jì) 地 點(diǎn) 教(13)軟件實(shí)驗(yàn)室 指 導(dǎo) 教 師 起止時(shí)間: 2014年 6月9日至2014年 6月13日J(rèn)ava程序設(shè)計(jì)A課程設(shè)計(jì)任務(wù)分工及成績(jī)?cè)海ㄏ担盒畔⒐こ虒W(xué)院 教研室:軟件教研室課程設(shè)計(jì)題目基于JAVA的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn) 課 程 設(shè)計(jì)內(nèi)容用JAVA實(shí)現(xiàn)掃雷游戲,了解掃雷游戲的基本結(jié)構(gòu),和理解掃雷的算法,并努力對(duì)算法進(jìn)行改進(jìn),調(diào)試過(guò)程中修復(fù)程序中的bugg,使該掃雷游戲盡可能完善。設(shè)計(jì)內(nèi)容: 1、掃雷游戲分為初級(jí)、中

2、級(jí)和高級(jí)三個(gè)級(jí)別。單擊游戲菜單可以選擇“初級(jí)”、“中級(jí)”和“高級(jí)”。2、選擇級(jí)別后將出現(xiàn)相應(yīng)級(jí)別的掃雷區(qū)域,這時(shí)用戶使用鼠標(biāo)左鍵單擊“開始”便啟動(dòng)計(jì)時(shí)器。3、用戶要揭開某個(gè)方塊,可左鍵單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下無(wú)雷,則顯示一個(gè)數(shù)字,該數(shù)字代表方塊的周圍的8個(gè)方塊中共有多少顆雷。4、如果用戶認(rèn)為某個(gè)方塊下埋著雷,單擊右鍵可以在方塊上標(biāo)識(shí)一個(gè)用戶認(rèn)為是雷的圖標(biāo),即給出一個(gè)掃雷標(biāo)記。用戶每標(biāo)記出一個(gè)掃雷標(biāo)記(無(wú)論用戶的標(biāo)記是否正確),程序?qū)@示的剩余雷數(shù)減少一個(gè)。小組成員及任務(wù)分配姓名學(xué)號(hào)承擔(dān)任務(wù)成績(jī)算法實(shí)現(xiàn) 游戲布局 設(shè)置監(jiān)聽器 基于JAVA的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)摘

3、要 隨著時(shí)代的發(fā)展,電腦進(jìn)入了普通老百姓的生活,越來(lái)越多的人使用電腦 辦公、娛樂(lè)、上網(wǎng),游戲行業(yè)發(fā)展一日千里,該行業(yè)極大的影響和改變了人們的 生活和娛樂(lè)方式, 游戲?yàn)橄M(fèi)者提供豐富多彩的虛擬空間,使消費(fèi)者可以自由自 在的享受虛擬世界的樂(lè)趣,實(shí)現(xiàn)自己在現(xiàn)實(shí)生活著那個(gè)可能永遠(yuǎn)不能實(shí)現(xiàn)的夢(mèng) 想,滿足了消費(fèi)者的心理和精神需求。 掃雷游戲是 Windows 操作系統(tǒng)自帶的一款小游戲,本系統(tǒng)要是模仿 WINDOWS 系統(tǒng)的掃雷,對(duì)于實(shí)現(xiàn)過(guò)程中出現(xiàn)的 bug 進(jìn)行調(diào)試解決。我這里用的是 C#編寫 了與它功能相似的掃雷游戲。 程序的功能是隨機(jī)生成地雷數(shù),通過(guò)鼠標(biāo)操作玩游戲,不接受鍵盤,按任意 鍵結(jié)束程序。 單

4、擊屏幕上的笑臉可以重新開始游戲。當(dāng)鼠標(biāo)左鍵單擊到地雷時(shí)提 示游戲失敗。 報(bào)告首先介紹了進(jìn)行該游戲課程設(shè)計(jì)的目的,然后是任務(wù)描述和設(shè) 計(jì)的相關(guān)要求, 最后是最重要的需求分析和設(shè)計(jì)方案。重點(diǎn)介紹了在游戲過(guò)程中 各事件的處理,其中又以鼠標(biāo)事件和清除未靠近地雷區(qū)方塊這兩方面最為最要, 鼠標(biāo)事件是利用鼠標(biāo)所發(fā)出的信息了解用戶的意圖,進(jìn)而做出相對(duì)應(yīng)的動(dòng)作。清 除未靠近地雷區(qū)的方塊較為復(fù)雜。關(guān)鍵詞:掃雷游戲,算法設(shè)計(jì),事件,JAVA目 錄1 概 述11.1選題的目的及意義11.2程序設(shè)計(jì)任務(wù)與要求12需求分析22.1 掃雷游戲的需求分析22.2 掃雷游戲的基本功能操作22.3 功能要求23 詳細(xì)設(shè)計(jì)43.1

5、 系統(tǒng)總體設(shè)計(jì)43.1.1 算法思想43.1.2 設(shè)計(jì)思想43.1.3 功能分析53.2系統(tǒng)詳細(xì)設(shè)計(jì)53.2.1類的設(shè)計(jì)53.2.2 模塊的劃分及調(diào)用關(guān)系64系統(tǒng)測(cè)試與實(shí)現(xiàn)74.1 程序測(cè)試結(jié)果74.1.1 游戲玩家通過(guò)右擊鼠標(biāo)來(lái)進(jìn)行掃雷,并顯示“雷”74.1.2 游戲玩家因觸到雷而導(dǎo)致游戲結(jié)束84.1.3 游戲玩家掃雷成功84.1.4 游戲玩家可選擇游戲難度9總 結(jié)10參考文獻(xiàn)11附 錄121概 述1.1選題的目的及意義本次課程設(shè)計(jì)的主要目的是為了通過(guò)具體的程序來(lái)加深對(duì)Java語(yǔ)言的掌握,提高自己的編程水平。選擇的題目來(lái)自Java課程設(shè)計(jì)(第二版)中的掃雷游戲,這是一個(gè)綜合性的題目,可以對(duì)J

6、ava中的各項(xiàng)功能有更好的理解和使用,同時(shí)也為以后的工作打下一定的基礎(chǔ)。1.2程序設(shè)計(jì)任務(wù)與要求掃雷游戲是一個(gè)很有趣的游戲。本章的課程設(shè)計(jì)使用Java語(yǔ)言編寫一個(gè)與其類似的掃雷游戲。具體要求如下:(1) 掃雷游戲分為初級(jí)、中級(jí)和高級(jí)三個(gè)級(jí)別。單擊游戲菜單可以選擇“初級(jí)”、“中級(jí)”和“高級(jí)”。(2) 選擇級(jí)別后將出現(xiàn)相應(yīng)級(jí)別的掃雷區(qū)域,這是用戶使用鼠標(biāo)左鍵單擊雷區(qū)中任何一個(gè)方塊便啟動(dòng)計(jì)時(shí)器。(3) 用戶要揭開某個(gè)方塊,可單擊它。若所揭方塊下有淚,用戶便輸了這一局,若所揭方塊下五雷,則顯示一個(gè)數(shù)字,該數(shù)字代表方塊的周圍的8個(gè)方塊中共有多少顆雷。(4) 如果用戶認(rèn)為某個(gè)方塊下埋著雷,單擊右鍵可以在方

7、塊上標(biāo)識(shí)一個(gè)用戶認(rèn)為是雷的圖標(biāo),即給出一個(gè)掃雷標(biāo)記雷。用戶每標(biāo)記出一個(gè)掃雷標(biāo)記(無(wú)論用戶的標(biāo)記是否正確),程序?qū)@示的剩余雷數(shù)減少一個(gè)。(5) 掃雷勝利后,游戲中的標(biāo)簽會(huì)顯示“你贏了!”(6)如果在掃雷過(guò)程中一不小心碰到了雷,游戲會(huì)顯示“你輸了,這個(gè)游戲不適合你!”。2需求分析2.1 掃雷游戲的需求分析隨著社會(huì)的不斷進(jìn)步,人們的壓力也不斷的提高,在游戲?qū)映霾桓F的時(shí)刻,掃雷游戲任然受到不少人的青睞,其本身的性質(zhì),決定了人們對(duì)它的喜愛的程度,不需要特殊的技巧,不需要不斷的升級(jí),還不需要太多的時(shí)間進(jìn)行熟悉,簡(jiǎn)簡(jiǎn)單單卻趣味無(wú)窮。2.2 掃雷游戲的基本功能操作本程序需實(shí)現(xiàn)的主要功能有:(1)用戶可以自定

8、義級(jí)別,并確定雷的個(gè)數(shù)。(2)具有計(jì)時(shí)功能,即顯示用戶完成掃雷所花費(fèi)的時(shí)間。(3)點(diǎn)擊開始進(jìn)行掃雷。(4)用戶識(shí)別雷右擊可標(biāo)記“雷”。2.3 功能要求(1)程序的總體功能如圖2.1所示。 圖2.1 總體功能圖2(2)程序總體流程如圖2.2所示。圖2.2 總體流程圖3 詳細(xì)設(shè)計(jì)3.1 系統(tǒng)總體設(shè)計(jì)3.1.1 算法思想(1)計(jì)算按鈕周圍雷數(shù)。(2)隨機(jī)分布。掃雷游戲要求在M行N列的網(wǎng)格游戲區(qū)隨即的不上bon個(gè)雷,且bon的取值應(yīng)小于M和N的乘積。這可以在一張M*N的網(wǎng)格上通過(guò)均勻分布的隨即算法視線。其中bon的網(wǎng)格是雷區(qū),剩下的網(wǎng)格是非雷區(qū)。游戲的目標(biāo)是盡可能快地找到所有的雷區(qū),而不踩到地雷。Ja

9、va提供了視線隨即算法的類Math,通過(guò)Math類的random()方法這可以很方便的實(shí)現(xiàn)隨即布雷的功能。3.1.2 設(shè)計(jì)思想(1)掃雷棋盤的布局設(shè)計(jì)系統(tǒng)的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括開始,選擇級(jí)別,標(biāo)記, 按鈕的功能是重新開始新的游戲。(2)雷區(qū)的設(shè)計(jì)ScanLei1類是繼承了JFrame實(shí)現(xiàn)了ActionListener接口,該類里聲明了組鍵,并進(jìn)行布局,go方法通過(guò)設(shè)置是否顯示窗體,主方法main()實(shí)例化窗體對(duì)象,out()方法是ScanLei1類中的重要方法之一,也就是掃雷的算法。 actionPerformed(ActionEv

10、ent e)就是單擊按鈕觸發(fā)的事件,如果是初級(jí)按鈕觸發(fā),分配初級(jí)雷區(qū)按鈕布局。如果是中級(jí)按鈕觸發(fā),分配中級(jí)雷區(qū)按鈕布局。如果是高級(jí)按鈕觸發(fā),分配高級(jí)雷區(qū)按扭布局。如果是開始按鈕觸發(fā),開始計(jì)數(shù),并隨機(jī)分配雷,并計(jì)算沒(méi)有雷的按鈕周圍有雷的數(shù)目。如果按鈕按鍵觸發(fā),調(diào)用ScanLei1類中的out()方法進(jìn)行掃雷。NormoreMouseEvent()繼承了鼠標(biāo)適配器,當(dāng)右擊按鈕后,根據(jù)該按鈕上的圖標(biāo)來(lái)判斷該按鈕是否被右擊過(guò),如果有圖標(biāo),將圖標(biāo)刪除,并雷的個(gè)數(shù)加一。如果該按鈕沒(méi)有被右擊過(guò),在該按鈕中添加圖標(biāo),并將雷的個(gè)數(shù)減一。雷區(qū)設(shè)計(jì)流程圖如圖3.3所示。圖3.3 雷區(qū)設(shè)計(jì)流程圖3.1.3 功能分析用

11、戶可以玩掃雷游戲并能自定義級(jí)別(初等,中等,高等);具有計(jì)時(shí)功能,即顯示用戶完成掃雷任務(wù)所花費(fèi)的時(shí)間。3.2系統(tǒng)詳細(xì)設(shè)計(jì)3.2.1類的設(shè)計(jì)(1)initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設(shè)置雷區(qū)的寬度、高度以及雷區(qū)的級(jí)別。(2)actionPerformed(ActionEvent)是MineArea類實(shí)現(xiàn)的ActionListener接口中的方法。當(dāng)用戶單擊blockView中的某個(gè)方塊時(shí),actionPerformed(ActionEvent)方法負(fù)責(zé)執(zhí)行有關(guān)算法,例如,當(dāng)用鼠標(biāo)左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(

12、ActionEvent)方法將使用戶輸?shù)舯揪?,若該方塊下無(wú)雷,actionPerformed(ActionEvent)方法將顯示blockView對(duì)象中的標(biāo)簽,該標(biāo)簽上是一個(gè)數(shù)字,該數(shù)字代表當(dāng)前方塊的周圍的8個(gè)方塊中共有多少顆雷。(3)show()方法是一個(gè)遞歸方法。actionPerformed(ActionEvent)方法執(zhí)行時(shí)將調(diào)用show方法進(jìn)行掃雷。(4)mousePressed(MouseEvent)方法是MineArea類實(shí)現(xiàn)的MouseListener接口中的方法,當(dāng)用戶按下鼠標(biāo)有件事mousePressed(MouseEvent)方法負(fù)責(zé)讓方塊上顯示一個(gè)探雷標(biāo)記。(5)inq

13、uireWin()方法用來(lái)判斷用戶是否掃雷成功,如果成功該方法負(fù)責(zé)讓record對(duì)話框可見。所謂掃雷成功是指不僅找到了全部的累而且用時(shí)最少。3.2.2 模塊的劃分及調(diào)用關(guān)系圖3.4 關(guān)系圖4系統(tǒng)測(cè)試與實(shí)現(xiàn)4.1 程序測(cè)試結(jié)果4.1.1 游戲玩家通過(guò)右擊鼠標(biāo)來(lái)進(jìn)行掃雷,并顯示“雷”圖4.1掃雷圖4.1.2 游戲玩家因觸到雷而導(dǎo)致游戲結(jié)束圖4.2 掃雷失敗圖4.1.3 游戲玩家掃雷成功圖4.3掃雷成功圖4.1.4 游戲玩家可選擇游戲難度圖4.4游戲幫助圖總 結(jié)這個(gè)掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過(guò)程中也遇到很多問(wèn)題,有些問(wèn)題比較簡(jiǎn)單但就不知道錯(cuò)在哪里,有些大問(wèn)題

14、之道在哪就是不知道怎么辦才好,后來(lái)經(jīng)過(guò)自己的不斷調(diào)試,這個(gè)掃雷游戲終于大功告成。經(jīng)過(guò)編寫這個(gè)掃雷游戲,我認(rèn)識(shí)到應(yīng)該注意細(xì)節(jié)問(wèn)題,雖然是很小的問(wèn)題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴(yán)謹(jǐn)性,同時(shí)還可以為以后的編程積累經(jīng)驗(yàn)。編寫完這個(gè)掃雷游戲,我發(fā)現(xiàn)自己有很多的不足,我想如果讓我來(lái)單獨(dú)來(lái)編寫這個(gè)游戲,我感覺(jué)能編出來(lái)的可能性很小,因?yàn)檫@個(gè)游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實(shí)實(shí)的打基礎(chǔ)!并且我感覺(jué)到只要我們自己肯下功夫?qū)W習(xí),我們也可以做出很好的東西,不需要每次都抄襲別人的,只有自己的才是最珍貴的!參考文獻(xiàn)1 耿祥義Java大學(xué)實(shí)用教程北京:清華大學(xué)出版社,20092 耿祥

15、義Java課程設(shè)計(jì)北京:清華大學(xué)出版社,20083 王鵬Java Swing圖形界面開發(fā)與案例詳解北京:清華大學(xué)出版社,20084 丁振凡Java語(yǔ)言實(shí)驗(yàn)教程北京:北京郵電大學(xué)出版社,20055 鄭莉Java語(yǔ)言程序設(shè)計(jì)北京:清華大學(xué)出版社,20066.孫全黨 王吳迪 趙楓朝,Java程序設(shè)計(jì)應(yīng)用教程,電子工業(yè)出版社,2006.2 7.雷之宇,Java項(xiàng)目開發(fā)實(shí)踐網(wǎng)絡(luò)篇,中國(guó)鐵道出版社,2005.5 8.趙玉陽(yáng),Java從入門到精通,清華大學(xué)出版社,2006.8 9.李蘢怡,Java編程實(shí)例講解,高等教育出版社,2005.11 10.張利國(guó),Java實(shí)用教程案例,北京:清華大學(xué)出版社,2003

16、.10 附 錄import java.awt.BorderLayout; /導(dǎo)入邊框布局import java.awt.Container; /導(dǎo)入一個(gè)容器,也是一個(gè)組件,在這個(gè)容器里你可以添加其他awt的組件import java.awt.Font; /導(dǎo)入字形,字體import java.awt.GridLayout; /導(dǎo)入網(wǎng)格式布局import java.awt.Insets; / Insets 對(duì)象描述容器的邊界區(qū)域。它指定一個(gè)容器在它的各個(gè)邊界上應(yīng)留出的空白區(qū)間。這個(gè)空白可以是一個(gè)邊界,一個(gè)不顯示區(qū)域或一個(gè)標(biāo)題。import java.awt.event.ActionEvent;

17、/ ActionEvent是一個(gè)類,指示發(fā)生了組件定義的動(dòng)作的語(yǔ)義事件。 import java.awt.event.ActionListener; / ActionListener用于接收操作事件的偵聽器接口。繼承自EventListener。import java.awt.event.MouseAdapter; /導(dǎo)入鼠標(biāo)監(jiān)聽適配器,負(fù)責(zé)對(duì)鼠標(biāo)事件進(jìn)行監(jiān)聽import java.awt.event.MouseEvent; /接口import javax.swing.JButton;/導(dǎo)入按鈕類import javax.swing.JFrame;/導(dǎo)入面板類import javax.swin

18、g.JLabel;/導(dǎo)入標(biāo)簽類import javax.swing.JMenu; /菜單import javax.swing.JMenuBar; /用來(lái)創(chuàng)建水平菜單欄import javax.swing.JMenuItem; /創(chuàng)建帶有設(shè)置文本或圖標(biāo)的 JMenuItem 菜單項(xiàng)import javax.swing.JPanel; /面板import javax.swing.Timer; / 定時(shí)器,功能是在指定的時(shí)間間隔內(nèi)反復(fù)觸發(fā)指定窗口的定時(shí)器事件。 public class ScanLei1 extends JFrame implements ActionListener/掃雷類繼承了J

19、Frame實(shí)現(xiàn)了ActionListener接口private static final long serialVersionUID = 1L; / serialVersionUID 用來(lái)表明類的不同版本間的兼容性private Container contentPane; /內(nèi)容面板,每一個(gè)JFrame對(duì)應(yīng)一個(gè)內(nèi)容面板,所有的組件應(yīng)該置于內(nèi)容面板之上private JButton btn; /聲明一個(gè)按鈕對(duì)象,開始按鈕,對(duì)象名為btn,private的意思是把變量或方法聲明成私有的,只有在本類中或本類實(shí)例可以訪問(wèn),其他類不可以private JButton btns;/聲明一個(gè)按鈕數(shù)組 雷區(qū)

20、的每一個(gè)雷都是一個(gè)按鈕,所有按鈕放置到該數(shù)組中private JLabel b1;/聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置剩余的雷的個(gè)數(shù)private JLabel b2; /聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置已經(jīng)游戲的時(shí)間private JLabel b3; /聲明一個(gè)標(biāo)簽對(duì)象,該標(biāo)簽用于放置游戲的結(jié)果private Timer timer;/聲明一個(gè)定時(shí)器對(duì)象private int row=9; /行,用于指定雷區(qū)的行private int col=9; /列 用于指定雷區(qū)的列private int bon=10; /布雷的個(gè)數(shù)private int a;/聲明一個(gè)int型的二維數(shù)組,二維數(shù)組的中

21、元素,有以下含義,值為0說(shuō)明該元素所對(duì)應(yīng)的坐標(biāo)所在的按鈕既不是雷又不是周圍有雷的按鈕,如果是100,則說(shuō)明private int b;/聲明int型的變量b 剩余雷的個(gè)數(shù)private int a1;/聲明int型數(shù)組a1,放置隨機(jī)數(shù),用于確定雷應(yīng)該布到雷區(qū)的位置private JPanel p,p1,p2,p3;/聲明面板public ScanLei1(String title)/定義掃雷的構(gòu)造方法,該構(gòu)造方法有個(gè)String類型的參數(shù),參數(shù)名為titlesuper(title);/調(diào)用JFrame的構(gòu)造方法,將title字符串傳入該構(gòu)造方法,這樣的話窗體顯示時(shí),標(biāo)題欄會(huì)顯示傳入的title

22、值contentPane=getContentPane();/獲取當(dāng)前JFrame對(duì)象的內(nèi)容面板,注意因?yàn)镾canLei1類繼承了JFrame對(duì)象,所以ScanLei1的對(duì)象也是JFrame對(duì)象setSize(300,400);/設(shè)置掃雷窗體的大小事300*400像素this.setBounds(400, 100, 400, 500); / setBounds(x,y,width,height); x:組件在容器X軸上的起點(diǎn) y:組件在容器Y軸上的起點(diǎn) width:組件的長(zhǎng)度 height:組件的高度setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

23、 /設(shè)置當(dāng)點(diǎn)擊窗體右上角的X按鈕時(shí)的窗體的行為,這里設(shè)置的是當(dāng)點(diǎn)擊這個(gè)按鈕時(shí)關(guān)閉并退出程序,沒(méi)有設(shè)置的話,timer =new Timer(1000,(ActionListener) this);/每隔1000毫秒觸發(fā)一次動(dòng)作事件的監(jiān)聽a = new introw+2col+2;/創(chuàng)建數(shù)組a,a是一個(gè)二維數(shù)組,數(shù)組時(shí)11列,11行initGUI();/調(diào)用初始化圖形界面方法public void initGUI()/聲明初始化圖形界面方法 p3=new JPanel();/創(chuàng)建一個(gè)面板b=bon;/將bon的值賦值給變量bJMenuBar menuBar=new JMenuBar();/創(chuàng)建一

24、個(gè)菜單欄對(duì)象JMenu menu1=new JMenu(游戲);/創(chuàng)建游戲菜單JMenu menu2=new JMenu(幫助);/創(chuàng)建幫助菜單JMenuItem mi1=new JMenuItem(初級(jí));/創(chuàng)建初級(jí)菜單項(xiàng)JMenuItem mi2 = new JMenuItem(中級(jí));/創(chuàng)建中級(jí)菜單項(xiàng)JMenuItem mi3 =new JMenuItem(高級(jí));/創(chuàng)建高級(jí)菜單項(xiàng)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)方法menu1.add(

25、mi1); mi2.addActionListener(this);menu1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上幾個(gè)操作類似menuBar.add(menu1);/將游戲菜單加入到菜單欄menuBar.add(menu2);/將幫助菜單加入到菜單欄p3.add(menuBar); /將菜單欄加入到p3面板上去b1=new JLabel(bon+);/創(chuàng)建一個(gè)標(biāo)簽,標(biāo)簽的內(nèi)容是bon的值10a1=new intbon;/創(chuàng)建a1數(shù)組,數(shù)組的長(zhǎng)度為10btn =new JButton(開始);/創(chuàng)建開始按鈕btn.add

26、ActionListener(this);/為開始按鈕加入動(dòng)作事件監(jiān)聽器b2=new JLabel(0);/創(chuàng)建標(biāo)簽b2,b2的內(nèi)容是0b3=new JLabel();/創(chuàng)建標(biāo)簽b3,b3暫時(shí)內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建一個(gè)按鈕數(shù)組,數(shù)組的個(gè)數(shù)為row*col,這個(gè)程序中就是9*9個(gè),每一個(gè)雷的位置就是一個(gè)按鈕 p=new JPanel();/創(chuàng)建一個(gè)面板p.setLayout(new BorderLayout(); /設(shè)置容器的邊框布局,邊框布局的樣式大致是這樣contentPane.add(p); / 將panl放置到內(nèi)容面板上去,為什么將一個(gè)面板放到內(nèi)容

27、面板,而不是將組件放到內(nèi)容面板上去呢,你可以看到panl上最多可以直接放置五個(gè)p.add(p3,BorderLayout.NORTH);/p3添加到面板的北邊,也就是在北邊放上了菜單欄,結(jié)果就如圖了/combo=new JComboBox(new Object初級(jí),中級(jí),高級(jí) );/加監(jiān)聽/*combo.addItemListener(new ItemListener();*/ p1=new JPanel();/創(chuàng)建一個(gè)面板/在那個(gè)位置/(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT); /Alignment列隊(duì)p1.add(b

28、1);/將標(biāo)簽b1添加到面板上p1.add(btn);/將開始按鈕添加到面板上p1.add(b2);/將標(biāo)簽b2添加到面板上p1.add(b3);/將標(biāo)簽b3添加到面板上p.add(p3,BorderLayout.NORTH);/這行代碼重復(fù) 還是將菜單欄加入到窗體的北邊p.add(p1,BorderLayout.CENTER);/將帶有一個(gè)開始按鈕,三個(gè)標(biāo)簽的按鈕加入到窗體的中間位置 p2=new JPanel();/創(chuàng)建面板p2p2.setLayout(new GridLayout(row,col,0,0); / GridLayout網(wǎng)格布局,p2設(shè)置為網(wǎng)格布局,該布局的最多可以9行9列,

29、正好可以放置81個(gè)雷按鈕,按鈕和按鈕之間的水for(int i=0;irow*col;i+)/為按鈕數(shù)組賦值,此處的作用是創(chuàng)建81個(gè)雷按鈕對(duì)象btnsi=new JButton();/創(chuàng)建雷按鈕btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕與其他組件的間距btnsi.setFont(new Font(null,Font.BOLD,25); /設(shè)置字體字形。黑體25pxbtnsi.addActionListener(this);/為雷按鈕添加監(jiān)聽器,監(jiān)聽動(dòng)作事件btnsi.addMouseListener(new NormoreMouseEvent();/添

30、加鼠標(biāo)監(jiān)聽器,監(jiān)聽普通鼠標(biāo)事件p2.add(btnsi);/將雷按鈕添加到面板p2上contentPane.add(p,BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/將p2添加到窗體的中間public void go()/創(chuàng)建go方法setVisible(true);/設(shè)置是否顯示窗體,設(shè)置為true就是顯示當(dāng)前窗體public static void main(String args)/主方法,作用是實(shí)例化窗體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來(lái)new ScanLei1(11計(jì)科2班掃雷軟件).go();/實(shí)例化窗

31、體對(duì)象,調(diào)用go方法將窗體顯示到屏幕上來(lái)public void out(int a,JButton btns,ActionEvent e,int i,int x,int y) int p=1; if(axy=0)/如果一個(gè)按鈕既不是雷周圍又沒(méi)有雷 axy=10;/將該按鈕對(duì)應(yīng)的值設(shè)置為10 btnsi.setEnabled(false);/且這個(gè)按鈕不可用狀態(tài) for(int l=y-1;l-1&n-1&mrow) /如果n值和m值在雷區(qū)的范圍之內(nèi) for(int q=0;qrow; if(n+col*q)=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q

32、=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)-1&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)(m+1)*col) if(axy+1!=0&axy+1!=10) btnsn+col*q.setText(axy+1+); axy+1=10; btnsn+col*q.setEnabled(false); else if(axy+1=0) out(a,btns,e,n+col*q,x,y+1); axy+1=10; btnsn+col*q.setEnabled(false); p=0

33、; public void actionPerformed(ActionEvent e) if(e.getActionCommand()=初級(jí))/如果你單擊的是游戲菜單中初級(jí)菜單項(xiàng)row=9;/設(shè)置雷的行數(shù)是9col=9;/列數(shù)是9bon=10;a1=new intbon;b=bon;/setSize(297,377);a = new introw+2col+2;this.remove(p2);/從窗體中央移除雷區(qū)面板timer.stop();/計(jì)時(shí)器停止b1.setText(10);/設(shè)置標(biāo)簽b1的內(nèi)容為10b2.setText(0);/b2的標(biāo)簽內(nèi)容為0b3.setText();/b3的標(biāo)

34、簽內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建雷區(qū)雷按鈕數(shù)組 p2=new JPanel();/重新創(chuàng)建面板p2p2.setLayout(new GridLayout(row,col,0,0);/設(shè)置p2為網(wǎng)格布局,同樣還是9行9列,每一個(gè)單元格放一個(gè)雷for(int i=0;irow*col;i+)btnsi=new JButton( );/為每一個(gè)雷按鈕實(shí)例化一個(gè)按鈕對(duì)象btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕的間距btnsi.setFont(new Font(null,Font.BOLD,25);/設(shè)置雷按鈕上文字的字體為黑體

35、 25pxbtnsi.addActionListener(this);/添加動(dòng)作事件監(jiān)聽器btnsi.addMouseListener(new NormoreMouseEvent();/添加普通按鈕事件監(jiān)聽器p2.add(btnsi);/將雷按鈕放置到p2面板上contentPane.add(p2,BorderLayout.CENTER);/setSize(297,377);this.pack();/設(shè)置窗體的大小為緊緊包容著所有組件for(int i=0;irow*col;i+)btnsi.setText( );/設(shè)置所有雷按鈕的內(nèi)容為空格btnsi.setEnabled(true);/設(shè)置

36、所有雷按鈕為可用狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/將二維數(shù)組a的所有元素初始化為0else if(e.getActionCommand()=中級(jí))row=16;/設(shè)置雷區(qū)有16*16個(gè)雷 以下代碼作用和選初級(jí)時(shí)相同,不再注釋了col=16;bon=40;/setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2; b=bon;this.remove(p2);timer.stop();b1.setText(40);b2.setText(0);b3.setTex

37、t();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);

38、contentPane.add(p2,BorderLayout.CENTER);this.pack();/setSize(33*col,33*row+80);for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;else if(e.getActionCommand()=高級(jí))/如果選擇的是高級(jí)菜單項(xiàng)row=16;/設(shè)置雷區(qū)是16*32 以下代碼和初級(jí)游戲代碼作用相同,不在注釋了col=32;bon=99;setSize(33

39、*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2);timer.stop();b1.setText(99);b2.setText(0);b3.setText();btns=new JButtonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new JButton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.se

40、tFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(new NormoreMouseEvent();p2.add(btnsi);contentPane.add(p2,BorderLayout.CENTER);/setSize(33*col,33*row+80);this.pack();for(int i=0;irow*col;i+)btnsi.setText();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0

41、;jcol+2;j+)aij=0;if(e.getSource()=btn)/如果點(diǎn)擊了開始按鈕timer.start();/計(jì)時(shí)器開始計(jì)時(shí)b=bon;b3.setText();/設(shè)置標(biāo)簽b3的內(nèi)容為空/System.out.println(bon);/清空f(shuō)or(int i=0;irow*col;i+)btnsi.setText();/設(shè)置所有的雷區(qū)的雷按鈕的內(nèi)容為空btnsi.setEnabled(true);/設(shè)置所有雷按鈕可用,也就是可以單擊的狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/初始化數(shù)組a所有元素為0值/產(chǎn)生隨機(jī)數(shù)

42、,隨機(jī)數(shù)的作用用于布雷時(shí)隨機(jī)的指定雷所在的位置,for(int i=0;ibon;i+) int p=1;int m=(int)(Math.random()*row*col);/產(chǎn)生一個(gè)0-雷按鈕數(shù)的整數(shù)while(p=1) int l=1; int j;for( j=0;ji&l=1;j+)/遍歷數(shù)組,查看m值是否已經(jīng)產(chǎn)生過(guò)了,如果數(shù)組a1中已經(jīng)有m值,重新產(chǎn)生m值,如果沒(méi)有產(chǎn)生m值,那么將m值賦值 if(a1j=m) m=(int)(Math.random()*row*col); l=0; if(j=i)a1i=m;p=0;b1.setText(bon+);b2.setText(0);/布

43、雷 for(int i=0;ibon;i+) int x=(a1i/col+1); int y=(a1i%col+1);axy=100;/布雷的位置的值為100 for(int i=0;irow+2;i+) for(int j=0;jcol+2;j+) if(i=0|j=0|i=row+1|j=col+1) aij=0; /指定雷區(qū)四周位置的值為0 for(int i=1;i=row;i+) for(int j=1;j=col;j+) if(aij!=100)/如果aij不等與100,就說(shuō)明這個(gè)位置的雷按鈕不是地雷,是安全的,但是安全的按鈕上通常是要顯示該按鈕附近有幾個(gè)雷的 for(int l

44、=j-1;l=600)/如果該值大于600,則定時(shí)器停止timer.stop();elset+;/如果t小于600,t在原來(lái)基礎(chǔ)上加1b2.setText(t+);/然后將時(shí)間設(shè)置到b2標(biāo)簽上作為標(biāo)簽的內(nèi)容for(int i=0;icol*row;i+) if(btnsi.getText()!=雷)/如果雷區(qū)按鈕的值不是雷 int x=i/col+1; int y=i%col+1;/根據(jù)按鈕i值計(jì)算被點(diǎn)擊的按鈕對(duì)應(yīng)的a數(shù)組中元素的位置 if(e.getSource()=btnsi&axy=100)/如果監(jiān)聽到點(diǎn)擊的是雷區(qū)按鈕,且對(duì)應(yīng)位置的a數(shù)組中元素值為100,則說(shuō)明點(diǎn)擊到了地雷,也就是觸雷了

45、 btnsi.setText(雷);/設(shè)置地雷按鈕的顯示的內(nèi)容為雷 btnsi.setEnabled(false);/設(shè)置按鈕不可用 axy=10;/設(shè)置該位置為10 for(int k=0;kcol*row;k+) int m1=k/col+1; int n1=k%col+1; if(am1n1!=10&btnsk.getText()=雷)/將雷區(qū)中所有對(duì)應(yīng)位置a數(shù)組的值不是10,但是已經(jīng)找出的雷的按鈕的值設(shè)置為*o*, btnsk.setText(*o*);/將已經(jīng)排除的雷顯示為*o* for(int j=0;jcol*row;j+) int m=j/col+1; int n=j%col+1; if(amn=100)/觸雷后,將所有為找

展開閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!