基于JAVA的掃雷游戲的設(shè)計及實現(xiàn)_第1頁
基于JAVA的掃雷游戲的設(shè)計及實現(xiàn)_第2頁
基于JAVA的掃雷游戲的設(shè)計及實現(xiàn)_第3頁
基于JAVA的掃雷游戲的設(shè)計及實現(xiàn)_第4頁
基于JAVA的掃雷游戲的設(shè)計及實現(xiàn)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-. z JAVA程序設(shè)計A課程設(shè)計題 目 基于JAVA的掃雷游戲的設(shè)計與實現(xiàn) 院 系 信息工程學院 專 業(yè) 班 級 計算機科學與技術(shù)(2)班 學 生 姓 名 學 號 設(shè) 計 地 點 教13軟件實驗室 指 導 教 師 起止時間: 2014年 6月9日至2014年 6月13日?Java程序設(shè)計A?課程設(shè)計任務(wù)分工及成績院系:信息工程學院 教研室:軟件教研室課程設(shè)計題目基于JAVA的掃雷游戲的設(shè)計與實現(xiàn) 課 程 設(shè)計容用JAVA實現(xiàn)掃雷游戲,了解掃雷游戲的根本構(gòu)造,和理解掃雷的算法,并努力對算法進展改良,調(diào)試過程中修復程序中的bugg,使該掃雷游戲盡可能完善。設(shè)計容: 1、掃雷游戲分為初級、中級和

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

3、展,電腦進入了普通老百姓的生活,越來越多的人使用電腦 辦公、娛樂、上網(wǎng),游戲行業(yè)開展一日千里,該行業(yè)極大的影響和改變了人們的 生活和娛樂方式, 游戲為消費者提供豐富多彩的虛擬空間,使消費者可以自由自 在的享受虛擬世界的樂趣,實現(xiàn)自己在現(xiàn)實生活著那個可能永遠不能實現(xiàn)的夢 想,滿足了消費者的心理和精神需求。 掃雷游戲是 Windows 操作系統(tǒng)自帶的一款小游戲,本系統(tǒng)要是模仿 WINDOWS 系統(tǒng)的掃雷,對于實現(xiàn)過程中出現(xiàn)的 bug 進展調(diào)試解決。我這里用的是 C*編寫 了與它功能相似的掃雷游戲。 程序的功能是隨機生成地雷數(shù),通過鼠標操作玩游戲,不承受鍵盤,按任意 鍵完畢程序。 單擊屏幕上的笑臉可

4、以重新開場游戲。當鼠標左鍵單擊到地雷時提 示游戲失敗。 報告首先介紹了進展該游戲課程設(shè)計的目的,然后是任務(wù)描述和設(shè) 計的相關(guān)要求, 最后是最重要的需求分析和設(shè)計方案。重點介紹了在游戲過程中 各事件的處理,其中又以鼠標事件和去除未靠近地雷區(qū)方塊這兩方面最為最要, 鼠標事件是利用鼠標所發(fā)出的信息了解用戶的意圖,進而做出相對應的動作。清 除未靠近地雷區(qū)的方塊較為復雜。關(guān)鍵詞:掃雷游戲,算法設(shè)計,事件,JAVA目 錄TOC o 1-4 h u HYPERLINK l _Toc25686 1 概 述 PAGEREF _Toc25686 1 HYPERLINK l _Toc18898 1.1選題的目的及意

5、義 PAGEREF _Toc18898 1 HYPERLINK l _Toc7456 1.2程序設(shè)計任務(wù)與要求 PAGEREF _Toc7456 1 HYPERLINK l _Toc16867 2需求分析 PAGEREF _Toc16867 2 HYPERLINK l _Toc14793 2.1掃雷游戲的需求分析 PAGEREF _Toc14793 2 HYPERLINK l _Toc6392 2.2 掃雷游戲的根本功能操作 PAGEREF _Toc6392 2 HYPERLINK l _Toc31351 2.3 功能要求 PAGEREF _Toc31351 2 HYPERLINK l _To

