一文教你从零开始设计并实现一个Java扫雷游戏
背景:掃雷這款游戲有著很長的歷史,從掃雷被開發(fā)出來到現(xiàn)在進行了無數(shù)次的優(yōu)化,這款游戲變得越來越讓人愛不釋手了,簡單的玩法在加上一個好看的游戲界面,每一處的細(xì)節(jié)都體現(xiàn)了掃雷的魅力。以JAVA語言作為開發(fā)環(huán)境,使用Eclipse設(shè)計并開發(fā)一個類似Windows掃雷的游戲,實現(xiàn)其基本功能。論文首先介紹了課題背景,其次進行了需求分析及可行性分析;然后設(shè)計游戲流程,介紹雷區(qū)中的雷怎么安放和產(chǎn)生雷的隨機算法;最后介紹游戲中可能會觸發(fā)的各種時間,比如鼠標(biāo)點擊時間和清理掉沒有雷的格子,其中鼠標(biāo)事件包括點擊到或沒有點擊到雷觸發(fā)的事件和點擊到重新開始以及菜單觸發(fā)的事件,清理掉沒有雷的格子就需要使用“遞歸”的方法來使該功能可以簡單的實現(xiàn)。
在1964年?有一個叫“方?塊”的游戲,這是掃雷最原始的版本。后來,這個游戲被改成了另一種游戲,叫做“Rlogic”。在這個游戲中,玩家扮演了一名軍隊的軍人,接受了一項艱難的任務(wù):為指揮中心探路。當(dāng)然游戲不會這么簡單,這條路上充滿了地雷,玩家需要小心翼翼的探索出一條沒有地雷的安全的道路,如果被雷炸死游戲就會結(jié)束。一年后,湯姆·安德森(Tom Anderson)在之前游戲的基礎(chǔ)上又編寫了一款新的游戲,這就是掃雷游戲。1979年,?兩名工程師在計算機的操作系統(tǒng)上搭載了這款小游戲,從此以后掃雷游戲開始風(fēng)靡全球。如今,越來越多的人喜愛上了這款簡單易上手的小游戲,這個小游戲可以在任何時間在任何平臺上進行游戲,讓人可以在游戲中享受到樂趣并且還能在一定程度上鍛煉玩家的思維能力。
掃雷這款游戲有著很長的歷史,從掃雷被開發(fā)出來到現(xiàn)在進行了無數(shù)次的優(yōu)化,這款游戲變得越來越讓人愛不釋手了,簡單的玩法在加上一個好看的游戲界面,每一處的細(xì)節(jié)都體現(xiàn)了掃雷的魅力。
項目地址:https://github.com/sunmenglei/smljavaSaoLei
主頁QQ群也有高級編譯器及資料
提交代碼請參考:我是如何使用git把本地代碼上傳到github上的
目錄
1選題目的和意義
1.1本文主要研究的內(nèi)容
2需求分析
2.1可行性分析
2.2掃雷游戲功能描述
2.3掃雷游戲功能需求
2.4掃雷游戲界面需求
2.5掃雷游戲功能模塊
3設(shè)計構(gòu)想
3.1流程規(guī)劃
3.2界面規(guī)劃
3.3算法思想
4游戲的詳細(xì)設(shè)計
4.1游戲初始化
4.2雷區(qū)的布置
4.3游戲中主要模塊的介紹與使用
4.3.1鼠標(biāo)事件
4.4地雷及雷區(qū)表面探測情況
4.5清除未靠近地雷的格子
4.6游戲難度的選擇
4.7菜單欄的功能
4.8游戲的判斷
4.9游戲成功完成
4.10游戲失敗
5.類設(shè)計
5.1MineGame類
5.2Block類
5.3BlockView類
5.4Record類
5.5ShowRecord類
5.6MineArea類
5.7LayMines類
6.游戲?qū)崿F(xiàn)
6.1游戲難度自定義
6.2掃雷
6.3玩家通過右鍵進行掃雷,并顯示小紅旗
6.4玩家因觸碰到雷而導(dǎo)致游戲結(jié)束
6.5玩家掃雷成功
6.6玩家游戲數(shù)據(jù)顯示
6.7程序打包發(fā)布過程
6.8游戲測試結(jié)果
6.9游戲難度自定義測試
7掃雷測試
7.1玩家游戲數(shù)據(jù)顯示測試
7.2游戲數(shù)據(jù)顯示區(qū)測試
7.3遞歸算法測試
結(jié)??? 論
Eclipse是一款非常好用的編譯軟件,它也經(jīng)歷了很長時間的發(fā)展,并且是由許多公司聯(lián)合開發(fā)的免費軟件。2011年5月,公布穩(wěn) 定版4.2;2012年4月公布代號為Ganymeode的4.3版;2013年5月公布代號為Galieleo的4.4版;2013年7月公布代號為Helomios的4.5版;2013年11月公布代號為Indigon的4.6版;2014年3月公布代號為Jiuno的5.1版;2014年7月公布代號為Keplere的5.2版;2015年3月公布代號為Lunam的5.3版;2015年8月公布代號為Marse的5.4版。
Eclipse是目前主流的編寫代碼的軟件,可以支持預(yù)編譯,在寫代碼的同時就能知道是否書寫錯誤,而不用等到運行的時候才發(fā)現(xiàn)。原本這個軟件只能編寫Java語言,但是經(jīng)過多年的開發(fā)設(shè)計出了許多的插件,將這些插件安裝進去以后就可以編寫其他語言了,這也就是他被大部分人所喜愛的原因。正是由于插件的使用,Eclipse變得很靈活,可以通過安裝插件來實現(xiàn)原本沒有的功能,讓軟件更加的便利。
Eclipse一開始是由兩個團隊聯(lián)合設(shè)計開發(fā)出來的,由于該軟件的強大功能使得許多公司紛紛加盟該項目聯(lián)合開發(fā)。而且這個項目是開源的,任何人都能對其進行開發(fā)修改,這讓Eclipse的名氣愈來愈大,后來連甲骨文這種大公司都加入這個項目之中。這種免費的開發(fā)軟件也很受許多公司的喜愛,通過安裝插件可以使用各種語言。
Java語言是一種深受大家喜愛的語言,因為它是面向?qū)ο蟮?#xff0c;所以在理解了這種語言之后就會在代碼的設(shè)計上有更深刻的理解。
如果沒有JDK,你編寫的Java代碼是無法運行的,這是因為我們需要使用他自帶的類庫來幫助我們設(shè)計,由于不同的軟件都可以編寫代碼,語言規(guī)范也就顯得尤為重要,所以在開始編寫代碼之前一定要安裝好JDK。
現(xiàn)在在網(wǎng)上是有著許許多多的JDK版本,其中以Sun公司發(fā)布的最好,其他公司也有開發(fā)并發(fā)布出來。有的在性能上甚至超過了Sun公司的JDK,有的則在在執(zhí)行的效率上高于Sun公司的JDK。但是我們還是選擇使用它的原因是因為它是最穩(wěn)定的JDK,經(jīng)過多年的開發(fā)和完善,是其他JDK所不能相比的。所以我們要熟練的運用它。
1選題目的和意義
在設(shè)計當(dāng)中讓我的知識在實踐中融會貫通并得到提升,并且能發(fā)現(xiàn)許多平常發(fā)現(xiàn)不了的問題,期望能通過本次的設(shè)計讓我的能力再一次提高。這次一定會讓我收獲許多,在今后的工作生涯中能輕松的勝任任何任務(wù)。
1.1本文主要研究的內(nèi)容
掃雷游戲風(fēng)靡全球,受到很多人的喜愛。我研究了這個掃雷游戲之后,發(fā)現(xiàn)有兩個關(guān)鍵點:
第一點是鼠標(biāo)事件的處理,包括鼠標(biāo)點擊菜單項中按鈕的事件,點擊雷區(qū)中任意一格的事件,點擊界面上按鈕的事件等。
第二點是初始化雷區(qū),包括隨機生成雷的位置,界面的初始化,計算周圍雷數(shù)等。
具體要求如下:
(1)掃雷游戲分為三種難度,分別是初、中、高級,點擊游戲左上角的“游戲”菜單后會出現(xiàn)“初級”、“中級”、“高級”三種選項。除此之外玩家還可以自定義難度。
(2)在玩家選擇難度之后游戲?qū)淖兘缑娲笮?#xff0c;并改變雷的總數(shù)。當(dāng)玩家點開第一個格子時雷區(qū)開始布雷同時計時開始。
(3)若玩家想放棄本局游戲并重新開始的話,可以通過點擊掃雷信息統(tǒng)計區(qū)中的按鈕,來結(jié)束當(dāng)前的游戲并開始新的游戲。
(4)當(dāng)玩家認(rèn)為某個格沒有雷,可以直接用鼠標(biāo)單擊這個格或者把鼠標(biāo)放在該格子上按下空格鍵。如果玩家的判斷是正確的,則會顯示周圍8個格子中地雷的總數(shù),如果玩家判斷錯誤,該格子下藏著雷的話,游戲就好結(jié)束,系統(tǒng)自動彈框提示玩家失敗。
(5)若玩家認(rèn)為某個格下有雷,在該格子上鼠標(biāo)右鍵就可以標(biāo)記一個玩家認(rèn)為該格是雷的圖標(biāo),也就是在格子上標(biāo)記一個小紅旗的圖案。玩家每標(biāo)記一個紅旗(不管玩家的判斷正確與否),界面上的計數(shù)區(qū)都會把雷數(shù)減一。
(6)當(dāng)所有的雷都標(biāo)記正確后,游戲會自動彈框顯示“您真厲害,請輸入您的名字,記錄上榜!”。
(7)若玩家在游戲過程中單擊了有雷的格子,游戲失敗并且記時停止,游戲會將剩余的雷全部顯示出來,自動彈框顯示“你輸了,請繼續(xù)努力!”,之后玩家可以開始一局新的游戲。
(8)如果玩家不清楚游戲玩法,可以點擊菜單欄上的幫助來獲取游戲玩法及游戲竅門。
(9)對于自定義難度,系統(tǒng)會有一個閾值,行數(shù)在9到16之間,列數(shù)在9到30之間,地雷數(shù)在10到99之間。如果玩家設(shè)置的值超過該閾值,系統(tǒng)會自動將超過的數(shù)值變成閾值。
2需求分析
2.1可行性分析
掃雷游戲是一款玩法簡單的小游戲,無論是孩子還是老人,都可以在休息的時候玩上一局從而輕松而有效地舒緩壓力。而且真正的掃雷高手還可以通過競速(在最短的時間內(nèi)完成掃雷)來感受樂趣。
(1)投資可行性:掃雷游戲所占內(nèi)存少,可以搭載在任意平臺,有投資的價值。
(2)財務(wù)可行性:從受益者的角度來看,不需太多的經(jīng)費就能開發(fā)這款掃雷小游戲。?????
(3)組織可行性:制度可行的項目規(guī)劃,做好人員的配給,保持組員間的良好溝通,定期開會討論,確保項目能夠準(zhǔn)時交付。?
(4)?經(jīng)濟可行性:可以給開發(fā)的企業(yè)創(chuàng)造效益,給社會增加工作崗位,并且提高人們的生活質(zhì)量。
(5)?法律可行性:任何的產(chǎn)品都需要確保它沒有觸犯法律才能開始設(shè)計。但是掃雷游戲并不會觸犯任何法律,而且不會和企業(yè)之間發(fā)生沖突。游戲的開發(fā)不會侵犯任何人的利益,也不會違法。???
(6)?技術(shù)可行性:掃雷游戲的功能簡單,只需稍有經(jīng)驗的開發(fā)人員就能輕易開發(fā)出來,所以技術(shù)方面不是太大的問題,主要需要明白掃雷的玩法才能更好的設(shè)計與實現(xiàn)該游戲。
2.2掃雷游戲功能描述
游戲界面可以分為三個模塊:菜單欄,游戲數(shù)據(jù)顯示區(qū)域以及雷區(qū)。菜單欄包括游戲難度的選擇和排行榜的查詢以及游戲幫助。游戲數(shù)據(jù)顯示區(qū)域包括地雷計數(shù)區(qū)、計時區(qū)和重新開始按鈕。雷區(qū)就是玩家的游戲區(qū)域,當(dāng)玩家在游戲過程中用鼠標(biāo)點擊某一模塊,系統(tǒng)會自動作出相應(yīng)的響應(yīng),這就是游戲中的鼠標(biāo)事件。
當(dāng)玩家點開第一個格子時雷區(qū)開始布雷同時計時開始。然后會在該格子上顯示周圍8個格子的雷數(shù)(如果沒有雷則自動點開周圍的格子),玩家就需要通過這些數(shù)字來判斷雷的位置,將是雷的格子標(biāo)記為小紅旗。
若玩家認(rèn)為已標(biāo)記的格子時錯誤的,可以再次右擊該格子來取消標(biāo)記。當(dāng)某一格子被標(biāo)記時,對于該格子的單擊操作是無效的(防止玩家誤點擊導(dǎo)致游戲失敗)。
如果玩家將某一格周圍8個格子中的雷標(biāo)記了出來,雙擊該格子會自動將周圍的格子點擊一遍,這樣可以簡化玩家的操作。
當(dāng)玩家將全部的地雷標(biāo)記出來并且其他的格子點開時,游戲結(jié)束。但是如果玩家不小心點到了地雷就會游戲失敗,系統(tǒng)自動顯示出所有的地雷。如果玩家標(biāo)識的地雷數(shù)量超過了該難度下規(guī)定的雷數(shù),計數(shù)區(qū)會以負(fù)數(shù)顯示超出的雷數(shù)并且游戲不會結(jié)束。
?
從上述掃雷游戲功能描述以及用例圖可以分析出,整個掃雷游戲中,玩家所能進行的操作有:選擇難度、開始游戲、重新開始游戲和記錄查詢等。
2.3掃雷游戲功能需求
本次掃雷設(shè)計需要實現(xiàn)的主要功能有:
? (1)玩家可以選擇合適的游戲難度
點擊游戲界面左上角菜單欄中的“游戲”菜單,會出現(xiàn)出現(xiàn)“初級”、“中級”、“高級”、“自定義”四種選項。在玩家選擇難度之后游戲?qū)淖兘缑娉叽?#xff0c;并改變雷的總數(shù)。前三種雷數(shù)和尺寸都是固定的,無需玩家設(shè)置,而自定義則是玩家自己定義的。
? (2)進行掃雷游戲
游戲界面包括菜單欄,游戲數(shù)據(jù)顯示區(qū)域以及雷區(qū),當(dāng)玩家點擊雷區(qū)中的任意一格的時候游戲開始,雷區(qū)開始隨機布雷,玩家需要在最短的時間內(nèi)找出雷區(qū)中所有的地雷,并加以標(biāo)識。
掃雷的基本操作包括鼠標(biāo)左鍵單擊和右鍵單擊兩種。其中左鍵用來點開玩家認(rèn)為不是雷的格子,右鍵標(biāo)記玩家認(rèn)為是雷的格子。
左鍵單擊:玩家在判斷出該格子下沒有雷時單擊該格子,可以將該格子點開。如果該格子周圍有雷就會顯示周圍雷的數(shù)目(由于周圍最多只有8個格子,所以最多只能顯示8);如果格子上什么也不顯示(也就是為空),系統(tǒng)就會自動調(diào)用遞歸的方法打開附近的格子。如果點到了有地雷的格子,那么游戲結(jié)束,系統(tǒng)顯示所有雷的位置。
右鍵單擊:玩家可以通過使用鼠標(biāo)右鍵單擊來標(biāo)記自己認(rèn)為是雷的格子,通過標(biāo)記可以有效的提高掃雷游戲的效率。再次右擊該格子可以取消標(biāo)記,且格子被標(biāo)記的時候鼠標(biāo)單擊無效(防止玩家誤操作導(dǎo)致游戲失敗)。
? (3)游戲計時
當(dāng)點擊雷區(qū)任意一個格子的時候雷區(qū)開始布雷同時計時開始,計時標(biāo)準(zhǔn)是一秒增加1。如果游戲失敗時,則計時停止。如果玩家開始了新游戲,計時也會重新開始。
? (4)標(biāo)記地雷
當(dāng)玩家認(rèn)為格子下有雷時可以右擊格子來標(biāo)記該格子,被標(biāo)記的格子顯示小紅旗。再次右擊可以取消標(biāo)記,且格子被標(biāo)記的時候鼠標(biāo)單擊無效(防止玩家誤操作導(dǎo)致游戲失敗)。如果玩家標(biāo)識的地雷的數(shù)量超過了該難度下規(guī)定的雷數(shù),計數(shù)區(qū)會以負(fù)數(shù)來顯示超過的雷數(shù)并且游戲不會結(jié)束。
? (5)統(tǒng)計功能
當(dāng)玩家游戲勝利后會彈框提示并可以輸入玩家的名字,確認(rèn)后本次游戲的記錄會被保存。玩家可以點擊菜單欄上的“游戲”菜單,再點擊其中的“掃雷榜”即可查看游戲的最佳記錄。
? (6)退出
點擊關(guān)閉按鈕可以結(jié)束游戲。
2.4掃雷游戲界面需求
(1)游戲菜單
玩家有5項可以選擇,玩家在點擊初級時游戲界面的尺寸會變?yōu)槌跫壍拇笮?#xff0c;雷區(qū)重新初始化,變?yōu)橐还?*9的格子,其中有10顆是地雷;中級一共有16*16個格子,其中有40顆是地雷;高級一共有16*30個格子,其中有99顆是雷。除此之外,玩家還可以自定義難度,在彈框中填寫雷數(shù)與尺寸。
?
玩家通過點擊鼠標(biāo)右鍵來標(biāo)記自己認(rèn)為是雷的格子,通過標(biāo)記可以有效的提高掃雷游戲的效率,再次點擊右鍵可以取消標(biāo)記。
掃雷榜,記錄玩家不同難度的最短時間。
(2)游戲區(qū)域
游戲區(qū)域由掃雷信息統(tǒng)計區(qū)和雷區(qū)組成,其中掃雷信息統(tǒng)計區(qū)又分為計數(shù)區(qū)、計時區(qū)、重新開始按鈕。
雷區(qū)的雷數(shù),每個難度對應(yīng)的雷數(shù)都不同,初級、中級、高級分別對應(yīng)10、40、99個雷。
計數(shù)區(qū)初始顯示的雷數(shù)由難度而定,每次標(biāo)記地雷雷數(shù)均減1,如果玩家標(biāo)記的地雷的數(shù)量超過了該難度下規(guī)定的雷數(shù),計數(shù)區(qū)會以負(fù)數(shù)顯示超過的雷數(shù)。
當(dāng)玩家點開第一個格子雷區(qū)開始布雷同時計時開始,一秒加1,直到游戲勝利或者游戲失敗的時候停止計時。
2.5掃雷游戲功能模塊
游戲在功能上分為6個模塊:
(1) 游戲界面
(2) 布雷
(3) 鼠標(biāo)事件
(4) 地雷判斷
(5) 游戲勝利(結(jié)束)
3設(shè)計構(gòu)想
如今世界上很多人都在使用Windows操作系統(tǒng),所以人們也對系統(tǒng)自帶的小游戲了如指掌。掃雷游戲的玩法簡單,只要玩家進行一定的判斷就可以輕松的游戲,所以玩掃雷的時候可以很輕松的玩。除了游戲本身帶給人們的樂趣以外,游戲的玩法也在鍛煉玩家的思維,如今大部分人都是依賴腦力勞動,這就可以通過在閑暇的時候玩玩掃雷來鍛煉一下自己。所以就可以理解,為什么在各種電子產(chǎn)品上都搭載這個小游戲了。
雖然游戲比較簡單,但是還是需要熟悉一下規(guī)則。
玩家需要在最短的時間內(nèi)找出雷區(qū)中所有的地雷,并加以標(biāo)識,其他沒有雷的格子全部點開后游戲勝利。但是如果點到了地雷則游戲失敗。
游戲的操作很簡單,當(dāng)玩家用鼠標(biāo)左鍵點擊自己認(rèn)為不是地雷的格子會點開該格子,用鼠標(biāo)右鍵點擊格子會標(biāo)記該格子,再次右擊可以取消標(biāo)記。玩家可以通過雷區(qū)中被點開的格子上顯示的數(shù)字來判斷該格子周圍8個格子所隱藏的地雷,例如:點開的格子顯示數(shù)字“2”,則表示該格子周邊的8個格子里隱藏著2顆地雷。
如果點開的格子下沒有雷且周圍8個格子里也沒有雷,則系統(tǒng)會自動點開那8個格子,然后遞歸判斷這些格子周圍有沒有雷。
本次的掃雷游戲設(shè)計,需要編寫7個Java類:MineaGamae.java類、MineAra.java類、Block.jaav類、BlockVaiw.java類、LayMinas.java類、Record.java類和ShowRecrd.java類。?
(1)??MineGame.java
MineGame類是游戲的入口,用來初始化游戲資源,比如界面尺寸和雷數(shù)等。同時也負(fù)責(zé)難度的轉(zhuǎn)換。
?(2)??MineArea.java?
MineArea類是布置雷區(qū)的雷,除了初始化雷區(qū)以外還可以響應(yīng)玩家的鼠標(biāo)操作。
(3)??Block.java?
Block類是一個POJO類,主要記錄了雷區(qū)一個個格子的屬性,比如名字,周圍雷的數(shù)目等等。
?(4)??BlockView.java?
BlockView類用來顯示塊的屬性,并且使用卡片布局來使格子分為了上下兩層,當(dāng)玩家點擊格子后,會使下面的屬性浮現(xiàn)出來。
(5)??LayMines.java?
LayMines類是計算不是雷的格周圍雷個數(shù)的類,以及設(shè)置點選之后的圖片樣式。創(chuàng)建的對象lay是MineArea中最重要的成員。
(6)??Record.java?
Record類是通過IO流將游戲記錄儲存在本地的文件中,主要實現(xiàn)通關(guān)后彈窗提示通關(guān)的窗口,以及記錄成績。
(7)??ShowRecord.java?
ShowRecord類是顯示掃雷記錄的類。
3.1流程規(guī)劃
有三個部分,分別是游戲選擇難度后、玩家第一次點擊格子和為不是地雷的格子自動點開。
游戲選擇難度后,獲取該難度設(shè)定的雷數(shù)與界面尺寸顯示界面,但是還沒有布雷。當(dāng)玩家第一次點開格子的時候系統(tǒng)隨機布雷并啟動定時器,為什么要在點過一次格子之后才布雷呢?這就是要讓玩家第一次不會點到地雷,要不然玩家該多郁悶,這樣才能提高玩家的游戲欲。之后是最重要的一步,就是如何將格子周圍沒有雷的格子自動點開,我們可以使用遞歸的方法來巧妙的判斷并點開周圍的格子。
?
?
3.2界面規(guī)劃
?
說明如下:
①:游戲主界面(Interface)。
②:菜單(Menu)。
③:地雷數(shù)顯示區(qū)(MineNumberArea)
④:重新開始(Restart)。
⑤:掃雷用時顯示區(qū)(TimeArea)。
⑥:地雷區(qū)(MineArea)。
3.3算法思想
(1)隨機布雷
掃雷游戲要求在雷區(qū)隨機布雷,雷數(shù)不能太多,這樣就沒法很好的判斷周圍是否有雷了;但也不能太少,這樣會出現(xiàn)點一下就會點開一大片的空白區(qū)域。使用java自帶的Math.random()方法產(chǎn)生隨機數(shù),經(jīng)過計算后得到將隨機數(shù)轉(zhuǎn)換成一個整數(shù),這個整數(shù)就是雷的位置的角標(biāo)。游戲的目標(biāo)是在將所有的地雷標(biāo)記出來,并將其它不是雷的格子點開。
(2)計算方格周圍雷數(shù)
當(dāng)沒有雷的格子被點擊后,會顯示該格子周圍8個格子里所有的雷數(shù),玩家通過這個數(shù)字就可以判斷出雷的位置,所以周圍雷數(shù)的計算也很重要。
4游戲的詳細(xì)設(shè)計
4.1游戲初始化
玩家點開游戲,此時系統(tǒng)自動加載界面,分別是雷區(qū)、菜單區(qū)、掃雷數(shù)據(jù)顯示區(qū),
游戲界面相對計算機自帶的掃雷游戲比較簡潔,主要由游戲數(shù)據(jù)顯示區(qū)域以及雷區(qū)構(gòu)成。
我們使用ImageIcon對象來存放地雷的圖標(biāo),可以圖標(biāo)大小最好要小一些,否則會在格子上顯示不全。
對地雷區(qū)的初始化是很重要的,我們使用一個循環(huán)即可實現(xiàn)初始化。玩家點開游戲之后可以點擊菜單欄選擇掃雷游戲的難度,不同的難度就代表了不同的地雷總數(shù)和尺寸,自定義的難度也會設(shè)置雷數(shù)和尺寸,設(shè)置的這些數(shù)據(jù)全部存放在幾個變量之中,當(dāng)雷區(qū)要初始化的時候程序會調(diào)用這么變量屬性,然后通過一個循環(huán)來完成初始化。主要代碼如下:
??
而之前所說的循環(huán)初始化其實就是循環(huán)的加載組件,雷區(qū)就是由一個個組件構(gòu)成的,通過循環(huán)將所有的格子都布置到雷區(qū),然后再隨機產(chǎn)生地雷并布置到雷區(qū)上。
組件位置的擺放是按照其在數(shù)組中的位置來擺放的,所有的格子組件都存放在一個二維數(shù)組之中,組件在這個數(shù)組中的下標(biāo)就是他在布局中的位置。
菜單欄是由菜單組件構(gòu)成的,也就是JMenu組件,這個是菜單組件,用來定義未點擊時的菜單樣式,這個組件有可以設(shè)置JMenauItem組件,這是菜單項的意思,是當(dāng)玩家點擊了菜單后展示出來的子菜單欄。
掃雷游戲的計時區(qū)以及計數(shù)區(qū)又是使用另一種組件完成的,叫做JTextField
,這個組件是文本顯示的組件,在設(shè)置了不可編輯的屬性后,該組件在顯示的外觀上會有變化,邊框會變灰一些,意味著該組件不能夠點擊或者輸入。然后使用一個方法隨著時間動態(tài)的在時間區(qū)以一秒為單位增加,計數(shù)區(qū)則會隨著用戶標(biāo)記雷而減一,可以減到負(fù)數(shù)。
在設(shè)置界面的時候還需要進行一些設(shè)置,比如設(shè)置屬性來讓玩家在關(guān)閉游戲窗口時,系統(tǒng)會自動釋放資源,并關(guān)閉窗口。
4.2雷區(qū)的布置
當(dāng)玩家第一次點開格子的時候系統(tǒng)隨機布雷并啟動定時器,但是為什么要在點過一次格子之后才布雷呢?原來這就是要讓玩家第一次不會點到地雷,要不然玩家該多郁悶,這樣才能提高玩家的游戲欲。具體實現(xiàn)如下所示:
判斷地雷區(qū)是否處于可動作狀態(tài):
?
判斷為左鍵且該格子為未探測狀態(tài):
???
布置地雷:
??? ? ? ? ? ? ? ? ? ? ? ? ? ?
判斷地雷應(yīng)該被布置的位置:
?? ? ? ? ? ?? ?
4.3游戲中主要模塊的介紹與使用
4.3.1鼠標(biāo)事件
我們通過點擊鼠標(biāo)左鍵或者鼠標(biāo)右鍵來完成游戲,使用系統(tǒng)自帶的MouseDown和MouseUp事件來響應(yīng)玩家的操作。
函數(shù)原型如下:
組件名稱:
組件名稱:
這兩個原型中的參數(shù),Button參數(shù)值分別表示玩家用鼠標(biāo)的左鍵或者右鍵進行點擊的。其意義如下:
1:左鍵????? 2:右鍵
如果同時按兩個按鍵,那么系統(tǒng)就會傳回3,因為點左鍵是1,點右鍵是2,一起點就是兩個值相加了。
在本次的掃雷設(shè)計中,我們會用鼠標(biāo)的MouseUp事件來響應(yīng)玩家的操作,其中鼠標(biāo)左鍵用來點開玩家認(rèn)為沒有雷的格子,鼠標(biāo)右鍵用來標(biāo)記玩家認(rèn)為下面藏有雷的格子。使用MouseaUp事件而不用MouseaDown事件的原因是,前者是在當(dāng)鼠標(biāo)按鍵抬起是觸發(fā),而后者是當(dāng)按鍵按下就觸發(fā)。假如玩家在點擊某一個格子的時候突然發(fā)現(xiàn)好像點錯了,此時玩家只要繼續(xù)按下鼠標(biāo)右鍵,再抬起的時候就會發(fā)現(xiàn)格子被標(biāo)記成地雷了,現(xiàn)在的游戲一般都有這個功能,這可以有效的提升玩家的游戲體驗。
在人機交互的界面上,鼠標(biāo)的操作是很重要的,但是程序的設(shè)計不合理會使鼠標(biāo)無法發(fā)揮應(yīng)有的功能。在鼠標(biāo)點擊事件中使用MouseUp來響應(yīng)事件在上面也進行了解釋,這樣就可以很巧妙的讓玩家體會到游戲的貼心之處,可以有效的提升玩家的游戲體驗。
當(dāng)鼠標(biāo)左鍵點擊格子時:
當(dāng)鼠標(biāo)右擊標(biāo)識有雷的格子時:
4.4地雷及雷區(qū)表面探測情況
在雷區(qū)的設(shè)計上,我使用循環(huán)加載組件的方法讓雷區(qū)布滿格子,如果玩家點擊了格子就會讓該格子下面隱藏的組件顯示出來
?
?
?
?
?
玩家通過單擊格子來點開格子,右擊格子標(biāo)記地雷。由于使用了兩個數(shù)組記錄地雷的位置以及被點開的信息,所以可以通過兩層嵌套循環(huán)來判斷該格子周圍雷的數(shù)目,而且系統(tǒng)會點開該格子周圍8個格子中沒有雷的格子,這又需要用到遞歸調(diào)用來一直進行這個點開格子并驗證的過程,直到不符合條件為止。利用這種嵌套循環(huán)以及遞歸調(diào)用,都會使一個耗時耗力的問題變得容易解決起來,使得代碼結(jié)構(gòu)也變得清晰明了,并且會提高系統(tǒng)的計算速度。
4.5清除未靠近地雷的格子
開始之前需要介紹并學(xué)習(xí)一下“遞歸”,遞歸的狹義解釋就是一個方法調(diào)用自己本身,通過一個判斷語句決定是否結(jié)束調(diào)用。在代碼的設(shè)計上也是一種非常重要的代碼結(jié)構(gòu),通過這種方法編寫代碼,會使得代碼結(jié)構(gòu)看起來相當(dāng)簡單明了。但是需要注意的是,如果操作不當(dāng)會是系統(tǒng)無限循環(huán)調(diào)用,使得游戲崩潰,所以在編寫代碼時必須使用判斷的語句來控制循環(huán)調(diào)用的結(jié)束,以停止該方法的遞歸調(diào)用。
當(dāng)玩家在進行游戲時點擊了任意一個格子,系統(tǒng)會檢測周圍8個格子下是否藏雷,如果雷都被標(biāo)記或者沒有雷就會被點開并循環(huán)調(diào)用繼續(xù)判斷被點開格子周圍的雷數(shù)。
設(shè)計的時候需要考慮的判斷條件:玩家點擊了某一個格子后判斷該格子下是否藏雷;如果沒有雷則判斷周圍8個格的雷數(shù)并顯示;若雷都被標(biāo)記出來或者本來就沒有雷則點開周圍的格子遞歸判斷被點開格子周圍的雷。
由于遞歸是循環(huán)調(diào)用方法本身,所以需要一個判斷語句來結(jié)束調(diào)用,當(dāng)被點開的格子周圍有雷時在格子上顯示雷數(shù)并結(jié)束遞歸調(diào)用。
遞歸方法雖然很好但也有一些的缺點,除了結(jié)束條件的選取很重要外,如果在掃雷設(shè)計中將雷區(qū)的尺寸設(shè)置過大,而地雷數(shù)卻很少的話會使的循環(huán)調(diào)用變慢。所以在游戲的玩法設(shè)計上也要小心謹(jǐn)慎,不可以胡亂定義,以免造成系統(tǒng)負(fù)擔(dān),使得游戲無法順利進行下去。
代碼部分如下所示
4.6游戲難度的選擇
我設(shè)計的掃雷有在難度的選擇上有三種難度,分別是初、中、高級,這三種難度定義的雷數(shù)和雷區(qū)的尺寸是固定的,假如玩家想要自己定義掃雷的難度可以自己設(shè)置雷數(shù)和尺寸,只要打開“自定義”配置彈窗,在之后的彈框里按提示輸入雷數(shù)和尺寸,行數(shù)最大為24,列數(shù)最大為30,如果玩家設(shè)置的雷數(shù)超過了范圍(比如雷數(shù)大于格子的總數(shù)或小于零),系統(tǒng)會默認(rèn)雷數(shù)為行數(shù)減一與列數(shù)減一的乘積。
4.7菜單欄的功能
初級:設(shè)置格子總數(shù)為9*9,地雷總數(shù)為10顆雷,尺寸為300*380然后重新開始游戲。
中級:設(shè)置格子總數(shù)為16*16,地雷總數(shù)為40顆雷,尺寸為480*580然后重新開始游戲。
高級:設(shè)置格子總數(shù)為16*30,地雷總數(shù)為99顆雷,尺寸為800*500然后重新開始游戲。
自定義:設(shè)置格子總數(shù)為最大24*30,最多雷數(shù)為24*30的難度,然后重新開始游戲。
掃雷榜:?打開并顯示時間最短的掃雷記錄,可以進行更新和重新記分。
4.8游戲的判斷
4.9游戲成功完成
游戲要求玩家在最短的時間內(nèi)完成游戲,當(dāng)玩家將所有的雷標(biāo)記出來并且其它格子都點開以后游戲勝利,系統(tǒng)會彈出提示框告訴玩家“您真厲害,請輸入您的名字,記錄上榜!”,系統(tǒng)會記錄玩家最短完成游戲的時間。
4.10游戲失敗
如果玩家不幸點擊到了有雷的格子,該格子的地雷會引爆其他的地雷,游戲失敗,系統(tǒng)會將剩下的地雷全部顯示出來,并彈框提示“你輸了,請繼續(xù)努力!”,玩家可以選擇彈框上的重新開始游戲選項來開始一局新的游戲。
格子類的對象有一個標(biāo)識該格子是否是雷的屬性,通過該屬性來判斷玩家點到的是不是地雷。在游戲結(jié)束時也是通過該屬性來判斷哪些格子下有雷并顯示出來。
具體代碼如下所示:
5.類設(shè)計
5.1MineGame類
MineGame類主要負(fù)責(zé)開始游戲,菜單的設(shè)計,以及難度的轉(zhuǎn)換。展示該類的UML圖
?
?
?
(1)成員變量
bar 是窗體的菜單欄變量。
fileMenu1 是掃雷游戲的菜單,叫做“游戲”。
fileMenu2 是掃雷的另一個菜單,叫做“幫助”。
初級 是掃雷游戲的難度變量。
中級 是掃雷游戲的難度變量。
高級 是掃雷游戲的難度變量。
掃雷榜 是掃雷的統(tǒng)計信息變量。
mineArea 是MineArea雷的對象,是設(shè)計雷區(qū)的變量。
file 是文件變量,用來讀取掃雷記錄。
hashtable 是用來臨時存放掃雷記錄。
showHeroRecord 是用來顯示掃雷記錄的變量。
?
(2)成員方法
MiwneGaame()通過該方法設(shè)置了游戲整體的位置和布局,并實現(xiàn)菜單欄功能,初始化統(tǒng)計信息。
actionPerformed(ActionEvent e)是響應(yīng)點擊菜單項的方法,通過該方法可以實現(xiàn)選擇不同難度調(diào)整游戲的雷數(shù)和尺寸。玩家點選不同的菜單項會讓該方法執(zhí)行不同的操作。
main()方法是游戲開始的方法,通過new了一個MineGame的對象來實現(xiàn)游戲的開始。
5.2Block類
Block類是一個POJO類,主要記錄了雷區(qū)一個個格子的屬性,比如名字,周圍雷的數(shù)目等等。展示該類的UML圖
?
?
(1)成員變量
Name是記錄格子名字的變量。
isMine是標(biāo)記格子下有無地雷的變量。
isMark是標(biāo)記格子被標(biāo)記狀態(tài)的變量。
mineIcon記錄了塊的圖標(biāo)的變量。
isOpen是標(biāo)記格子的點開狀態(tài)的變量。
arounfdMinqeNmber是記錄格子周圍8個格子中雷的數(shù)量的變量。
(2)成員方法。
Block()無參構(gòu)造方法,以防止創(chuàng)建錯誤參數(shù)的對象。
Block(String name,int aroundMineNumber,ImageIcon mineIcon,boolean isMine,boolean isMark,boolean isOpen)全參構(gòu)造方法,可以為變量賦值。
setNamqe()方法可以設(shè)置塊的名字。
getName()獲取塊的名字。
setAounMineNuber()方法可以設(shè)置塊周圍雷的數(shù)目。
setMineIicon()方法可以設(shè)置塊的圖標(biāo)。
getMineIcon()獲取塊的圖標(biāo)。
setIsMinae()方法可以設(shè)置塊是否是雷。
getAroundMineNumber()獲取塊周圍雷的數(shù)目。
getIsMine()獲取塊是否是雷。
setIsMarek()方法可以設(shè)置塊是否被標(biāo)記。
getIsMark()獲取塊是否被標(biāo)記。
setIsOpen(boolean p)設(shè)置塊是否被挖開。
getIsOpen()獲取塊是否被挖開。
toString()以字符串的格式輸出該對象。
5.3BlockView類
BlockView類繼承了JPanel類,主要布置每一個格子的布局,用來定義每個格子的屬性。顯示該類的UML圖如圖4-6所示。
?
(1)成員變量
blockeNameOrIcona 該變量用來顯示格子的名字和圖標(biāo)屬性。
blockeCoverq 是一個標(biāo)記變量。
card 卡片式布局,顯示第一次添加的組件。
(2)成員方法
??? BlockView()構(gòu)造方法,初始化變量,設(shè)置塊上屬性顯示的位置為居中,并添加組件。
??? giveView()方法,給每一個格子提供視圖,如果該格子下有雷,會調(diào)用方法賦予該格子“地雷”的圖標(biāo),但被覆蓋在下面。如果下面沒有雷,會顯示該格子周圍地雷的數(shù)目,同樣會被覆蓋住。該方法被調(diào)用時顯示雷或者數(shù)字。
??? seeBlouckNamerOrIcon()方法是用來讓塊的屬性顯示出來。
??? seeBlouckCovear()方法是讓cover遮蓋塊的屬性。
??? getBlouckCovear()方法是得到用來遮蓋的按鈕。
5.4Record類
Record類主要實現(xiàn)通關(guān)后彈窗提示通關(guān)的窗口,以及記錄成績。當(dāng)玩家掃雷成功時,該對象提供了保存成績到文件的界面。展示該類的UML圖如圖4-7所示。
?
(1)成員變量
?? time? 用來給游戲計時。
?? grade? 記錄難度的變量。
?? key? 表示一個判斷的變量。
?? message? 記錄成績的數(shù)據(jù)變量。
?? textName? 一個文本顯示組件。
?? label? 一個可輸入文本輸入框組件。
?? 確定,取消? 兩個按鈕組件,一個代表確定,一個代表取消。
?
(2)成員方法
?? Record() 構(gòu)造方法,初始化變量,設(shè)置窗口是否可以調(diào)整大小。
?? setGrade() 方法可以設(shè)置成績。
writeRecord() 方法可以讀寫記錄,如果沒有記錄會先創(chuàng)建一個新的文檔來保存記錄,下次直接修改覆蓋記錄。
?? setTime() 方法是用來設(shè)置時間的。
?? actionPerformed(ActionEvent e) 方法是響應(yīng)鼠標(biāo)的點擊事件的方法,當(dāng)玩家點擊彈窗上的任意位置都會觸發(fā),但是只有點到正確的位置才會執(zhí)行操作。比如點擊確認(rèn),就可以把玩家的游戲記錄存放到本地的文件中。
5.5ShowRecord類
ShowRecord類是顯示掃雷記錄的類。展示該類的UML圖如圖4-8所示。
?
file 記錄成績的文檔。
name 名字。
hashtable 是記錄成績的變量。
show 是一個顯示成績的按鈕組件變量。
Rescore 是一個初始分?jǐn)?shù)的按鈕組件變量。
Label1[] 顯示成績的組件。
Label2[] 顯示成績的組件。
Label3[] 顯示成績的組件。
?
(2)成員方法
ShowRecord() 方法是該類的構(gòu)造方法,初始化成員變量。
readAndShow() 方法會把在文檔中記錄的玩家通關(guān)信息篩選出來(按游戲完成是花費的時間最短為條件篩選),并顯示到彈出的對話框中。
actionPerformed(ActionEvent e)方法是響應(yīng)玩家操作的方法,當(dāng)玩家想要顯示游戲記錄的時候系統(tǒng)會響應(yīng)玩家的要求并調(diào)用顯示成績的方法,在彈框中刷新成績。
5.6MineArea類
MineArea類主要用于雷區(qū)的初始化以及鼠標(biāo)事件的響應(yīng)。展示該類的UML圖如圖4-9所示。
?
reStart 是用來顯示一個重新開始的按鈕。
block 是一個二維數(shù)組,定義了所有雷區(qū)的格子。
blockView 是一個二維數(shù)組,是給每一個格子提供顯示視圖的。
lay 是負(fù)責(zé)定義每一個格子下有雷或者沒有雷。
row, colum 是負(fù)責(zé)記錄雷區(qū)行列數(shù)的變量。
mineCount 是記錄地雷總數(shù)的變量。
markMount 是記錄玩家標(biāo)記的地雷數(shù)的變量。
mark 是ImageIcon類型的變量,用來存放地雷圖標(biāo)。
time 是記錄時間的變量。
grade 是記錄難度的變量,分別有“初級”、“中級”、“高級”三種難度。
pCenter 是JPanel類型的變量,定義布局中部的控件
pNorth 是JPanel類型的變量,分別位于布局的北部的控件。
showTime 是顯示掃雷時間的變量。
showMareedCoint 是顯示玩家標(biāo)記后剩余的雷數(shù)的變量。
record 是一個對話框變量,用來顯示玩家的最好記錄,當(dāng)玩家點擊菜單中的英雄榜時會顯示該對話框。
lose 是游戲失敗時顯示的對話框變量。
spendTime 是一個標(biāo)記變量。
panel 一個輕量級容器變量,嵌套在對話框中。
str 顯示失敗的提示語的一個文本框變量。
reStart1 是一個按鈕對象,位于失敗對話框里,玩家點擊后會觸發(fā)與reStart一樣的操作。
MineArea()方法是該類的構(gòu)造方法,初始化組件和一下對象,設(shè)置字體顏色、邊框顏色等,并調(diào)用初始化雷區(qū)的方法來初始化雷區(qū)。
initMineArea()方法用來設(shè)置雷數(shù)和游戲界面所有格子的數(shù)量,初始化雷區(qū)。
initMine()方法是真正執(zhí)行初始化的方法。
setRow(int row)方法用來設(shè)置行數(shù)。
setColum(int colum)方法用來設(shè)置列數(shù)。
setMineCount(int mineCount)方法用來設(shè)置地雷總數(shù)。
setGrade(int grade)方法用來設(shè)置難度。
actionPerformed(ActionEvent)方法是響應(yīng)鼠標(biāo)點擊格子的事件的方法,當(dāng)點擊的格子下面沒有雷,該方法會顯示該格子周圍雷的數(shù)目,有雷則顯示雷的圖標(biāo)。
show()方法是顯示格子內(nèi)容,并且使用遞歸調(diào)用來顯示周圍格子的內(nèi)容,直到這個格子周圍有雷。
mousePressed(MouseEvent)方法響應(yīng)玩家對格子進行的鼠標(biāo)左鍵單擊事件和鼠標(biāo)右鍵點擊事件。
inquireWin()方法是在玩家在游戲過程中滿足獲勝條件是觸發(fā)的方法,同時會調(diào)用其他方法彈框提示玩家游戲結(jié)束。
5.7LayMines類
LayMines是計算不是雷的格周圍雷個數(shù)的類,以及設(shè)置點選之后的圖片樣式。標(biāo)明該類的UML圖
?
mineIcon 圖片資源變量。
LayMines() 構(gòu)造方法,定義圖片資源。
layMinesForBlock(Block block[][], int mineCount) 方法會判斷是否是第一次點擊格子,如果玩家是第一次點擊格子,開始隨機產(chǎn)生雷,但是雷不會布置到第一次點的格子上。如果不是第一次點擊且該格子沒有雷時會計算周圍8個格子中有雷的數(shù)目并顯示出來。
6.游戲?qū)崿F(xiàn)
6.1游戲難度自定義
?
?
玩家可以自己選擇游戲難度,其中有初級,中級,高級以及自定義四種難度,所對應(yīng)的游戲界面的尺寸也不相同,以及地雷的總數(shù)也不相同,雷數(shù)越多則難度越大,同時玩家可以自定義游戲難度,通過輸入行列數(shù)以及地雷數(shù)設(shè)置游戲界面的大小以及難度。
分別展示了初級、中級、高級以及自定義難度的游戲界面尺寸和雷數(shù)。
6.2掃雷
6.3玩家通過右鍵進行掃雷,并顯示小紅旗
?
玩家在游戲過程中會對某一格周圍是否有雷進行判斷,當(dāng)玩家認(rèn)為格子下有雷時就可以通過使用鼠標(biāo)右鍵點擊該格子,將該格子標(biāo)識為小紅旗如圖5-6所示。
6.4玩家因觸碰到雷而導(dǎo)致游戲結(jié)束
如圖5-7所示,當(dāng)玩家在點開了有雷的格子時,游戲失敗,系統(tǒng)會自動將所有的地雷顯示出來,并且會彈出一個窗口提示玩家:“你輸了,請繼續(xù)努力!”。除此以外還有兩個選項,當(dāng)玩家選擇重新開始按鈕時,游戲界面初始化,雷區(qū)中的雷全部取消,等待玩家第一次點擊格子后開始布雷;如果用戶點的是取消的話,就可以關(guān)掉這個提示的彈框。
6.5玩家掃雷成功
?
如圖5-8所示,當(dāng)所有的地雷用都被玩家用小紅旗標(biāo)識出來,并且非雷的格子也被點開時游戲結(jié)束,計時停止,系統(tǒng)彈框提醒玩家“您真厲害,請輸入您的名字,記錄上榜!”,玩家可以在這個界面輸入自己的名字來保存掃雷成績。
6.6玩家游戲數(shù)據(jù)顯示
?
每當(dāng)玩家成功掃完所有的雷后,系統(tǒng)會自動的記錄本次的成績,保存在本地的txt文檔中,內(nèi)容是三種難度,玩家姓名以及對應(yīng)難度玩家所用的最少游戲時間。當(dāng)玩家點擊查看英雄榜的時候系統(tǒng)默認(rèn)只顯示三種難度和匿名。
?
玩家點擊關(guān)閉時此窗口會關(guān)掉這個彈窗,當(dāng)點擊重新記分時,統(tǒng)計信息會清空,點擊顯示成績就好刷新并將歷史最好的成績顯示出來。界面也會發(fā)生變化,可以顯示出游戲用時。
6.7程序打包發(fā)布過程
至此掃雷游戲已經(jīng)編寫好了,我們可以將這個游戲打包發(fā)布,這就需要利用jar.exe命令來將編寫好的掃雷游戲的class文件打包發(fā)布。
(1)編寫清單文件。首先需要使用“記事本”,根據(jù)要求自己編寫一個清單文件,格式和內(nèi)容要和這里給的樣子一樣,具體內(nèi)容如下:
將清單文件保存到E:\workspace\掃雷\bin\com\zx\mine中,也就是和編寫的掃雷游戲程序生成的字節(jié)碼存放的位置相同,保證這些文件放在一個目錄下。
需要注意的是,清單文件中的所有內(nèi)容均為鍵值對的形式存放,鍵值直接必須空一個空格。
?
①參數(shù)c意味著要讓系統(tǒng)生成一個文件,這個文件叫做JAR。
②參數(shù)f意味著要讓系統(tǒng)產(chǎn)生JAR文件的名字。
③參數(shù)m意味著顯示清單文件的名字。
最后就可以將這個生成的JAR文件復(fù)制到任何一個安裝了Java運行環(huán)境(電腦上的jdk版本不能太低)的電腦上,玩家就可直接用鼠標(biāo)雙擊圖標(biāo)來運行自己編寫的掃雷小游戲了。
6.8游戲測試結(jié)果
6.9游戲難度自定義測試
游戲難度自定義測試用例:
| 預(yù)期結(jié)果 | 選擇不同的難度后可以正確的初始化雷區(qū) |
| 輸入條件 | 分別點擊初級、中級、高級和自定義 |
| 測試結(jié)果 | 點選不同難度后系統(tǒng)會自動改變雷區(qū)大小和地雷數(shù) |
?
? ? ? 本次掃雷游戲設(shè)計將游戲的難度設(shè)定為初、中、高以及自定義四種難度,前三種難度對應(yīng)的游戲界面的尺寸以及地雷總數(shù)是不同的,難度越大雷數(shù)越多,尺寸也越大,玩家掃雷時就需要更加的動腦思考才能通關(guān)。除了固定的難度以外還可以自定義難度,玩家需要自己輸入尺寸與雷數(shù),系統(tǒng)根據(jù)玩家的要求生產(chǎn)新的游戲,難度可以更加的靈活,這樣可以讓玩家更滿意。
? ? ? ?測試了四種難度的選擇,由圖可以看出難度的選擇功能正常,可以自由變換尺寸和地雷總數(shù)。
7掃雷測試
掃雷勝利測試用例:
| 預(yù)期結(jié)果 | 成功的將所有地雷標(biāo)記出來后,游戲可以立馬結(jié)束且會彈框提示輸入玩家名字 |
| 輸入條件 | 將所有地雷標(biāo)記并將非雷格子點開 |
| 測試結(jié)果 | 游戲結(jié)束并且顯示了要求玩家輸入名字的彈框 |
?
掃雷失敗測試用例:
| 預(yù)期結(jié)果 | 點擊了有雷的格子后游戲可以立馬結(jié)束且彈框提示玩家游戲失敗 |
| 輸入條件 | 點擊有雷的格子 |
| 測試結(jié)果 | 游戲正確的結(jié)束且彈框提示了游戲失敗的提示 |
玩家可以通過左鍵單擊格子點開格子,右鍵單擊標(biāo)識地雷的方式完成游戲。當(dāng)玩家將所有的地雷都標(biāo)識出來且其他的格子都被點開的情況下,游戲勝利。系統(tǒng)會彈框提示玩家成功完成了游戲任務(wù)“您真厲害,請輸入您的名字,記錄上榜!”。玩家可以在彈出的彈框中輸入自己的名字,若不輸入則默認(rèn)為匿名,然后系統(tǒng)會保存玩家的游戲記錄。當(dāng)玩家點擊掃雷榜的時候可以查看自己用時最短的游戲記錄。
?
如圖6-7所示,玩家可以通過左鍵單擊格子點開格子,右鍵單擊標(biāo)識地雷的方式完成游戲。當(dāng)玩家在進行掃雷游戲的時候,不小心點擊了有雷的格子,這時候地雷被引爆了,所有未被標(biāo)記的和已被標(biāo)記的都被引爆,游戲結(jié)束。此時系統(tǒng)會自動將所有的地雷顯示出來,方便玩家查看之前標(biāo)記的正確與否,可以總結(jié)經(jīng)驗。然后系統(tǒng)彈框提示“你輸了,請繼續(xù)努力!”,玩家可以點擊重新開始的按鈕重開游戲,繼續(xù)挑戰(zhàn)掃雷游戲,也可以選擇結(jié)束游戲。
7.1玩家游戲數(shù)據(jù)顯示測試
最佳成績測試用例:
| 預(yù)期結(jié)果 | 點擊“最佳成績”按鈕時會顯示玩家最佳的游戲記錄 |
| 輸入條件 | 打開游戲的掃雷榜,點擊“最佳成績”按鈕 |
| 測試結(jié)果 | 游戲可以正確的顯示玩家的游戲記錄 |
重新記分測試用例:
| 預(yù)期結(jié)果 | 點擊“重新記分”按鈕時會清除玩家以往的游戲記錄 |
| 輸入條件 | 打開游戲的掃雷榜,點擊“重新記分”按鈕 |
| 測試結(jié)果 | 點擊按鈕后游戲記錄消失,再點擊“最佳成績”按鈕只會顯示默認(rèn)的成績 |
如圖6-8和圖6-9所示,玩家在進行游戲時,如果成功的掃完雷,系統(tǒng)會提示并保存游戲記錄。在掃雷榜上玩家可以進行查看。但是當(dāng)玩家反復(fù)通關(guān)后,系統(tǒng)會自動的將用時最短的掃雷記錄顯示出來,所以玩家在查看記錄的時候只能看到最快一次通關(guān)的記錄。
通過圖6-10可以看出,當(dāng)玩家點擊了“重新記分”按鈕后,之前游戲記錄都會被清除掉,只會顯示默認(rèn)的數(shù)據(jù):時間為999秒,名字是匿名。
7.2游戲數(shù)據(jù)顯示區(qū)測試
計時區(qū)顯示測試用例:
| 預(yù)期結(jié)果 | 第一次點擊雷區(qū)的格子時,計時區(qū)開始計時,游戲結(jié)束時計時停止,重新開始游戲時,計時歸零 |
| 輸入條件 | 點擊雷區(qū)的任意一格,然后結(jié)束游戲,最后點擊“重新開始”按鈕 |
| 測試結(jié)果 | 當(dāng)點擊雷區(qū)任意一格后計時開始,計時正常。然后點擊有雷的格子結(jié)束游戲發(fā)現(xiàn)計時停止。點擊“重新開始”后計時區(qū)的計時正確歸零 |
當(dāng)點擊雷區(qū)中的任意一格后,計時區(qū)開始正常計時。當(dāng)游戲結(jié)束時計時區(qū)的計時就會停止,最后點擊了“重新開始”后計時區(qū)的計時歸零。
地雷數(shù)顯示區(qū)測試用例:
| 預(yù)期結(jié)果 | 標(biāo)記地雷后計數(shù)區(qū)的數(shù)字會減1,如果標(biāo)記數(shù)超過地雷數(shù),計數(shù)區(qū)會用負(fù)數(shù)顯示 |
| 輸入條件 | 先標(biāo)記一顆地雷,然后將所有的地雷標(biāo)記出來 |
| 測試結(jié)果 | 標(biāo)記一顆地雷后,計數(shù)區(qū)可以正確的減少1個,然后當(dāng)所有的地雷全被標(biāo)記后,如果繼續(xù)標(biāo)記,計數(shù)區(qū)可以正確的以負(fù)數(shù)表示 |
當(dāng)標(biāo)記了一顆地雷后計數(shù)區(qū)中的數(shù)字會相應(yīng)的減少一個,表示有一顆雷被找到了。但是如果標(biāo)記數(shù)超過了地雷的數(shù)目,計數(shù)區(qū)會以負(fù)數(shù)顯示,表示有的地雷標(biāo)記錯了
7.3遞歸算法測試
遞歸調(diào)用測試用例:
| 預(yù)期結(jié)果 | 當(dāng)點擊一個周圍八個格子中都沒有雷的格子時,系統(tǒng)會將這8個格子也點開 |
| 輸入條件 | 點開一個周圍沒有雷的格子 |
| 測試結(jié)果 | 系統(tǒng)正確的將周圍的八個格子點開,如果這些格子中周圍的格子沒有雷的話還會自動點開 |
當(dāng)點擊一個周圍八個格子中都沒有雷的格子時,系統(tǒng)會將周圍的格子點開,被點開的格子也會顯示周圍的地雷數(shù)。如果被點開的格子周圍還是沒有地雷,系統(tǒng)就會遞歸調(diào)用再把周圍的格子點開。
掃雷游戲的代碼編寫完成,且基本功能也實現(xiàn)了,雖然與電腦上自帶的掃雷游戲相比在界面上還是有著一些差距,一些小細(xì)節(jié)也沒有完善,但已經(jīng)讓我很滿意了,我會在以后繼續(xù)完善這些細(xì)節(jié),讓這個掃雷游戲變得愈來愈好玩。在簡單的測試后,該游戲也達(dá)到了我的預(yù)期,所以本次的設(shè)計就到此結(jié)束了。
結(jié)??? 論
雖然這次的掃雷游戲看似簡單,但是其中卻涉及了GUI設(shè)計,需要我自己去學(xué)習(xí)。其中有各種組件的調(diào)用,各種控件的使用等
通過編寫這次的掃雷游戲,我深刻的認(rèn)識到了細(xì)節(jié)問題的重要性,這些問題看似無關(guān)緊要但是如果忽視會養(yǎng)成不好的編程習(xí)慣,所以我們要著眼于細(xì)節(jié),善于去發(fā)現(xiàn)身邊的一些小事情,讓自己的水平不斷提高。而且我的編程能力在不斷的編寫代碼的過程中也有了顯著的提高。很多時候人們都認(rèn)為知識學(xué)過了就行,但是當(dāng)實際去用的時候就會發(fā)現(xiàn)這些知識是多么的陌生。所以我認(rèn)為學(xué)過的知識就要多用,用實際操作來讓知識真正變成自己的。
?
總結(jié)
以上是生活随笔為你收集整理的一文教你从零开始设计并实现一个Java扫雷游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是如何用Jquery实现网页缩小放大的
- 下一篇: Java实现qq截图工具