java毕业设计——基于java+Eclipse的扫雷游戏设计与实现(毕业论文+程序源码)——扫雷游戏
基于java+Eclipse的掃雷游戲設計與實現(畢業論文+程序源碼)
大家好,今天給大家介紹基于java+Eclipse的掃雷游戲設計與實現,文章末尾附有本畢業設計的論文和源碼下載地址哦。
文章目錄:
- 基于java+Eclipse的掃雷游戲設計與實現(畢業論文+程序源碼)
- 1、項目簡介
- 2、資源詳情
- 3、關鍵詞:
- 4、畢設簡介
- 5、資源下載
1、項目簡介
1.本次畢業設計是以JAVA語言作為開發環境,使用Eclipse設計并開發一個類似Windows掃雷的游戲,實現其基本功能。論文首先介紹了課題背景,其次進行了需求分析及可行性分析;然后設計游戲流程,介紹雷區中的雷怎么安放和產生雷的隨機算法;最后介紹游戲中可能會觸發的各種時間,比如鼠標點擊時間和清理掉沒有雷的格子,其中鼠標事件包括點擊到或沒有點擊到雷觸發的事件和點擊到重新開始以及菜單觸發的事件,清理掉沒有雷的格子就需要使用“遞歸”的方法來使該功能可以簡單的實現。
2、資源詳情
項目難度:中等難度
適用場景:相關題目的畢業設計
配套論文字數:25477個字67頁
包含內容:整套源碼+完整畢業論文+任務書+輔導視頻+運行截圖
3、關鍵詞:
掃雷;Eclipse;事件;遞歸4、畢設簡介
提示:以下為畢業論文的簡略介紹,項目源碼及完整畢業論文下載地址見文末。
1 緒論
1.1 課題背景及意義
省略
掃雷游戲深受大家的喜愛,本次的畢業設計也是迎合大家的喜歡,開發一款掃雷小游戲,同時也可以提高自己編程水平。
1.2 開發工具的選用及介紹
Eclipse是目前主流的編寫代碼的軟件,可以支持預編譯,在寫代碼的同時就能知道是否書寫錯誤,而不用等到運行的時候才發現。原本這個軟件只能編寫Java語言,但是經過多年的開發設計出了許多的插件,將這些插件安裝進去以后就可以編寫其他語言了,這也就是他被大部分人所喜愛的原因。正是由于插件的使用,Eclipse變得很靈活,可以通過安裝插件來實現原本沒有的功能,讓軟件更加的便利。
Java語言是一種深受大家喜愛的語言,因為它是面向對象的,所以在理解了這種語言之后就會在代碼的設計上有更深刻的理解。
省略
1.3 選題目的和意義
省略
1.4 本文主要研究的內容
掃雷游戲風靡全球,受到很多人的喜愛。我研究了這個掃雷游戲之后,發現有兩個關鍵點:
第一點是鼠標事件的處理,包括鼠標點擊菜單項中按鈕的事件,點擊雷區中任意一格的事件,點擊界面上按鈕的事件等。
第二點是初始化雷區,包括隨機生成雷的位置,界面的初始化,計算周圍雷數等。
具體要求如下:
(1)掃雷游戲分為三種難度,分別是初、中、高級,點擊游戲左上角的“游戲”菜單后會出現“初級”、“中級”、“高級”三種選項。除此之外玩家還可以自定義難度。
(2)在玩家選擇難度之后游戲將會改變界面大小,并改變雷的總數。當玩家點開第一個格子時雷區開始布雷同時計時開始。
(3)若玩家想放棄本局游戲并重新開始的話,可以通過點擊掃雷信息統計區中的按鈕,來結束當前的游戲并開始新的游戲。
(4)當玩家認為某個格沒有雷,可以直接用鼠標單擊這個格或者把鼠標放在該格子上按下空格鍵。如果玩家的判斷是正確的,則會顯示周圍8個格子中地雷的總數,如果玩家判斷錯誤,該格子下藏著雷的話,游戲就好結束,系統自動彈框提示玩家失敗。
(5)若玩家認為某個格下有雷,在該格子上鼠標右鍵就可以標記一個玩家認為該格是雷的圖標,也就是在格子上標記一個小紅旗的圖案。玩家每標記一個紅旗(不管玩家的判斷正確與否),界面上的計數區都會把雷數減一。
(6)當所有的雷都標記正確后,游戲會自動彈框顯示“您真厲害,請輸入您的名字,記錄上榜!”。
(7)若玩家在游戲過程中單擊了有雷的格子,游戲失敗并且記時停止,游戲會將剩余的雷全部顯示出來,自動彈框顯示“你輸了,請繼續努力!”,之后玩家可以開始一局新的游戲。
(8)如果玩家不清楚游戲玩法,可以點擊菜單欄上的幫助來獲取游戲玩法及游戲竅門。
(9)對于自定義難度,系統會有一個閾值,行數在9到16之間,列數在9到30之間,地雷數在10到99之間。如果玩家設置的值超過該閾值,系統會自動將超過的數值變成閾值。
2 需求分析
2.1 可行性分析
掃雷游戲是一款玩法簡單的小游戲,無論是孩子還是老人,都可以在休息的時候玩上一局從而輕松而有效地舒緩壓力。而且真正的掃雷高手還可以通過競速(在最短的時間內完成掃雷)來感受樂趣。
(1)投資可行性:掃雷游戲所占內存少,可以搭載在任意平臺,有投資的價值。
(2)財務可行性:從受益者的角度來看,不需太多的經費就能開發這款掃雷小游戲。
(3)組織可行性:制度可行的項目規劃,做好人員的配給,保持組員間的良好溝通,定期開會討論,確保項目能夠準時交付。
(4) 經濟可行性:可以給開發的企業創造效益,給社會增加工作崗位,并且提高人們的生活質量。
(5) 法律可行性:任何的產品都需要確保它沒有觸犯法律才能開始設計。但是掃雷游戲并不會觸犯任何法律,而且不會和企業之間發生沖突。游戲的開發不會侵犯任何人的利益,也不會違法。
(6) 技術可行性:掃雷游戲的功能簡單,只需稍有經驗的開發人員就能輕易開發出來,所以技術方面不是太大的問題,主要需要明白掃雷的玩法才能更好的設計與實現該游戲。
2.2 掃雷游戲功能描述
游戲界面可以分為三個模塊:菜單欄,游戲數據顯示區域以及雷區。菜單欄包括游戲難度的選擇和排行榜的查詢以及游戲幫助。游戲數據顯示區域包括地雷計數區、計時區和重新開始按鈕。雷區就是玩家的游戲區域,當玩家在游戲過程中用鼠標點擊某一模塊,系統會自動作出相應的響應,這就是游戲中的鼠標事件。
當玩家點開第一個格子時雷區開始布雷同時計時開始。然后會在該格子上顯示周圍8個格子的雷數(如果沒有雷則自動點開周圍的格子),玩家就需要通過這些數字來判斷雷的位置,將是雷的格子標記為小紅旗。
若玩家認為已標記的格子時錯誤的,可以再次右擊該格子來取消標記。當某一格子被標記時,對于該格子的單擊操作是無效的(防止玩家誤點擊導致游戲失敗)。
如果玩家將某一格周圍8個格子中的雷標記了出來,雙擊該格子會自動將周圍的格子點擊一遍,這樣可以簡化玩家的操作。
當玩家將全部的地雷標記出來并且其他的格子點開時,游戲結束。但是如果玩家不小心點到了地雷就會游戲失敗,系統自動顯示出所有的地雷。如果玩家標識的地雷數量超過了該難度下規定的雷數,計數區會以負數顯示超出的雷數并且游戲不會結束。
2.3 掃雷游戲用例圖
圖2-1 掃雷游戲用例圖
從上述掃雷游戲功能描述以及用例圖可以分析出,整個掃雷游戲中,玩家所能進行的操作有:選擇難度、開始游戲、重新開始游戲和記錄查詢等。
2.4 掃雷游戲功能需求
本次掃雷設計需要實現的主要功能有:
(1)玩家可以選擇合適的游戲難度
點擊游戲界面左上角菜單欄中的“游戲”菜單,會出現出現“初級”、“中級”、“高級”、“自定義”四種選項。在玩家選擇難度之后游戲將會改變界面尺寸,并改變雷的總數。前三種雷數和尺寸都是固定的,無需玩家設置,而自定義則是玩家自己定義的。
(2)進行掃雷游戲
游戲界面包括菜單欄,游戲數據顯示區域以及雷區,當玩家點擊雷區中的任意一格的時候游戲開始,雷區開始隨機布雷,玩家需要在最短的時間內找出雷區中所有的地雷,并加以標識。
掃雷的基本操作包括鼠標左鍵單擊和右鍵單擊兩種。其中左鍵用來點開玩家認為不是雷的格子,右鍵標記玩家認為是雷的格子。
左鍵單擊:玩家在判斷出該格子下沒有雷時單擊該格子,可以將該格子點開。如果該格子周圍有雷就會顯示周圍雷的數目(由于周圍最多只有8個格子,所以最多只能顯示8);如果格子上什么也不顯示(也就是為空),系統就會自動調用遞歸的方法打開附近的格子。如果點到了有地雷的格子,那么游戲結束,系統顯示所有雷的位置。
右鍵單擊:玩家可以通過使用鼠標右鍵單擊來標記自己認為是雷的格子,通過標記可以有效的提高掃雷游戲的效率。再次右擊該格子可以取消標記,且格子被標記的時候鼠標單擊無效(防止玩家誤操作導致游戲失敗)。
(3)游戲計時
當點擊雷區任意一個格子的時候雷區開始布雷同時計時開始,計時標準是一秒增加1。如果游戲失敗時,則計時停止。如果玩家開始了新游戲,計時也會重新開始。
(4)標記地雷
當玩家認為格子下有雷時可以右擊格子來標記該格子,被標記的格子顯示小紅旗。再次右擊可以取消標記,且格子被標記的時候鼠標單擊無效(防止玩家誤操作導致游戲失敗)。如果玩家標識的地雷的數量超過了該難度下規定的雷數,計數區會以負數來顯示超過的雷數并且游戲不會結束。
(5)統計功能
當玩家游戲勝利后會彈框提示并可以輸入玩家的名字,確認后本次游戲的記錄會被保存。玩家可以點擊菜單欄上的“游戲”菜單,再點擊其中的“掃雷榜”即可查看游戲的最佳記錄。
(6)退出
點擊關閉按鈕可以結束游戲。
2.5 掃雷游戲界面需求
(1)游戲菜單
玩家有5項可以選擇,玩家在點擊初級時游戲界面的尺寸會變為初級的大小,雷區重新初始化,變為一共99的格子,其中有10顆是地雷;中級一共有1616個格子,其中有40顆是地雷;高級一共有16*30個格子,其中有99顆是雷。除此之外,玩家還可以自定義難度,在彈框中填寫雷數與尺寸。
玩家通過點擊鼠標右鍵來標記自己認為是雷的格子,通過標記可以有效的提高掃雷游戲的效率,再次點擊右鍵可以取消標記。
掃雷榜,記錄玩家不同難度的最短時間。
(2)游戲區域
游戲區域由掃雷信息統計區和雷區組成,其中掃雷信息統計區又分為計數區、計時區、重新開始按鈕。
雷區的雷數,每個難度對應的雷數都不同,初級、中級、高級分別對應10、40、99個雷。
計數區初始顯示的雷數由難度而定,每次標記地雷雷數均減1,如果玩家標記的地雷的數量超過了該難度下規定的雷數,計數區會以負數顯示超過的雷數。
當玩家點開第一個格子雷區開始布雷同時計時開始,一秒加1,直到游戲勝利或者游戲失敗的時候停止計時。
2.6 掃雷游戲功能模塊
游戲在功能上分為6個模塊:
(1) 游戲界面
(2) 布雷
(3) 鼠標事件
(4) 地雷判斷
(5) 游戲勝利(結束)
(6) 游戲失敗(結束)
3 游戲的概要分析與設計
3.1 設計構想
省略
雖然游戲比較簡單,但是還是需要熟悉一下規則。
玩家需要在最短的時間內找出雷區中所有的地雷,并加以標識,其他沒有雷的格子全部點開后游戲勝利。但是如果點到了地雷則游戲失敗。
游戲的操作很簡單,當玩家用鼠標左鍵點擊自己認為不是地雷的格子會點開該格子,用鼠標右鍵點擊格子會標記該格子,再次右擊可以取消標記。玩家可以通過雷區中被點開的格子上顯示的數字來判斷該格子周圍8個格子所隱藏的地雷,例如:點開的格子顯示數字“2”,則表示該格子周邊的8個格子里隱藏著2顆地雷。
如果點開的格子下沒有雷且周圍8個格子里也沒有雷,則系統會自動點開那8個格子,然后遞歸判斷這些格子周圍有沒有雷。
本次的掃雷游戲設計,需要編寫7個Java類:MineaGamae.java類、MineAra.java類、Block.jaav類、BlockVaiw.java類、LayMinas.java類、Record.java類和ShowRecrd.java類。
(1) MineGame.java
MineGame類是游戲的入口,用來初始化游戲資源,比如界面尺寸和雷數等。同時也負責難度的轉換。
(2) MineArea.java
MineArea類是布置雷區的雷,除了初始化雷區以外還可以響應玩家的鼠標操作。
(3) Block.java
Block類是一個POJO類,主要記錄了雷區一個個格子的屬性,比如名字,周圍雷的數目等等。
(4) BlockView.java
BlockView類用來顯示塊的屬性,并且使用卡片布局來使格子分為了上下兩層,當玩家點擊格子后,會使下面的屬性浮現出來。
(5) LayMines.java
LayMines類是計算不是雷的格周圍雷個數的類,以及設置點選之后的圖片樣式。創建的對象lay是MineArea中最重要的成員。
(6) Record.java
Record類是通過IO流將游戲記錄儲存在本地的文件中,主要實現通關后彈窗提示通關的窗口,以及記錄成績。
(7) ShowRecord.java
ShowRecord類是顯示掃雷記錄的類。
3.2 流程規劃
有三個部分,分別是游戲選擇難度后、玩家第一次點擊格子和為不是地雷的格子自動點開。
游戲選擇難度后,獲取該難度設定的雷數與界面尺寸顯示界面,但是還沒有布雷。當玩家第一次點開格子的時候系統隨機布雷并啟動定時器,為什么要在點過一次格子之后才布雷呢?這就是要讓玩家第一次不會點到地雷,要不然玩家該多郁悶,這樣才能提高玩家的游戲欲。之后是最重要的一步,就是如何將格子周圍沒有雷的格子自動點開,我們可以使用遞歸的方法來巧妙的判斷并點開周圍的格子。
整體規劃如圖3-2所示:
圖3-2 整體規劃圖
3.3 界面規劃
界面規劃如圖3-3所示:
圖3-3 規劃樣圖
說明如下:
①:游戲主界面(Interface)。
②:菜單(Menu)。
③:地雷數顯示區(MineNumberArea)
④:重新開始(Restart)。
⑤:掃雷用時顯示區(TimeArea)。
⑥:地雷區(MineArea)。
3.4 算法思想
(1)隨機布雷
掃雷游戲要求在雷區隨機布雷,雷數不能太多,這樣就沒法很好的判斷周圍是否有雷了;但也不能太少,這樣會出現點一下就會點開一大片的空白區域。使用java自帶的Math.random()方法產生隨機數,經過計算后得到將隨機數轉換成一個整數,這個整數就是雷的位置的角標。游戲的目標是在將所有的地雷標記出來,并將其它不是雷的格子點開。
(2)計算方格周圍雷數
當沒有雷的格子被點擊后,會顯示該格子周圍8個格子里所有的雷數,玩家通過這個數字就可以判斷出雷的位置,所以周圍雷數的計算也很重要。
4 游戲的詳細設計
4.1 游戲初始化
玩家點開游戲,此時系統自動加載界面,分別是雷區、菜單區、掃雷數據顯示區,如圖4-1所示:
圖4-1 游戲初始界面
游戲界面相對計算機自帶的掃雷游戲比較簡潔,主要由游戲數據顯示區域以及雷區構成。
我們使用ImageIcon對象來存放地雷的圖標,可以圖標大小最好要小一些,否則會在格子上顯示不全。
對地雷區的初始化是很重要的,我們使用一個循環即可實現初始化。玩家點開游戲之后可以點擊菜單欄選擇掃雷游戲的難度,不同的難度就代表了不同的地雷總數和尺寸,自定義的難度也會設置雷數和尺寸,設置的這些數據全部存放在幾個變量之中,當雷區要初始化的時候程序會調用這么變量屬性,然后通過一個循環來完成初始化。主要代碼如下:
而之前所說的循環初始化其實就是循環的加載組件,雷區就是由一個個組件構成的,通過循環將所有的格子都布置到雷區,然后再隨機產生地雷并布置到雷區上。
組件位置的擺放是按照其在數組中的位置來擺放的,所有的格子組件都存放在一個二維數組之中,組件在這個數組中的下標就是他在布局中的位置。
菜單欄是由菜單組件構成的,也就是JMenu組件,這個是菜單組件,用來定義未點擊時的菜單樣式,這個組件有可以設置JMenauItem組件,這是菜單項的意思,是當玩家點擊了菜單后展示出來的子菜單欄。
掃雷游戲的計時區以及計數區又是使用另一種組件完成的,叫做JTextField
,這個組件是文本顯示的組件,在設置了不可編輯的屬性后,該組件在顯示的外觀上會有變化,邊框會變灰一些,意味著該組件不能夠點擊或者輸入。然后使用一個方法隨著時間動態的在時間區以一秒為單位增加,計數區則會隨著用戶標記雷而減一,可以減到負數。
在設置界面的時候還需要進行一些設置,比如設置屬性來讓玩家在關閉游戲窗口時,系統會自動釋放資源,并關閉窗口。
4.2 雷區的布置
當玩家第一次點開格子的時候系統隨機布雷并啟動定時器,但是為什么要在點過一次格子之后才布雷呢?原來這就是要讓玩家第一次不會點到地雷,要不然玩家該多郁悶,這樣才能提高玩家的游戲欲。具體實現如下所示:
判斷地雷區是否處于可動作狀態:
判斷為左鍵且該格子為未探測狀態:
布置地雷:
判斷地雷應該被布置的位置:
4.3 游戲中主要模塊的介紹與使用
4.3.1 鼠標事件
我們通過點擊鼠標左鍵或者鼠標右鍵來完成游戲,使用系統自帶的MouseDown和MouseUp事件來響應玩家的操作。
函數原型如下:
組件名稱:
組件名稱:
這兩個原型中的參數,Button參數值分別表示玩家用鼠標的左鍵或者右鍵進行點擊的。其意義如下:
1:左鍵 2:右鍵
如果同時按兩個按鍵,那么系統就會傳回3,因為點左鍵是1,點右鍵是2,一起點就是兩個值相加了。
在本次的掃雷設計中,我們會用鼠標的MouseUp事件來響應玩家的操作,其中鼠標左鍵用來點開玩家認為沒有雷的格子,鼠標右鍵用來標記玩家認為下面藏有雷的格子。使用MouseaUp事件而不用MouseaDown事件的原因是,前者是在當鼠標按鍵抬起是觸發,而后者是當按鍵按下就觸發。假如玩家在點擊某一個格子的時候突然發現好像點錯了,此時玩家只要繼續按下鼠標右鍵,再抬起的時候就會發現格子被標記成地雷了,現在的游戲一般都有這個功能,這可以有效的提升玩家的游戲體驗。
在人機交互的界面上,鼠標的操作是很重要的,但是程序的設計不合理會使鼠標無法發揮應有的功能。在鼠標點擊事件中使用MouseUp來響應事件在上面也進行了解釋,這樣就可以很巧妙的讓玩家體會到游戲的貼心之處,可以有效的提升玩家的游戲體驗。
當鼠標左鍵點擊格子時:
當鼠標右擊標識有雷的格子時:
4.3.2 地雷及雷區表面探測情況
在雷區的設計上,我使用循環加載組件的方法讓雷區布滿格子,如果玩家點擊了格子就會讓該格子下面隱藏的組件顯示出來如圖4-2和圖4-3所示:
圖4-2地雷隨機生成
圖4-3 地雷被標記
玩家通過單擊格子來點開格子,右擊格子標記地雷。由于使用了兩個數組記錄地雷的位置以及被點開的信息,所以可以通過兩層嵌套循環來判斷該格子周圍雷的數目,而且系統會點開該格子周圍8個格子中沒有雷的格子,這又需要用到遞歸調用來一直進行這個點開格子并驗證的過程,直到不符合條件為止。利用這種嵌套循環以及遞歸調用,都會使一個耗時耗力的問題變得容易解決起來,使得代碼結構也變得清晰明了,并且會提高系統的計算速度。
4.3.3 清除未靠近地雷的格子
開始之前需要介紹并學習一下“遞歸”,遞歸的狹義解釋就是一個方法調用自己本身,通過一個判斷語句決定是否結束調用。在代碼的設計上也是一種非常重要的代碼結構,通過這種方法編寫代碼,會使得代碼結構看起來相當簡單明了。但是需要注意的是,如果操作不當會是系統無限循環調用,使得游戲崩潰,所以在編寫代碼時必須使用判斷的語句來控制循環調用的結束,以停止該方法的遞歸調用。
當玩家在進行游戲時點擊了任意一個格子,系統會檢測周圍8個格子下是否藏雷,如果雷都被標記或者沒有雷就會被點開并循環調用繼續判斷被點開格子周圍的雷數。
設計的時候需要考慮的判斷條件:玩家點擊了某一個格子后判斷該格子下是否藏雷;如果沒有雷則判斷周圍8個格的雷數并顯示;若雷都被標記出來或者本來就沒有雷則點開周圍的格子遞歸判斷被點開格子周圍的雷。
由于遞歸是循環調用方法本身,所以需要一個判斷語句來結束調用,當被點開的格子周圍有雷時在格子上顯示雷數并結束遞歸調用。
遞歸方法雖然很好但也有一些的缺點,除了結束條件的選取很重要外,如果在掃雷設計中將雷區的尺寸設置過大,而地雷數卻很少的話會使的循環調用變慢。所以在游戲的玩法設計上也要小心謹慎,不可以胡亂定義,以免造成系統負擔,使得游戲無法順利進行下去。
代碼部分如下所示:
4.3.4 游戲難度的選擇
我設計的掃雷有在難度的選擇上有三種難度,分別是初、中、高級,這三種難度定義的雷數和雷區的尺寸是固定的,假如玩家想要自己定義掃雷的難度可以自己設置雷數和尺寸,只要打開“自定義”配置彈窗,在之后的彈框里按提示輸入雷數和尺寸,行數最大為24,列數最大為30,如果玩家設置的雷數超過了范圍(比如雷數大于格子的總數或小于零),系統會默認雷數為行數減一與列數減一的乘積。
4.3.5 菜單欄的功能
初級:設置格子總數為99,地雷總數為10顆雷,尺寸為300380然后重新開始游戲。
中級:設置格子總數為1616,地雷總數為40顆雷,尺寸為480580然后重新開始游戲。
高級:設置格子總數為1630,地雷總數為99顆雷,尺寸為800500然后重新開始游戲。
自定義:設置格子總數為最大2430,最多雷數為2430的難度,然后重新開始游戲。
掃雷榜: 打開并顯示時間最短的掃雷記錄,可以進行更新和重新記分。
4.4 游戲的判斷
4.4.1 游戲成功完成
游戲要求玩家在最短的時間內完成游戲,當玩家將所有的雷標記出來并且其它格子都點開以后游戲勝利,系統會彈出提示框告訴玩家“您真厲害,請輸入您的名字,記錄上榜!”,系統會記錄玩家最短完成游戲的時間。
4.4.2 游戲失敗
如果玩家不幸點擊到了有雷的格子,該格子的地雷會引爆其他的地雷,游戲失敗,系統會將剩下的地雷全部顯示出來,并彈框提示“你輸了,請繼續努力!”,玩家可以選擇彈框上的重新開始游戲選項來開始一局新的游戲。
格子類的對象有一個標識該格子是否是雷的屬性,通過該屬性來判斷玩家點到的是不是地雷。在游戲結束時也是通過該屬性來判斷哪些格子下有雷并顯示出來。
具體代碼如下所示:
4.5 類設計
4.5.1 MineGame類
MineGame類主要負責開始游戲,菜單的設計,以及難度的轉換。展示該類的UML圖如圖4-4所示。
圖4-4 MineGame類的類圖
(1)成員變量
bar 是窗體的菜單欄變量。
fileMenu1 是掃雷游戲的菜單,叫做“游戲”。
fileMenu2 是掃雷的另一個菜單,叫做“幫助”。
初級 是掃雷游戲的難度變量。
中級 是掃雷游戲的難度變量。
高級 是掃雷游戲的難度變量。
掃雷榜 是掃雷的統計信息變量。
mineArea 是MineArea雷的對象,是設計雷區的變量。
file 是文件變量,用來讀取掃雷記錄。
hashtable 是用來臨時存放掃雷記錄。
showHeroRecord 是用來顯示掃雷記錄的變量。
(2)成員方法
MiwneGaame()通過該方法設置了游戲整體的位置和布局,并實現菜單欄功能,初始化統計信息。
actionPerformed(ActionEvent e)是響應點擊菜單項的方法,通過該方法可以實現選擇不同難度調整游戲的雷數和尺寸。玩家點選不同的菜單項會讓該方法執行不同的操作。
main()方法是游戲開始的方法,通過new了一個MineGame的對象來實現游戲的開始。
4.5.2 Block類
Block類是一個POJO類,主要記錄了雷區一個個格子的屬性,比如名字,周圍雷的數目等等。展示該類的UML圖如圖4-5所示。
圖4-5 Block類的類圖
(1)成員變量
Name是記錄格子名字的變量。
isMine是標記格子下有無地雷的變量。
isMark是標記格子被標記狀態的變量。
mineIcon記錄了塊的圖標的變量。
isOpen是標記格子的點開狀態的變量。
arounfdMinqeNmber是記錄格子周圍8個格子中雷的數量的變量。
(2)成員方法。
Block()無參構造方法,以防止創建錯誤參數的對象。
Block(String name,int aroundMineNumber,ImageIcon mineIcon,boolean isMine,boolean isMark,boolean isOpen)全參構造方法,可以為變量賦值。
setNamqe()方法可以設置塊的名字。
getName()獲取塊的名字。
setAounMineNuber()方法可以設置塊周圍雷的數目。
setMineIicon()方法可以設置塊的圖標。
getMineIcon()獲取塊的圖標。
setIsMinae()方法可以設置塊是否是雷。
getAroundMineNumber()獲取塊周圍雷的數目。
getIsMine()獲取塊是否是雷。
setIsMarek()方法可以設置塊是否被標記。
getIsMark()獲取塊是否被標記。
setIsOpen(boolean p)設置塊是否被挖開。
getIsOpen()獲取塊是否被挖開。
toString()以字符串的格式輸出該對象。
4.5.3 BlockView類
BlockView類繼承了JPanel類,主要布置每一個格子的布局,用來定義每個格子的屬性。顯示該類的UML圖如圖4-6所示。
圖4-6 BlockView類的類圖
(1)成員變量
blockeNameOrIcona 該變量用來顯示格子的名字和圖標屬性。
blockeCoverq 是一個標記變量。
card 卡片式布局,顯示第一次添加的組件。
(2)成員方法
BlockView()構造方法,初始化變量,設置塊上屬性顯示的位置為居中,并添加組件。
giveView()方法,給每一個格子提供視圖,如果該格子下有雷,會調用方法賦予該格子“地雷”的圖標,但被覆蓋在下面。如果下面沒有雷,會顯示該格子周圍地雷的數目,同樣會被覆蓋住。該方法被調用時顯示雷或者數字。
seeBlouckNamerOrIcon()方法是用來讓塊的屬性顯示出來。
seeBlouckCovear()方法是讓cover遮蓋塊的屬性。
getBlouckCovear()方法是得到用來遮蓋的按鈕。
4.5.4 Record類
Record類主要實現通關后彈窗提示通關的窗口,以及記錄成績。當玩家掃雷成功時,該對象提供了保存成績到文件的界面。展示該類的UML圖如圖4-7所示。
圖4-7 Record類的類圖
(1)成員變量
time 用來給游戲計時。
grade 記錄難度的變量。
key 表示一個判斷的變量。
message 記錄成績的數據變量。
textName 一個文本顯示組件。
label 一個可輸入文本輸入框組件。
確定,取消 兩個按鈕組件,一個代表確定,一個代表取消。
(2)成員方法
Record() 構造方法,初始化變量,設置窗口是否可以調整大小。
setGrade() 方法可以設置成績。
writeRecord() 方法可以讀寫記錄,如果沒有記錄會先創建一個新的文檔來保存記錄,下次直接修改覆蓋記錄。
setTime() 方法是用來設置時間的。
actionPerformed(ActionEvent e) 方法是響應鼠標的點擊事件的方法,當玩家點擊彈窗上的任意位置都會觸發,但是只有點到正確的位置才會執行操作。比如點擊確認,就可以把玩家的游戲記錄存放到本地的文件中。
4.5.5 ShowRecord類
ShowRecord類是顯示掃雷記錄的類。展示該類的UML圖如圖4-8所示。
圖4-8 ShowRecord類的類圖
(1)成員變量
file 記錄成績的文檔。
name 名字。
hashtable 是記錄成績的變量。
show 是一個顯示成績的按鈕組件變量。
Rescore 是一個初始分數的按鈕組件變量。
Label1[] 顯示成績的組件。
Label2[] 顯示成績的組件。
Label3[] 顯示成績的組件。
(2)成員方法
ShowRecord() 方法是該類的構造方法,初始化成員變量。
readAndShow() 方法會把在文檔中記錄的玩家通關信息篩選出來(按游戲完成是花費的時間最短為條件篩選),并顯示到彈出的對話框中。
actionPerformed(ActionEvent e)方法是響應玩家操作的方法,當玩家想要顯示游戲記錄的時候系統會響應玩家的要求并調用顯示成績的方法,在彈框中刷新成績。
4.5.6 MineArea類
MineArea類主要用于雷區的初始化以及鼠標事件的響應。展示該類的UML圖如圖4-9所示。
圖4-9 MineArea類的類圖
(1)成員變量
reStart 是用來顯示一個重新開始的按鈕。
block 是一個二維數組,定義了所有雷區的格子。
blockView 是一個二維數組,是給每一個格子提供顯示視圖的。
lay 是負責定義每一個格子下有雷或者沒有雷。
row, colum 是負責記錄雷區行列數的變量。
mineCount 是記錄地雷總數的變量。
markMount 是記錄玩家標記的地雷數的變量。
mark 是ImageIcon類型的變量,用來存放地雷圖標。
time 是記錄時間的變量。
grade 是記錄難度的變量,分別有“初級”、“中級”、“高級”三種難度。
pCenter 是JPanel類型的變量,定義布局中部的控件
pNorth 是JPanel類型的變量,分別位于布局的北部的控件。
showTime 是顯示掃雷時間的變量。
showMareedCoint 是顯示玩家標記后剩余的雷數的變量。
record 是一個對話框變量,用來顯示玩家的最好記錄,當玩家點擊菜單中的英雄榜時會顯示該對話框。
lose 是游戲失敗時顯示的對話框變量。
spendTime 是一個標記變量。
panel 一個輕量級容器變量,嵌套在對話框中。
str 顯示失敗的提示語的一個文本框變量。
reStart1 是一個按鈕對象,位于失敗對話框里,玩家點擊后會觸發與reStart一樣的操作。
(2)成員方法
MineArea()方法是該類的構造方法,初始化組件和一下對象,設置字體顏色、邊框顏色等,并調用初始化雷區的方法來初始化雷區。
initMineArea()方法用來設置雷數和游戲界面所有格子的數量,初始化雷區。
initMine()方法是真正執行初始化的方法。
setRow(int row)方法用來設置行數。
setColum(int colum)方法用來設置列數。
setMineCount(int mineCount)方法用來設置地雷總數。
setGrade(int grade)方法用來設置難度。
actionPerformed(ActionEvent)方法是響應鼠標點擊格子的事件的方法,當點擊的格子下面沒有雷,該方法會顯示該格子周圍雷的數目,有雷則顯示雷的圖標。
show()方法是顯示格子內容,并且使用遞歸調用來顯示周圍格子的內容,直到這個格子周圍有雷。
mousePressed(MouseEvent)方法響應玩家對格子進行的鼠標左鍵單擊事件和鼠標右鍵點擊事件。
inquireWin()方法是在玩家在游戲過程中滿足獲勝條件是觸發的方法,同時會調用其他方法彈框提示玩家游戲結束。
4.5.7 LayMines類
LayMines是計算不是雷的格周圍雷個數的類,以及設置點選之后的圖片樣式。標明該類的UML圖如圖4-10所示。
圖4-10 LayMines類的類圖
(1)成員變量
mineIcon 圖片資源變量。
(2)成員方法
LayMines() 構造方法,定義圖片資源。
layMinesForBlock(Block block[][], int mineCount) 方法會判斷是否是第一次點擊格子,如果玩家是第一次點擊格子,開始隨機產生雷,但是雷不會布置到第一次點的格子上。如果不是第一次點擊且該格子沒有雷時會計算周圍8個格子中有雷的數目并顯示出來。
5 游戲實現
5.1 游戲難度自定義
圖5-1 選擇難度以及游戲自定義
圖5-2 初級難度
圖5-3 中級難度
圖5-4 高級難度
圖5-5 自定義難度
如圖5-1所示,玩家可以自己選擇游戲難度,其中有初級,中級,高級以及自定義四種難度,所對應的游戲界面的尺寸也不相同,以及地雷的總數也不相同,雷數越多則難度越大,同時玩家可以自定義游戲難度,通過輸入行列數以及地雷數設置游戲界面的大小以及難度。
如圖5-2、圖5-3、圖5-4、圖5-5所示,分別展示了初級、中級、高級以及自定義難度的游戲界面尺寸和雷數。
5.2 掃雷
5.2.1 玩家通過右鍵進行掃雷,并顯示小紅旗
圖5-6 掃雷圖
玩家在游戲過程中會對某一格周圍是否有雷進行判斷,當玩家認為格子下有雷時就可以通過使用鼠標右鍵點擊該格子,將該格子標識為小紅旗如圖5-6所示。
5.2.2 玩家因觸碰到雷而導致游戲結束
圖5-7 掃雷失敗圖
如圖5-7所示,當玩家在點開了有雷的格子時,游戲失敗,系統會自動將所有的地雷顯示出來,并且會彈出一個窗口提示玩家:“你輸了,請繼續努力!”。除此以外還有兩個選項,當玩家選擇重新開始按鈕時,游戲界面初始化,雷區中的雷全部取消,等待玩家第一次點擊格子后開始布雷;如果用戶點的是取消的話,就可以關掉這個提示的彈框。
5.2.3 玩家掃雷成功
圖5-8 掃雷成功圖
如圖5-8所示,當所有的地雷用都被玩家用小紅旗標識出來,并且非雷的格子也被點開時游戲結束,計時停止,系統彈框提醒玩家“您真厲害,請輸入您的名字,記錄上榜!”,玩家可以在這個界面輸入自己的名字來保存掃雷成績。
5.2.4 玩家游戲數據顯示
圖5-9掃雷榜圖
如圖5-9所示,每當玩家成功掃完所有的雷后,系統會自動的記錄本次的成績,保存在本地的txt文檔中,內容是三種難度,玩家姓名以及對應難度玩家所用的最少游戲時間。當玩家點擊查看英雄榜的時候系統默認只顯示三種難度和匿名。
圖5-10 最佳成績顯示圖
圖5-11 重新記分顯示圖
如圖5-10所示,玩家點擊關閉時此窗口會關掉這個彈窗,當點擊重新記分時,統計信息會清空,點擊顯示成績就好刷新并將歷史最好的成績顯示出來。界面也會發生變化,可以顯示出游戲用時。
5.3 程序打包發布過程
至此掃雷游戲已經編寫好了,我們可以將這個游戲打包發布,這就需要利用jar.exe命令來將編寫好的掃雷游戲的class文件打包發布。
省略
6 游戲測試結果
6.1 游戲難度自定義測試
游戲難度自定義測試用例:
表6-1 自定義難度測試用例表
圖6-1 游戲難度以及自定義測試
圖6-2 初級難度測試
圖6-3中級難度測試
圖6-4 高級難度測試
圖6-5 自定義難度測試
如圖6-1所示,本次掃雷游戲設計將游戲的難度設定為初、中、高以及自定義四種難度,前三種難度對應的游戲界面的尺寸以及地雷總數是不同的,難度越大雷數越多,尺寸也越大,玩家掃雷時就需要更加的動腦思考才能通關。除了固定的難度以外還可以自定義難度,玩家需要自己輸入尺寸與雷數,系統根據玩家的要求生產新的游戲,難度可以更加的靈活,這樣可以讓玩家更滿意。
圖6-2、圖6-3、圖6-4、圖6-5測試了四種難度的選擇,由圖可以看出難度的選擇功能正常,可以自由變換尺寸和地雷總數。
6.2 掃雷測試
掃雷勝利測試用例:
表6-2 掃雷勝利測試用例表
掃雷失敗測試用例:
表6-3 掃雷失敗測試用例表
圖6-6 游戲完成并且掃雷成功測試
如圖6-6所示,玩家可以通過左鍵單擊格子點開格子,右鍵單擊標識地雷的方式完成游戲。當玩家將所有的地雷都標識出來且其他的格子都被點開的情況下,游戲勝利。系統會彈框提示玩家成功完成了游戲任務“您真厲害,請輸入您的名字,記錄上榜!”。玩家可以在彈出的彈框中輸入自己的名字,若不輸入則默認為匿名,然后系統會保存玩家的游戲記錄。當玩家點擊掃雷榜的時候可以查看自己用時最短的游戲記錄。
圖6-7 游戲完成但是掃雷失敗測試
如圖6-7所示,玩家可以通過左鍵單擊格子點開格子,右鍵單擊標識地雷的方式完成游戲。當玩家在進行掃雷游戲的時候,不小心點擊了有雷的格子,這時候地雷被引爆了,所有未被標記的和已被標記的都被引爆,游戲結束。此時系統會自動將所有的地雷顯示出來,方便玩家查看之前標記的正確與否,可以總結經驗。然后系統彈框提示“你輸了,請繼續努力!”,玩家可以點擊重新開始的按鈕重開游戲,繼續挑戰掃雷游戲,也可以選擇結束游戲。
6.3 玩家游戲數據顯示測試
最佳成績測試用例:
表6-4 最佳成績測試用例表
重新記分測試用例:
表6-5 重新記分測試用例表
圖6-8 掃雷榜測試
圖6-9 最佳成績測試
圖6-10 重新記分測試
如圖6-8和圖6-9所示,玩家在進行游戲時,如果成功的掃完雷,系統會提示并保存游戲記錄。在掃雷榜上玩家可以進行查看。但是當玩家反復通關后,系統會自動的將用時最短的掃雷記錄顯示出來,所以玩家在查看記錄的時候只能看到最快一次通關的記錄。
通過圖6-10可以看出,當玩家點擊了“重新記分”按鈕后,之前游戲記錄都會被清除掉,只會顯示默認的數據:時間為999秒,名字是匿名。
6.4 游戲數據顯示區測試
計時區顯示測試用例:
表6-6 計時區顯示測試用例表
圖6-11 開始計時測試
圖6-12 計時停止測試
圖6-13 重新計時測試
如圖6-11,圖6-12,圖6-13所示,當點擊雷區中的任意一格后,計時區開始正常計時。當游戲結束時計時區的計時就會停止,最后點擊了“重新開始”后計時區的計時歸零。
地雷數顯示區測試用例:
表6-7 地雷數顯示區測試用例表
圖6-14 計數區測試
圖6-15 計數區負數顯示測試
如圖6-14,圖6-15所示,當標記了一顆地雷后計數區中的數字會相應的減少一個,表示有一顆雷被找到了。但是如果標記數超過了地雷的數目,計數區會以負數顯示,表示有的地雷標記錯了
。
6.5 遞歸算法測試
遞歸調用測試用例:
表6-8 遞歸調用測試用例表
圖6-16 遞歸算法測試
如圖6-16所示,當點擊一個周圍八個格子中都沒有雷的格子時,系統會將周圍的格子點開,被點開的格子也會顯示周圍的地雷數。如果被點開的格子周圍還是沒有地雷,系統就會遞歸調用再把周圍的格子點開。
掃雷游戲的代碼編寫完成,且基本功能也實現了,雖然與電腦上自帶的掃雷游戲相比在界面上還是有著一些差距,一些小細節也沒有完善,但已經讓我很滿意了,我會在以后繼續完善這些細節,讓這個掃雷游戲變得愈來愈好玩。在簡單的測試后,該游戲也達到了我的預期,所以本次的設計就到此結束了。
結 論
省略
參考文獻
[1] 耿祥義.Java大學實用教程[M].北京:清華大學出版社,2009.
[2] 馮鋒,王運堅.Visual Basic 程序設計基礎教程[M].西安:電子工業出版社,1999。
[3] 王鵬.JavaSwing圖形界面開發與案例詳解[M].北京:清華大學出版社,2008。
[4] 李懷明.Visual Basic 6.0 中文版 參考詳解[M].北京:清華大學出版社,1999。
[5] 丁振凡.Java語言實驗教程[M].北京:北京郵電大學出版社,2005。
[6] 鄭莉.Java語言程序設計[M].北京:清華大學出版社,2006。
[7] 伍俊良.VB課程設計與系統開發案例[M].北京:清華大學出版社,2002。
[8] 孫全黨,王吳迪,趙楓朝.Java程序設計應用教程[M].北京:電子工業出版社,2006。
[9] 雷之宇.Java項目開發實踐-網絡篇[M].北京:中國鐵道出版社,2005。
[10] 趙玉陽.Java從入門到精通[M].北京:清華大學出版社,2006。
[11] 何斌,劉醒.Visual Basic 6.0 應用指南[M].成都:四川大學出版社,1998。
[12] 畢廣吉.Java程序設計實例教程[M].北京:冶金工業出版社,2007年。
[13] 李善茂.Visual Basic 6.0 高級編程技巧[M].西安:電子工業出版社,1999。
[14] 王保羅.Java面向對象程序設計[M].北京:清華大學出版社,2003年.人民郵電出版社,2004
[15] 劉騰紅,孫細明.信息系統分析與設計[M].北京:科學出版社,2003年。
[16] 林邦杰,徹底研究java[M].北京:電子工業出版社,2002年。
[17] 劉京華. Java Web整合開發王者歸來[M].北京:清華大學出版社,2010。
[18] 唐任仲.工程應用軟件開發技術[M].北京:化學工業出版社,1999。
[19] 譚浩強.Visual Basic 6.0 中文版 提高與應用[M].西安:電子工業出版社,1999。
[20] (美)阿諾德,Ken Arnold,等. Java程序設計語言[M].北京:人民郵電出版社,2006.
[21] Bruce Eckel. Thinking in Java[M]. Upper Saddle River, New Jersey, USA: Prentice Hall, 2006.
[22] Holger Eichelberger,Klaus Schhmid.Flexible resource monitoring ofJava programs.[J].The Journal of Systems & Software,2014 Elsevier.
[23] Joshua Bloch. Effective Java[M]. Piscataway, N.J: IEEE Press, 2009.
[24] oug Twilleager,Jeff Kesselman,Athomas Goldberger,Daniel Petersen,Juan Carlos,Soto,Chris Melissinos.Java Technologies for games.[J].Computers in Entertainment(CIE),2004,Vol.2(2),pp.18-18 ACM.
致 謝
省略
外文原文
省略
中文翻譯
省略
5、資源下載
本項目源碼及完整論文如下,有需要的朋友可以點擊進行下載。如果鏈接失效可點擊下方卡片掃碼自助下載。
| 本項目源碼 | 基于java+Eclipse的掃雷游戲設計與實現(源碼+文檔)_java_Eclipse_掃雷游戲.zip |
總結
以上是生活随笔為你收集整理的java毕业设计——基于java+Eclipse的扫雷游戏设计与实现(毕业论文+程序源码)——扫雷游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ-3580-SuperMemo(s
- 下一篇: 黑马程序员--IO总结(含2个设计模式)