6、c7620 3 詳細設(shè)計 PAGEREF _Toc7620 4 HYPERLINK l _Toc19888 3.1 系統(tǒng)總體設(shè)計 PAGEREF _Toc19888 4 HYPERLINK l _Toc23786 3.1.1算法思想 PAGEREF _Toc23786 4 HYPERLINK l _Toc29628 3.1.2設(shè)計思想 PAGEREF _Toc29628 4 HYPERLINK l _Toc27387 3.1.3 功能分析 PAGEREF _Toc27387 5 HYPERLINK l _Toc4519 3.2系統(tǒng)詳細設(shè)計 PAGEREF _Toc4519 5 HYPERLIN

7、K l _Toc18968 3.2.1類的設(shè)計 PAGEREF _Toc18968 5 HYPERLINK l _Toc26195 3.2.2 模塊的劃分及調(diào)用關(guān)系 PAGEREF _Toc26195 6 HYPERLINK l _Toc8233 4系統(tǒng)測試與實現(xiàn) PAGEREF _Toc8233 7 HYPERLINK l _Toc27015 4.1 程序測試結(jié)果 PAGEREF _Toc27015 7 HYPERLINK l _Toc385 4.1.1 游戲玩家通過右擊鼠標來進展掃雷,并顯示“雷 PAGEREF _Toc385 7 HYPERLINK l _Toc4932 4.1.2游戲玩

8、家因觸到雷而導致游戲完畢 PAGEREF _Toc4932 8 HYPERLINK l _Toc28438 4.1.3 游戲玩家掃雷成功 PAGEREF _Toc28438 8 HYPERLINK l _Toc3521 4.1.4 游戲玩家可選擇游戲難度 PAGEREF _Toc3521 9 HYPERLINK l _Toc11024 總 結(jié) PAGEREF _Toc11024 10 HYPERLINK l _Toc30755 參考文獻 PAGEREF _Toc30755 11 HYPERLINK l _Toc12052 附 錄 PAGEREF _Toc12052 12-. z1概 述1.1選

9、題的目的及意義本次課程設(shè)計的主要目的是為了通過具體的程序來加深對Java語言的掌握,提高自己的編程水平。選擇的題目來自?Java課程設(shè)計第二版?中的掃雷游戲,這是一個綜合性的題目,可以對Java中的各項功能有更好的理解和使用,同時也為以后的工作打下一定的根底。1.2程序設(shè)計任務(wù)與要求掃雷游戲是一個很有趣的游戲。本章的課程設(shè)計使用Java語言編寫一個與其類似的掃雷游戲。具體要求如下:(1) 掃雷游戲分為初級、中級和高級三個級別。單擊游戲菜單可以選擇“初級、“中級和“高級。(2) 選擇級別后將出現(xiàn)相應級別的掃雷區(qū)域,這是用戶使用鼠標左鍵單擊雷區(qū)中任何一個方塊便啟動計時器。(3) 用戶要揭開*個方塊

10、,可單擊它。假設(shè)所揭方塊下有淚,用戶便輸了這一局,假設(shè)所揭方塊下五雷,則顯示一個數(shù)字,該數(shù)字代表方塊的周圍的8個方塊中共有多少顆雷。(4) 如果用戶認為*個方塊下埋著雷,單擊右鍵可以在方塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記雷。用戶每標記出一個掃雷標記(無論用戶的標記是否正確),程序?qū)@示的剩余雷數(shù)減少一個。(5) 掃雷勝利后,游戲中的標簽會顯示“你贏了!(6)如果在掃雷過程中一不小心碰到了雷,游戲會顯示“你輸了,這個游戲不適合你!。2需求分析2.1掃雷游戲的需求分析隨著社會的不斷進步,人們的壓力也不斷的提高,在游戲?qū)映霾桓F的時刻,掃雷游戲任然受到不少人的青睞,其本身的性質(zhì),決定了

11、人們對它的喜愛的程度,不需要特殊的技巧,不需要不斷的升級,還不需要太多的時間進展熟悉,簡簡單單卻趣味無窮。2.2掃雷游戲的根本功能操作本程序需實現(xiàn)的主要功能有:(1)用戶可以自定義級別,并確定雷的個數(shù)。(2)具有計時功能,即顯示用戶完成掃雷所花費的時間。(3)點擊開場進展掃雷。(4)用戶識別雷右擊可標記“雷。2.3功能要求(1)程序的總體功能如圖2.1所示。圖2.1 總體功能圖-. z(2)程序總體流程如圖2.2所示。圖2.2 總體流程圖3詳細設(shè)計3.1系統(tǒng)總體設(shè)計算法思想(1)計算按鈕周圍雷數(shù)。(2)隨機分布。掃雷游戲要求在M行N列的網(wǎng)格游戲區(qū)隨即的不上bon個雷,且bon的取值應小于M和N

