基于java的掃雷游戲的設計與實現(xiàn).doc
《基于java的掃雷游戲的設計與實現(xiàn).doc》由會員分享,可在線閱讀,更多相關《基于java的掃雷游戲的設計與實現(xiàn).doc(128頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 JAVA程序設計A課程設計題 目 基于JAVA的掃雷游戲的設計與實現(xiàn) 院 (系) 信息工程學院 專 業(yè) 班 級 計算機科學與技術(2)班 學 生 姓 名 學 號 設 計 地 點 教(13)軟件實驗室 指 導 教 師 起止時間: 2014年 6月9日至2014年 6月13日Java程序設計A課程設計任務分工及成績院(系):信息工程學院 教研室:軟件教研室課程設計題目基于JAVA的掃雷游戲的設計與實現(xiàn) 課 程 設計內(nèi)容用JAVA實現(xiàn)掃雷游戲,了解掃雷游戲的基本結構,和理解掃雷的算法,并努力對算法進行改進,調(diào)試過程中修復程序中的bugg,使該掃雷游戲盡可能完善。設計內(nèi)容: 1、掃雷游戲分為初級、中
2、級和高級三個級別。單擊游戲菜單可以選擇“初級”、“中級”和“高級”。2、選擇級別后將出現(xiàn)相應級別的掃雷區(qū)域,這時用戶使用鼠標左鍵單擊“開始”便啟動計時器。3、用戶要揭開某個方塊,可左鍵單擊它。若所揭方塊下有雷,用戶便輸了這一局,若所揭方塊下無雷,則顯示一個數(shù)字,該數(shù)字代表方塊的周圍的8個方塊中共有多少顆雷。4、如果用戶認為某個方塊下埋著雷,單擊右鍵可以在方塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記。用戶每標記出一個掃雷標記(無論用戶的標記是否正確),程序將顯示的剩余雷數(shù)減少一個。小組成員及任務分配姓名學號承擔任務成績算法實現(xiàn) 游戲布局 設置監(jiān)聽器 基于JAVA的掃雷游戲的設計與實現(xiàn)摘
3、要 隨著時代的發(fā)展,電腦進入了普通老百姓的生活,越來越多的人使用電腦 辦公、娛樂、上網(wǎng),游戲行業(yè)發(fā)展一日千里,該行業(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、擊屏幕上的笑臉可以重新開始游戲。當鼠標左鍵單擊到地雷時提 示游戲失敗。 報告首先介紹了進行該游戲課程設計的目的,然后是任務描述和設 計的相關要求, 最后是最重要的需求分析和設計方案。重點介紹了在游戲過程中 各事件的處理,其中又以鼠標事件和清除未靠近地雷區(qū)方塊這兩方面最為最要, 鼠標事件是利用鼠標所發(fā)出的信息了解用戶的意圖,進而做出相對應的動作。清 除未靠近地雷區(qū)的方塊較為復雜。關鍵詞:掃雷游戲,算法設計,事件,JAVA目 錄1 概 述11.1選題的目的及意義11.2程序設計任務與要求12需求分析22.1 掃雷游戲的需求分析22.2 掃雷游戲的基本功能操作22.3 功能要求23 詳細設計43.1
5、 系統(tǒng)總體設計43.1.1 算法思想43.1.2 設計思想43.1.3 功能分析53.2系統(tǒng)詳細設計53.2.1類的設計53.2.2 模塊的劃分及調(diào)用關系64系統(tǒng)測試與實現(xiàn)74.1 程序測試結果74.1.1 游戲玩家通過右擊鼠標來進行掃雷,并顯示“雷”74.1.2 游戲玩家因觸到雷而導致游戲結束84.1.3 游戲玩家掃雷成功84.1.4 游戲玩家可選擇游戲難度9總 結10參考文獻11附 錄121概 述1.1選題的目的及意義本次課程設計的主要目的是為了通過具體的程序來加深對Java語言的掌握,提高自己的編程水平。選擇的題目來自Java課程設計(第二版)中的掃雷游戲,這是一個綜合性的題目,可以對J
6、ava中的各項功能有更好的理解和使用,同時也為以后的工作打下一定的基礎。1.2程序設計任務與要求掃雷游戲是一個很有趣的游戲。本章的課程設計使用Java語言編寫一個與其類似的掃雷游戲。具體要求如下:(1) 掃雷游戲分為初級、中級和高級三個級別。單擊游戲菜單可以選擇“初級”、“中級”和“高級”。(2) 選擇級別后將出現(xiàn)相應級別的掃雷區(qū)域,這是用戶使用鼠標左鍵單擊雷區(qū)中任何一個方塊便啟動計時器。(3) 用戶要揭開某個方塊,可單擊它。若所揭方塊下有淚,用戶便輸了這一局,若所揭方塊下五雷,則顯示一個數(shù)字,該數(shù)字代表方塊的周圍的8個方塊中共有多少顆雷。(4) 如果用戶認為某個方塊下埋著雷,單擊右鍵可以在方
7、塊上標識一個用戶認為是雷的圖標,即給出一個掃雷標記雷。用戶每標記出一個掃雷標記(無論用戶的標記是否正確),程序將顯示的剩余雷數(shù)減少一個。(5) 掃雷勝利后,游戲中的標簽會顯示“你贏了!”(6)如果在掃雷過程中一不小心碰到了雷,游戲會顯示“你輸了,這個游戲不適合你!”。2需求分析2.1 掃雷游戲的需求分析隨著社會的不斷進步,人們的壓力也不斷的提高,在游戲層出不窮的時刻,掃雷游戲任然受到不少人的青睞,其本身的性質(zhì),決定了人們對它的喜愛的程度,不需要特殊的技巧,不需要不斷的升級,還不需要太多的時間進行熟悉,簡簡單單卻趣味無窮。2.2 掃雷游戲的基本功能操作本程序需實現(xiàn)的主要功能有:(1)用戶可以自定
8、義級別,并確定雷的個數(shù)。(2)具有計時功能,即顯示用戶完成掃雷所花費的時間。(3)點擊開始進行掃雷。(4)用戶識別雷右擊可標記“雷”。2.3 功能要求(1)程序的總體功能如圖2.1所示。 圖2.1 總體功能圖2(2)程序總體流程如圖2.2所示。圖2.2 總體流程圖3 詳細設計3.1 系統(tǒng)總體設計3.1.1 算法思想(1)計算按鈕周圍雷數(shù)。(2)隨機分布。掃雷游戲要求在M行N列的網(wǎng)格游戲區(qū)隨即的不上bon個雷,且bon的取值應小于M和N的乘積。這可以在一張M*N的網(wǎng)格上通過均勻分布的隨即算法視線。其中bon的網(wǎng)格是雷區(qū),剩下的網(wǎng)格是非雷區(qū)。游戲的目標是盡可能快地找到所有的雷區(qū),而不踩到地雷。Ja
9、va提供了視線隨即算法的類Math,通過Math類的random()方法這可以很方便的實現(xiàn)隨即布雷的功能。3.1.2 設計思想(1)掃雷棋盤的布局設計系統(tǒng)的整體布局為:CardLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括開始,選擇級別,標記, 按鈕的功能是重新開始新的游戲。(2)雷區(qū)的設計ScanLei1類是繼承了JFrame實現(xiàn)了ActionListener接口,該類里聲明了組鍵,并進行布局,go方法通過設置是否顯示窗體,主方法main()實例化窗體對象,out()方法是ScanLei1類中的重要方法之一,也就是掃雷的算法。 actionPerformed(ActionEv
10、ent e)就是單擊按鈕觸發(fā)的事件,如果是初級按鈕觸發(fā),分配初級雷區(qū)按鈕布局。如果是中級按鈕觸發(fā),分配中級雷區(qū)按鈕布局。如果是高級按鈕觸發(fā),分配高級雷區(qū)按扭布局。如果是開始按鈕觸發(fā),開始計數(shù),并隨機分配雷,并計算沒有雷的按鈕周圍有雷的數(shù)目。如果按鈕按鍵觸發(fā),調(diào)用ScanLei1類中的out()方法進行掃雷。NormoreMouseEvent()繼承了鼠標適配器,當右擊按鈕后,根據(jù)該按鈕上的圖標來判斷該按鈕是否被右擊過,如果有圖標,將圖標刪除,并雷的個數(shù)加一。如果該按鈕沒有被右擊過,在該按鈕中添加圖標,并將雷的個數(shù)減一。雷區(qū)設計流程圖如圖3.3所示。圖3.3 雷區(qū)設計流程圖3.1.3 功能分析用
11、戶可以玩掃雷游戲并能自定義級別(初等,中等,高等);具有計時功能,即顯示用戶完成掃雷任務所花費的時間。3.2系統(tǒng)詳細設計3.2.1類的設計(1)initMineArea(int,int,int,int)方法可根據(jù)參數(shù)提供的數(shù)據(jù)設置雷區(qū)的寬度、高度以及雷區(qū)的級別。(2)actionPerformed(ActionEvent)是MineArea類實現(xiàn)的ActionListener接口中的方法。當用戶單擊blockView中的某個方塊時,actionPerformed(ActionEvent)方法負責執(zhí)行有關算法,例如,當用鼠標左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(
12、ActionEvent)方法將使用戶輸?shù)舯揪郑粼摲綁K下無雷,actionPerformed(ActionEvent)方法將顯示blockView對象中的標簽,該標簽上是一個數(shù)字,該數(shù)字代表當前方塊的周圍的8個方塊中共有多少顆雷。(3)show()方法是一個遞歸方法。actionPerformed(ActionEvent)方法執(zhí)行時將調(diào)用show方法進行掃雷。(4)mousePressed(MouseEvent)方法是MineArea類實現(xiàn)的MouseListener接口中的方法,當用戶按下鼠標有件事mousePressed(MouseEvent)方法負責讓方塊上顯示一個探雷標記。(5)inq
13、uireWin()方法用來判斷用戶是否掃雷成功,如果成功該方法負責讓record對話框可見。所謂掃雷成功是指不僅找到了全部的累而且用時最少。3.2.2 模塊的劃分及調(diào)用關系圖3.4 關系圖4系統(tǒng)測試與實現(xiàn)4.1 程序測試結果4.1.1 游戲玩家通過右擊鼠標來進行掃雷,并顯示“雷”圖4.1掃雷圖4.1.2 游戲玩家因觸到雷而導致游戲結束圖4.2 掃雷失敗圖4.1.3 游戲玩家掃雷成功圖4.3掃雷成功圖4.1.4 游戲玩家可選擇游戲難度圖4.4游戲幫助圖總 結這個掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過程中也遇到很多問題,有些問題比較簡單但就不知道錯在哪里,有些大問題
14、之道在哪就是不知道怎么辦才好,后來經(jīng)過自己的不斷調(diào)試,這個掃雷游戲終于大功告成。經(jīng)過編寫這個掃雷游戲,我認識到應該注意細節(jié)問題,雖然是很小的問題,但可以提高自己編程的能力,而且還可以培養(yǎng)自己編程的嚴謹性,同時還可以為以后的編程積累經(jīng)驗。編寫完這個掃雷游戲,我發(fā)現(xiàn)自己有很多的不足,我想如果讓我來單獨來編寫這個游戲,我感覺能編出來的可能性很小,因為這個游戲涉及到好多算法。感觸最深的就是我們真的要扎扎實實的打基礎!并且我感覺到只要我們自己肯下功夫學習,我們也可以做出很好的東西,不需要每次都抄襲別人的,只有自己的才是最珍貴的!參考文獻1 耿祥義Java大學實用教程北京:清華大學出版社,20092 耿祥
15、義Java課程設計北京:清華大學出版社,20083 王鵬Java Swing圖形界面開發(fā)與案例詳解北京:清華大學出版社,20084 丁振凡Java語言實驗教程北京:北京郵電大學出版社,20055 鄭莉Java語言程序設計北京:清華大學出版社,20066.孫全黨 王吳迪 趙楓朝,Java程序設計應用教程,電子工業(yè)出版社,2006.2 7.雷之宇,Java項目開發(fā)實踐網(wǎng)絡篇,中國鐵道出版社,2005.5 8.趙玉陽,Java從入門到精通,清華大學出版社,2006.8 9.李蘢怡,Java編程實例講解,高等教育出版社,2005.11 10.張利國,Java實用教程案例,北京:清華大學出版社,2003
16、.10 附 錄import java.awt.BorderLayout; /導入邊框布局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;
17、/ ActionEvent是一個類,指示發(fā)生了組件定義的動作的語義事件。 import java.awt.event.ActionListener; / ActionListener用于接收操作事件的偵聽器接口。繼承自EventListener。import java.awt.event.MouseAdapter; /導入鼠標監(jiān)聽適配器,負責對鼠標事件進行監(jiān)聽import java.awt.event.MouseEvent; /接口import javax.swing.JButton;/導入按鈕類import javax.swing.JFrame;/導入面板類import javax.swin
18、g.JLabel;/導入標簽類import javax.swing.JMenu; /菜單import javax.swing.JMenuBar; /用來創(chuàng)建水平菜單欄import javax.swing.JMenuItem; /創(chuàng)建帶有設置文本或圖標的 JMenuItem 菜單項import javax.swing.JPanel; /面板import javax.swing.Timer; / 定時器,功能是在指定的時間間隔內(nèi)反復觸發(fā)指定窗口的定時器事件。 public class ScanLei1 extends JFrame implements ActionListener/掃雷類繼承了J
19、Frame實現(xiàn)了ActionListener接口private static final long serialVersionUID = 1L; / serialVersionUID 用來表明類的不同版本間的兼容性private Container contentPane; /內(nèi)容面板,每一個JFrame對應一個內(nèi)容面板,所有的組件應該置于內(nèi)容面板之上private JButton btn; /聲明一個按鈕對象,開始按鈕,對象名為btn,private的意思是把變量或方法聲明成私有的,只有在本類中或本類實例可以訪問,其他類不可以private JButton btns;/聲明一個按鈕數(shù)組 雷區(qū)
20、的每一個雷都是一個按鈕,所有按鈕放置到該數(shù)組中private JLabel b1;/聲明一個標簽對象,該標簽用于放置剩余的雷的個數(shù)private JLabel b2; /聲明一個標簽對象,該標簽用于放置已經(jīng)游戲的時間private JLabel b3; /聲明一個標簽對象,該標簽用于放置游戲的結果private Timer timer;/聲明一個定時器對象private int row=9; /行,用于指定雷區(qū)的行private int col=9; /列 用于指定雷區(qū)的列private int bon=10; /布雷的個數(shù)private int a;/聲明一個int型的二維數(shù)組,二維數(shù)組的中
21、元素,有以下含義,值為0說明該元素所對應的坐標所在的按鈕既不是雷又不是周圍有雷的按鈕,如果是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)/定義掃雷的構造方法,該構造方法有個String類型的參數(shù),參數(shù)名為titlesuper(title);/調(diào)用JFrame的構造方法,將title字符串傳入該構造方法,這樣的話窗體顯示時,標題欄會顯示傳入的title
22、值contentPane=getContentPane();/獲取當前JFrame對象的內(nèi)容面板,注意因為ScanLei1類繼承了JFrame對象,所以ScanLei1的對象也是JFrame對象setSize(300,400);/設置掃雷窗體的大小事300*400像素this.setBounds(400, 100, 400, 500); / setBounds(x,y,width,height); x:組件在容器X軸上的起點 y:組件在容器Y軸上的起點 width:組件的長度 height:組件的高度setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
23、 /設置當點擊窗體右上角的X按鈕時的窗體的行為,這里設置的是當點擊這個按鈕時關閉并退出程序,沒有設置的話,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)建一
24、個菜單欄對象JMenu menu1=new JMenu(游戲);/創(chuàng)建游戲菜單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(
25、mi1); mi2.addActionListener(this);menu1.add(mi2);mi3.addActionListener(this);menu1.add(mi3);/以上幾個操作類似menuBar.add(menu1);/將游戲菜單加入到菜單欄menuBar.add(menu2);/將幫助菜單加入到菜單欄p3.add(menuBar); /將菜單欄加入到p3面板上去b1=new JLabel(bon+);/創(chuàng)建一個標簽,標簽的內(nèi)容是bon的值10a1=new intbon;/創(chuàng)建a1數(shù)組,數(shù)組的長度為10btn =new JButton(開始);/創(chuàng)建開始按鈕btn.add
26、ActionListener(this);/為開始按鈕加入動作事件監(jiān)聽器b2=new JLabel(0);/創(chuàng)建標簽b2,b2的內(nèi)容是0b3=new JLabel();/創(chuàng)建標簽b3,b3暫時內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建一個按鈕數(shù)組,數(shù)組的個數(shù)為row*col,這個程序中就是9*9個,每一個雷的位置就是一個按鈕 p=new JPanel();/創(chuàng)建一個面板p.setLayout(new BorderLayout(); /設置容器的邊框布局,邊框布局的樣式大致是這樣contentPane.add(p); / 將panl放置到內(nèi)容面板上去,為什么將一個面板放到內(nèi)容
27、面板,而不是將組件放到內(nèi)容面板上去呢,你可以看到panl上最多可以直接放置五個p.add(p3,BorderLayout.NORTH);/p3添加到面板的北邊,也就是在北邊放上了菜單欄,結果就如圖了/combo=new JComboBox(new Object初級,中級,高級 );/加監(jiān)聽/*combo.addItemListener(new ItemListener();*/ p1=new JPanel();/創(chuàng)建一個面板/在那個位置/(FlowLayout)p1.getLayout().setAlignment(FlowLayout.RIGHT); /Alignment列隊p1.add(b
28、1);/將標簽b1添加到面板上p1.add(btn);/將開始按鈕添加到面板上p1.add(b2);/將標簽b2添加到面板上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設置為網(wǎng)格布局,該布局的最多可以9行9列,
29、正好可以放置81個雷按鈕,按鈕和按鈕之間的水for(int i=0;irow*col;i+)/為按鈕數(shù)組賦值,此處的作用是創(chuàng)建81個雷按鈕對象btnsi=new JButton();/創(chuàng)建雷按鈕btnsi.setMargin(new Insets(0,0,0,0);/設置雷按鈕與其他組件的間距btnsi.setFont(new Font(null,Font.BOLD,25); /設置字體字形。黑體25pxbtnsi.addActionListener(this);/為雷按鈕添加監(jiān)聽器,監(jiān)聽動作事件btnsi.addMouseListener(new NormoreMouseEvent();/添
30、加鼠標監(jiān)聽器,監(jiān)聽普通鼠標事件p2.add(btnsi);/將雷按鈕添加到面板p2上contentPane.add(p,BorderLayout.NORTH);contentPane.add(p2,BorderLayout.CENTER);/將p2添加到窗體的中間public void go()/創(chuàng)建go方法setVisible(true);/設置是否顯示窗體,設置為true就是顯示當前窗體public static void main(String args)/主方法,作用是實例化窗體對象,調(diào)用go方法將窗體顯示到屏幕上來new ScanLei1(11計科2班掃雷軟件).go();/實例化窗
31、體對象,調(diào)用go方法將窗體顯示到屏幕上來public void out(int a,JButton btns,ActionEvent e,int i,int x,int y) int p=1; if(axy=0)/如果一個按鈕既不是雷周圍又沒有雷 axy=10;/將該按鈕對應的值設置為10 btnsi.setEnabled(false);/且這個按鈕不可用狀態(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()=初級)/如果你單擊的是游戲菜單中初級菜單項row=9;/設置雷的行數(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.setText(10);/設置標簽b1的內(nèi)容為10b2.setText(0);/b2的標簽內(nèi)容為0b3.setText();/b3的標
34、簽內(nèi)容為空btns=new JButtonrow*col;/創(chuàng)建雷區(qū)雷按鈕數(shù)組 p2=new JPanel();/重新創(chuàng)建面板p2p2.setLayout(new GridLayout(row,col,0,0);/設置p2為網(wǎng)格布局,同樣還是9行9列,每一個單元格放一個雷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);/設置雷按鈕上文字的字體為黑體
35、 25pxbtnsi.addActionListener(this);/添加動作事件監(jiān)聽器btnsi.addMouseListener(new NormoreMouseEvent();/添加普通按鈕事件監(jiān)聽器p2.add(btnsi);/將雷按鈕放置到p2面板上contentPane.add(p2,BorderLayout.CENTER);/setSize(297,377);this.pack();/設置窗體的大小為緊緊包容著所有組件for(int i=0;irow*col;i+)btnsi.setText( );/設置所有雷按鈕的內(nèi)容為空格btnsi.setEnabled(true);/設置
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()=中級)row=16;/設置雷區(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.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()=高級)/如果選擇的是高級菜單項row=16;/設置雷區(qū)是16*32 以下代碼和初級游戲代碼作用相同,不在注釋了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)/如果點擊了開始按鈕timer.start();/計時器開始計時b=bon;b3.setText();/設置標簽b3的內(nèi)容為空/System.out.println(bon);/清空for(int i=0;irow*col;i+)btnsi.setText();/設置所有的雷區(qū)的雷按鈕的內(nèi)容為空btnsi.setEnabled(true);/設置所有雷按鈕可用,也就是可以單擊的狀態(tài)for(int i=0;irow+2;i+)for(int j=0;jcol+2;j+)aij=0;/初始化數(shù)組a所有元素為0值/產(chǎn)生隨機數(shù)
42、,隨機數(shù)的作用用于布雷時隨機的指定雷所在的位置,for(int i=0;ibon;i+) int p=1;int m=(int)(Math.random()*row*col);/產(chǎn)生一個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.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,就說明這個位置的雷按鈕不是地雷,是安全的,但是安全的按鈕上通常是要顯示該按鈕附近有幾個雷的 for(int l
44、=j-1;l=600)/如果該值大于600,則定時器停止timer.stop();elset+;/如果t小于600,t在原來基礎上加1b2.setText(t+);/然后將時間設置到b2標簽上作為標簽的內(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值計算被點擊的按鈕對應的a數(shù)組中元素的位置 if(e.getSource()=btnsi&axy=100)/如果監(jiān)聽到點擊的是雷區(qū)按鈕,且對應位置的a數(shù)組中元素值為100,則說明點擊到了地雷,也就是觸雷了
45、 btnsi.setText(雷);/設置地雷按鈕的顯示的內(nèi)容為雷 btnsi.setEnabled(false);/設置按鈕不可用 axy=10;/設置該位置為10 for(int k=0;kcol*row;k+) int m1=k/col+1; int n1=k%col+1; if(am1n1!=10&btnsk.getText()=雷)/將雷區(qū)中所有對應位置a數(shù)組的值不是10,但是已經(jīng)找出的雷的按鈕的值設置為*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: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。