基于java的掃雷游戲設計與實現(xiàn)_第1頁
已閱讀1頁,還剩127頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  JAVA程序設計A課程設計</p><p>  題 目 基于JAVA的掃雷游戲的設計與實現(xiàn) </p><p>  院 (系) 信息工程學院 </p><p>  專 業(yè) 班 級 計算機科學與技術(2)班

2、 </p><p>  學 生 姓 名 </p><p>  學 號 </p><p>  設 計 地 點 教(13)軟件實驗室 </p><p>  指 導 教 師

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

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

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

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

7、<p><b>  目 錄</b></p><p><b>  1 概 述1</b></p><p>  1.1選題的目的及意義1</p><p>  1.2程序設計任務與要求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 詳細設計4</b></p><p>  3.1 系統(tǒng)總體設計4</p><p>  3.1.1 算法思想4

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

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

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

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

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

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

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

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

17、,即顯示用戶完成掃雷所花費的時間。</p><p>  (3)點擊開始進行掃雷。</p><p>  (4)用戶識別雷右擊可標記“雷”。</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 詳細設計</b></p><p>  3.1 系統(tǒng)總體設計</p><p>  3.1.1 算法思想</p><p>  (1)計算按鈕周圍雷數(shù)。&

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

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

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

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

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

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

25、eArea類實現(xiàn)的ActionListener接口中的方法。當用戶單擊blockView中的某個方塊時,actionPerformed(ActionEvent)方法負責執(zhí)行有關算法,例如,當用鼠標左鍵單擊方塊上的按鈕后,若該方塊下有雷,actionPerformed(ActionEvent)方法將使用戶輸?shù)舯揪郑粼摲綁K下無雷,actionPerformed(ActionEvent)方法將顯示blockView對象中的標簽,該標簽上是一

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

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

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

29、到雷而導致游戲結束</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>  總 結</b></p><p>  這個掃雷游戲是完全模擬微軟系統(tǒng)自帶的掃雷游戲,所以難度是很大,必然在編程過程中也遇到很多問題,有些問題比較簡單但就不知道錯在哪里,有些大問題之道在哪就是不知道怎么辦才好,后來經(jīng)過自己的不斷調(diào)試,這個掃雷游戲終于大功告成。</p><p>  經(jīng)過編寫這個掃雷游戲,我認識到應

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

50、;<p>  a = new int[row+2][col+2];//創(chuàng)建數(shù)組a,a是一個二維數(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)建一個面板</p><p>  b=bon;//將bon的值賦值給變量b</p><p>  JMenuBar menuBar=new JMenuBar();//創(chuàng)建一個菜單欄對象</p><p>  JMenu menu1=new JMenu("游戲");//創(chuàng)建游戲菜單

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

53、菜單項</p><p>  JMenuItem mi3 =new JMenuItem("高級");//創(chuàng)建高級菜單項</p><p>  mi1.addActionListener(this);//為初級菜單項加入動作事件監(jiān)聽器,當你單擊鼠標左鍵點初級菜單項時會執(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);//以上幾個操作類似</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)建一個標簽,標簽的內(nèi)

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

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

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

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

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

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

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

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

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

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

66、添加鼠標監(jiān)聽器,監(jiān)聽普通鼠標事件</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);//設置是否顯示窗體,設置為true就是顯示當前窗體</p><p><b>  

68、}</b></p><p>  public static void main(String[] args){//主方法,作用是實例化窗體對象,調(diào)用go方法將窗體顯示到屏幕上來</p><p>  new ScanLei1("11計科2班掃雷軟件").go();//實例化窗體對象,調(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){//如果一個按鈕既不是雷周圍

70、又沒有雷</p><p>  a[x][y]=10;//將該按鈕對應的值設置為10</p><p>  btns[i].setEnabled(false);//且這個按鈕不可用狀態(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){//如果該按鈕上一行前面左右的按鈕相應位置的值既不是雷又沒雷且又不是已經(jīng)</p><p>  btns[n+col*q].setText(a[x-1][l]+"");//那么應該將周圍雷的個數(shù)顯示到按鈕上去</p><p>  a[x-1][l]=10;//設置按鈕對應的位置值

74、是10</p><p>  btns[n+col*q].setEnabled(false);//設置按鈕不可用</p><p><b>  }</b></p><p>  else if(a[x-1][l]==0){//如果這個按鈕上一行前面和左右方向仍然是既不是雷又不是周圍有雷,那么遞歸判斷這個</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)){ //如果該按鈕下一行后面以及左右的按鈕相應位置的值既不是雷又沒雷且又不</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>  //如果這個按鈕下一行后面和左右方向仍然是既不是雷又不是周圍有雷,那么遞歸判斷這個按鈕周圍的其他按鈕是什么情況</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()=="初級"){//如果你單擊的是游戲菜單中初級菜單項</p><p>  row=9;//設置雷的行數(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、);//計時器停止</p><p>  b1.setText("10");//設置標簽b1的內(nèi)容為10</p><p>  b2.setText("0");//b2的標簽內(nèi)容為0</p><p>  b3.setText("");//b3的標簽內(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));//設置p2為網(wǎng)格布局,同樣還是9行9列,每一個單元格放一個雷</p><p>  for(int i=0;i<row

97、*col;i++){</p><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.

98、BOLD,25));//設置雷按鈕上文字的字體為黑體 25px</p><p>  btns[i].addActionListener(this);//添加動作事件監(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();//設置窗體的大小為緊緊包容著所有組件&l

100、t;/p><p>  for(int i=0;i<row*col;i++){</p><p>  btns[i].setText(" ");//設置所有雷按鈕的內(nèi)容為空格</p><p>  btns[i].setEnabled(true);//設置所有雷按鈕為可用狀態(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()=="中級"){</p><p>  row=16;//設置雷區(qū)有16*16個雷 以下代碼作用和選初級時相同,不再注釋了</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()=="高級"){//如果選擇的是高級菜單項</p><p>  row=16;//設置雷區(qū)是16*32 以下代碼和初級游戲代碼作用相同

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){//如果點擊了開始按鈕</p><p>  timer.start();//計時器開始計時</p><p><b>  b=bon;</b></p><p>  b3.setText("");//設置標簽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("");//設置所有的雷區(qū)的雷按鈕的內(nèi)容為空</p><p>  btns[i].setEnabled

121、(true);//設置所有雷按鈕可用,也就是可以單擊的狀態(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)生隨機數(shù),隨機數(shù)的作用用于布雷時隨機的指定雷所在的位置,</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)生一個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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論