12、的乘積。這可以在一M*N的網(wǎng)格上通過均勻分布的隨即算法視線。其中bon的網(wǎng)格是雷區(qū),剩下的網(wǎng)格是非雷區(qū)。游戲的目標是盡可能快地找到所有的雷區(qū),而不踩到地雷。Java提供了視線隨即算法的類Math,通過Math類的random方法這可以很方便的實現(xiàn)隨即布雷的功能。設(shè)計思想1掃雷棋盤的布局設(shè)計系統(tǒng)的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括開場,選擇級別,標記, 按鈕的功能是重新開場新的游戲。2雷區(qū)的設(shè)計ScanLei1類是繼承了JFrame實現(xiàn)了ActionListener接口,該類里聲明了組鍵,并進展布局,go方法通過設(shè)置是否顯示窗體,主方法main()

13、實例化窗體對象,out()方法是ScanLei1類中的重要方法之一,也就是掃雷的算法。 actionPerformed(ActionEvent e)就是單擊按鈕觸發(fā)的事件,如果是初級按鈕觸發(fā),分配初級雷區(qū)按鈕布局。如果是中級按鈕觸發(fā),分配中級雷區(qū)按鈕布局。如果是高級按鈕觸發(fā),分配高級雷區(qū)按扭布局。如果是開場按鈕觸發(fā),開場計數(shù),并隨機分配雷,并計算沒有雷的按鈕周圍有雷的數(shù)目。如果按鈕按鍵觸發(fā),調(diào)用ScanLei1類中的out()方法進展掃雷。NormoreMouseEvent()繼承了鼠標適配器,當右擊按鈕后,根據(jù)該按鈕上的圖標來判斷該按鈕是否被右擊過,如果有圖標,將圖標刪除,并雷的個數(shù)加一。如

14、果該按鈕沒有被右擊過,在該按鈕中添加圖標,并將雷的個數(shù)減一。雷區(qū)設(shè)計流程圖如圖3.3所示。圖3.3 雷區(qū)設(shè)計流程圖功能分析用戶可以玩掃雷游戲并能自定義級別初等,中等,高等;具有計時功能,即顯示用戶完成掃雷任務(wù)所花費的時間。3.2系統(tǒng)詳細設(shè)計類的設(shè)計(1)initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設(shè)置雷區(qū)的寬度、高度以及雷區(qū)的級別。(2)actionPerformed(ActionEvent)是MineArea類實現(xiàn)的ActionListener接口中的方法。當用戶單擊blockView中的*個方塊時,actionPerformed(ActionEvent

15、)方法負責執(zhí)行有關(guān)算法,例如,當用鼠標左鍵單擊方塊上的按鈕后,假設(shè)該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪?,假設(shè)該方塊下無雷,actionPerformed(ActionEvent)方法將顯示blockView對象中的標簽,該標簽上是一個數(shù)字,該數(shù)字代表當前方塊的周圍的8個方塊中共有多少顆雷。(3)show()方法是一個遞歸方法。actionPerformed(ActionEvent)方法執(zhí)行時將調(diào)用show方法進展掃雷。(4)mousePressed(MouseEvent)方法是MineArea類實現(xiàn)的MouseListener接口中的方法,

16、當用戶按下鼠標有件事mousePressed(MouseEvent)方法負責讓方塊上顯示一個探雷標記。(5)inquireWin()方法用來判斷用戶是否掃雷成功,如果成功該方法負責讓record對話框可見。所謂掃雷成功是指不僅找到了全部的累而且用時最少。模塊的劃分及調(diào)用關(guān)系圖3.4 關(guān)系圖4系統(tǒng)測試與實現(xiàn)4.1 程序測試結(jié)果游戲玩家通過右擊鼠標來進展掃雷,并顯示“雷圖4.1掃雷圖游戲玩家因觸到雷而導致游戲完畢圖4.2 掃雷失敗圖游戲玩家掃雷成功圖4.3掃雷成功圖游戲玩家可選擇游戲難度圖4.4游戲幫助圖總 結(jié)這個掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過程中也遇到很多

17、問題,有些問題比擬簡單但就不知道錯在哪里,有些大問題之道在哪就是不知道怎么辦才好,后來經(jīng)過自己的不斷調(diào)試,這個掃雷游戲終于大功告成。經(jīng)過編寫這個掃雷游戲,我認識到應該注意細節(jié)問題,雖然是很小的問題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴謹性,同時還可以為以后的編程積累經(jīng)歷。編寫完這個掃雷游戲,我發(fā)現(xiàn)自己有很多的缺乏,我想如果讓我來單獨來編寫這個游戲,我感覺能編出來的可能性很小,因為這個游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實實的打根底!并且我感覺到只要我們自己肯下功夫?qū)W習,我們也可以做出很好的東西,不需要每次都抄襲別人的,只有自己的才是最珍貴的!參考文獻1 耿祥義Jav

18、a大學實用教程:清華大學,20212 耿祥義Java課程設(shè)計:清華大學,20213 王鵬Java Swing圖形界面開發(fā)與案例詳解:清華大學,20214 丁振凡Java語言實驗教程:郵電大學,20055 莉Java語言程序設(shè)計:清華大學,20066.全黨 王吳迪 楓朝,Java程序設(shè)計應用教程,電子工業(yè),2006.2 7.雷之宇,Java工程開發(fā)實踐網(wǎng)絡(luò)篇,中國鐵道,2005.5 8.玉陽,Java從入門到精通,清華大學,2006.8 9.蘢怡,Java編程實例講解,高等教育,2005.11 10.利國,Java實用教程案例,:清華大學,2003.10 附 錄import java.awt.B

19、orderLayout; /導入邊框布局import java.awt.Container; /導入一個容器,也是一個組件,在這個容器里你可以添加其他awt的組件import java.awt.Font; /導入字形,字體import java.awt.GridLayout; /導入網(wǎng)格式布局import java.awt.Insets; / Insets 對象描述容器的邊界區(qū)域。它指定一個容器在它的各個邊界上應留出的空白區(qū)間。這個空白可以是一個邊界,一個不顯示區(qū)域或一個標題。import java.awt.event.ActionEvent; / ActionEvent是一個類,指示發(fā)生了組

20、件定義的動作的語義事件。 import java.awt.event.ActionListener; / ActionListener用于接收操作事件的偵聽器接口。繼承自EventListener。import java.awt.event.MouseAdapter; /導入鼠標監(jiān)聽適配器,負責對鼠標事件進展監(jiān)聽import java.awt.event.MouseEvent; /接口import java*.swing.utton;/導入按鈕類import java*.swing.JFrame;/導入面板類import java*.swing.JLabel;/導入標簽類import java

21、*.swing.JMenu; /菜單import java*.swing.JMenuBar; /用來創(chuàng)立水平菜單欄import java*.swing.JMenuItem; /創(chuàng)立帶有設(shè)置文本或圖標的 JMenuItem 菜單項import java*.swing.JPanel; /面板import java*.swing.Timer; / 定時器,功能是在指定的時間間隔反復觸發(fā)指定窗口的定時器事件。 public class ScanLei1 e*tends JFrame implements ActionListener/掃雷類繼承了JFrame實現(xiàn)了ActionListener接口pri

22、vate static final long serialVersionUID = 1L; / serialVersionUID 用來說明類的不同版本間的兼容性private Container contentPane; /容面板,每一個JFrame對應一個容面板,所有的組件應該置于容面板之上private utton btn; /聲明一個按鈕對象,開場按鈕,對象名為btn,private的意思是把變量或方法聲明成私有的,只有在本類中或本類實例可以,其他類不可以private utton btns;/聲明一個按鈕數(shù)組 雷區(qū)的每一個雷都是一個按鈕,所有按鈕放置到該數(shù)組中private JLabe

23、l b1;/聲明一個標簽對象,該標簽用于放置剩余的雷的個數(shù)private JLabel b2; /聲明一個標簽對象,該標簽用于放置已經(jīng)游戲的時間private JLabel b3; /聲明一個標簽對象,該標簽用于放置游戲的結(jié)果private Timer timer;/聲明一個定時器對象private int row=9; /行,用于指定雷區(qū)的行private int col=9; /列 用于指定雷區(qū)的列private int bon=10; /布雷的個數(shù)private int a;/聲明一個int型的二維數(shù)組,二維數(shù)組的中元素,有以下含義,值為0說明該元素所對應的坐標所在的按鈕既不是雷又不是周

24、圍有雷的按鈕,如果是100,則說明private int b;/聲明int型的變量b 剩余雷的個數(shù)private int a1;/聲明int型數(shù)組a1,放置隨機數(shù),用于確定雷應該布到雷區(qū)的位置private JPanel p,p1,p2,p3;/聲明面板public ScanLei1(String title)/定義掃雷的構(gòu)造方法,該構(gòu)造方法有個String類型的參數(shù),參數(shù)名為titlesuper(title);/調(diào)用JFrame的構(gòu)造方法,將title字符串傳入該構(gòu)造方法,這樣的話窗體顯示時,標題欄會顯示傳入的title值contentPane=getContentPane();/獲取當前J

25、Frame對象的容面板,注意因為ScanLei1類繼承了JFrame對象,所以ScanLei1的對象也是JFrame對象setSize(300,400);/設(shè)置掃雷窗體的大小事300*400像素this.setBounds(400, 100, 400, 500); / setBounds(*,y,width,height); *:組件在容器*軸上的起點 y:組件在容器Y軸上的起點 width:組件的長度 height:組件的高度setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE); /設(shè)置當點擊窗體右上角的*按鈕時的窗體的行為,這里設(shè)置的是當點擊這個按鈕

26、時關(guān)閉并退出程序,沒有設(shè)置的話,timer =new Timer(1000,(ActionListener) this);/每隔1000毫秒觸發(fā)一次動作事件的監(jiān)聽a = new introw+2col+2;/創(chuàng)立數(shù)組a,a是一個二維數(shù)組,數(shù)組時11列,11行initGUI();/調(diào)用初始化圖形界面方法public void initGUI()/聲明初始化圖形界面方法 p3=new JPanel();/創(chuàng)立一個面板b=bon;/將bon的值賦值給變量bJMenuBar menuBar=new JMenuBar();/創(chuàng)立一個菜單欄對象JMenu menu1=new JMenu(游戲);/創(chuàng)立游戲

27、菜單JMenu menu2=new JMenu(幫助);/創(chuàng)立幫助菜單JMenuItem mi1=new JMenuItem(初級);/創(chuàng)立初級菜單項JMenuItem mi2 = new JMenuItem(中級);/創(chuàng)立中級菜單項JMenuItem mi3 =new JMenuItem(高級);/創(chuàng)立高級菜單項mi1.addActionListener(this);/為初級菜單項參加動作事件監(jiān)聽器,當你單擊鼠標左鍵點初級菜單項時會執(zhí)行actionPerformed(ActionEvent e)方法menu1.add(mi1); mi2.addActionListener(this);men

28、u1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上幾個操作類似menuBar.add(menu1);/將游戲菜單參加到菜單欄menuBar.add(menu2);/將幫助菜單參加到菜單欄p3.add(menuBar); /將菜單欄參加到p3面板上去b1=new JLabel(bon+);/創(chuàng)立一個標簽,標簽的容是bon的值10a1=new intbon;/創(chuàng)立a1數(shù)組,數(shù)組的長度為10btn =new utton(開場);/創(chuàng)立開場按鈕btn.addActionListener(this);/為開場按鈕參加動作事件監(jiān)聽器b2=n

29、ew JLabel(0);/創(chuàng)立標簽b2,b2的容是0b3=new JLabel();/創(chuàng)立標簽b3,b3暫時容為空btns=new uttonrow*col;/創(chuàng)立一個按鈕數(shù)組,數(shù)組的個數(shù)為row*col,這個程序中就是9*9個,每一個雷的位置就是一個按鈕 p=new JPanel();/創(chuàng)立一個面板p.setLayout(new BorderLayout(); /設(shè)置容器的邊框布局,邊框布局的樣式大致是這樣contentPane.add(p); / 將panl放置到容面板上去,為什么將一個面板放到容面板,而不是將組件放到容面板上去呢,你可以看到panl上最多可以直接放置五個p.add(p3

30、,BorderLayout.NORTH);/p3添加到面板的北邊,也就是在北邊放上了菜單欄,結(jié)果就如圖了/bo=new oBo*(new Object初級,中級,高級 );/加監(jiān)聽/*bo.addItemListener(new ItemListener();*/ p1=new JPanel();/創(chuàng)立一個面板/在那個位置/(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT); /Alignment列隊p1.add(b1);/將標簽b1添加到面板上p1.add(btn);/將開場按鈕添加到面板上p1.add(b2);/將標簽b2添加

31、到面板上p1.add(b3);/將標簽b3添加到面板上p.add(p3,BorderLayout.NORTH);/這行代碼重復 還是將菜單欄參加到窗體的北邊p.add(p1,BorderLayout.CENTER);/將帶有一個開場按鈕,三個標簽的按鈕參加到窗體的中間位置 p2=new JPanel();/創(chuàng)立面板p2p2.setLayout(new GridLayout(row,col,0,0); / GridLayout網(wǎng)格布局,p2設(shè)置為網(wǎng)格布局,該布局的最多可以9行9列,正好可以放置81個雷按鈕,按鈕和按鈕之間的水for(int i=0;irow*col;i+)/為按鈕數(shù)組賦值,此處的

32、作用是創(chuàng)立81個雷按鈕對象btnsi=new utton();/創(chuàng)立雷按鈕btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕與其他組件的間距btnsi.setFont(new Font(null,Font.BOLD,25); /設(shè)置字體字形。黑體25p*btnsi.addActionListener(this);/為雷按鈕添加監(jiān)聽器,監(jiān)聽動作事件btnsi.addMouseListener(new NormoreMouseEvent();/添加鼠標監(jiān)聽器,監(jiān)聽普通鼠標事件p2.add(btnsi);/將雷按鈕添加到面板p2上contentPane.add(p,

33、BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/將p2添加到窗體的中間public void go()/創(chuàng)立go方法setVisible(true);/設(shè)置是否顯示窗體,設(shè)置為true就是顯示當前窗體public static void main(String args)/主方法,作用是實例化窗體對象,調(diào)用go方法將窗體顯示到屏幕上來new ScanLei1(11計科2班掃雷軟件).go();/實例化窗體對象,調(diào)用go方法將窗體顯示到屏幕上來public void out(int a,utton btns,ActionE

34、vent e,int i,int *,int y) int p=1; if(a*y=0)/如果一個按鈕既不是雷周圍又沒有雷 a*y=10;/將該按鈕對應的值設(shè)置為10 btnsi.setEnabled(false);/且這個按鈕不可用狀態(tài) for(int l=y-1;l-1&n-1&mrow) /如果n值和m值在雷區(qū)的圍之 for(int q=0;qrow; if(n+col*q)=(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)-1

35、&n-1&mcol) for(int q=0;q=(m*col)&(n+col*q)(m+1)*col) if(a*y+1!=0&a*y+1!=10) btnsn+col*q.setTe*t(a*y+1+); a*y+1=10; btnsn+col*q.setEnabled(false); else if(a*y+1=0) out(a,btns,e,n+col*q,*,y+1); a*y+1=10; btnsn+col*q.setEnabled(false); p=0; public void actionPerformed(ActionEvent e) if(e.getActionmand(

36、)=初級)/如果你單擊的是游戲菜單中初級菜單項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();/計時器停頓b1.setTe*t(10);/設(shè)置標簽b1的容為10b2.setTe*t(0);/b2的標簽容為0b3.setTe*t();/b3的標簽容為空btns=new uttonrow*col;/創(chuàng)立雷區(qū)雷按鈕數(shù)組 p2=new JPanel();/重新創(chuàng)立面板p2p2.setL

37、ayout(new GridLayout(row,col,0,0);/設(shè)置p2為網(wǎng)格布局,同樣還是9行9列,每一個單元格放一個雷for(int i=0;irow*col;i+)btnsi=new utton( );/為每一個雷按鈕實例化一個按鈕對象btnsi.setMargin(new Insets(0,0,0,0);/設(shè)置雷按鈕的間距btnsi.setFont(new Font(null,Font.BOLD,25);/設(shè)置雷按鈕上文字的字體為黑體 25p*btnsi.addActionListener(this);/添加動作事件監(jiān)聽器btnsi.addMouseListener(new No

38、rmoreMouseEvent();/添加普通按鈕事件監(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.setTe*t( );/設(shè)置所有雷按鈕的容為空格btnsi.setEnabled(true);/設(shè)置所有雷按鈕為可用狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/將二維數(shù)組a的所有元素初始化

39、為0else if(e.getActionmand()=中級)row=16;/設(shè)置雷區(qū)有16*16個雷 以下代碼作用和選初級時一樣,不再注釋了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.setTe*t(40);b2.setTe*t(0);b3.setTe*t();btns=new uttonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col

40、,0,0);for(int i=0;irow*col;i+)btnsi=new utton( );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);contentPane.add(p2,BorderLayout.CENTER);this.pack();/setSize(33*col,33*row+80);for

41、(int i=0;irow*col;i+)btnsi.setTe*t();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;else if(e.getActionmand()=高級)/如果選擇的是高級菜單項row=16;/設(shè)置雷區(qū)是16*32 以下代碼和初級游戲代碼作用一樣,不在注釋了col=32;bon=99;setSize(33*col,33*row+80);a1=new intbon;a = new introw+2col+2;b=bon;this.remove(p2);timer.stop(

42、);b1.setTe*t(99);b2.setTe*t(0);b3.setTe*t();btns=new uttonrow*col; p2=new JPanel();p2.setLayout(new GridLayout(row,col,0,0);for(int i=0;irow*col;i+)btnsi=new utton( );btnsi.setMargin(new Insets(0,0,0,0);btnsi.setFont(new Font(null,Font.BOLD,25);btnsi.addActionListener(this);btnsi.addMouseListener(ne

43、w 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.setTe*t();btnsi.setEnabled(true);for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;if(e.getSource()=btn)/如果點擊了開場按鈕timer.start();/計時器開場計時b=bon;b3.setTe*t();

44、/設(shè)置標簽b3的容為空/System.out.println(bon);/清空for(int i=0;irow*col;i+)btnsi.setTe*t();/設(shè)置所有的雷區(qū)的雷按鈕的容為空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)生隨機數(shù),隨機數(shù)的作用用于布雷時隨機的指定雷所在的位置,for(int i=0;ibon;i+) int p=1;int m=(int)(Math.random()*row*col);/產(chǎn)生

45、一個0-雷按鈕數(shù)的整數(shù)while(p=1) int l=1; int j;for( j=0;ji&l=1;j+)/遍歷數(shù)組,查看m值是否已經(jīng)產(chǎn)生過了,如果數(shù)組a1中已經(jīng)有m值,重新產(chǎn)生m值,如果沒有產(chǎn)生m值,則將m值賦值 if(a1j=m) m=(int)(Math.random()*row*col); l=0; if(j=i)a1i=m;p=0;b1.setTe*t(bon+);b2.setTe*t(0);/布雷 for(int i=0;ibon;i+) int *=(a1i/col+1); int y=(a1i%col+1);a*y=100;/布雷的位置的值為100 for(int i=0

46、;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,就說明這個位置的雷按鈕不是地雷,是平安的,但是平安的按鈕上通常是要顯示該按鈕附近有幾個雷的 for(int l=j-1;l=600)/如果該值大于600,則定時器停頓timer.stop();elset+;/如果t小于600,t在原來根底上加1b2.setTe*t(t+);/然后將時間設(shè)置到b2標簽上作為標簽的容for(int i=0;icol*row;i+) if(btnsi.getTe*t()!=雷)/如果雷區(qū)按鈕的值不是雷 int *=i/col+1; int y=i%col+1;/根據(jù)按鈕i值計算被點擊的按鈕對應的a數(shù)組中元素的位置 if(e.getSource()=btnsi&a*y=100)/如果監(jiān)聽到點擊的是雷區(qū)按鈕,且對應位置的a數(shù)組中元素值為100,則說明點擊到了地雷,也就是觸雷了 btnsi.setTe*t(雷);/設(shè)置地雷按鈕的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論