日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

一文教你从零开始设计并实现一个Java扫雷游戏

發布時間:2023/12/2 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文教你从零开始设计并实现一个Java扫雷游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:掃雷這款游戲有著很長的歷史,從掃雷被開發出來到現在進行了無數次的優化,這款游戲變得越來越讓人愛不釋手了,簡單的玩法在加上一個好看的游戲界面,每一處的細節都體現了掃雷的魅力。以JAVA語言作為開發環境,使用Eclipse設計并開發一個類似Windows掃雷的游戲,實現其基本功能。論文首先介紹了課題背景,其次進行了需求分析及可行性分析;然后設計游戲流程,介紹雷區中的雷怎么安放和產生雷的隨機算法;最后介紹游戲中可能會觸發的各種時間,比如鼠標點擊時間和清理掉沒有雷的格子,其中鼠標事件包括點擊到或沒有點擊到雷觸發的事件和點擊到重新開始以及菜單觸發的事件,清理掉沒有雷的格子就需要使用“遞歸”的方法來使該功能可以簡單的實現。

在1964年?有一個叫“方?塊”的游戲,這是掃雷最原始的版本。后來,這個游戲被改成了另一種游戲,叫做“Rlogic”。在這個游戲中,玩家扮演了一名軍隊的軍人,接受了一項艱難的任務:為指揮中心探路。當然游戲不會這么簡單,這條路上充滿了地雷,玩家需要小心翼翼的探索出一條沒有地雷的安全的道路,如果被雷炸死游戲就會結束。一年后,湯姆·安德森(Tom Anderson)在之前游戲的基礎上又編寫了一款新的游戲,這就是掃雷游戲。1979年,?兩名工程師在計算機的操作系統上搭載了這款小游戲,從此以后掃雷游戲開始風靡全球。如今,越來越多的人喜愛上了這款簡單易上手的小游戲,這個小游戲可以在任何時間在任何平臺上進行游戲,讓人可以在游戲中享受到樂趣并且還能在一定程度上鍛煉玩家的思維能力。

掃雷這款游戲有著很長的歷史,從掃雷被開發出來到現在進行了無數次的優化,這款游戲變得越來越讓人愛不釋手了,簡單的玩法在加上一個好看的游戲界面,每一處的細節都體現了掃雷的魅力。

項目地址:https://github.com/sunmenglei/smljavaSaoLei

主頁QQ群也有高級編譯器及資料

提交代碼請參考:我是如何使用git把本地代碼上傳到github上的

目錄

1選題目的和意義

1.1本文主要研究的內容

2需求分析

2.1可行性分析

2.2掃雷游戲功能描述

2.3掃雷游戲功能需求

2.4掃雷游戲界面需求

2.5掃雷游戲功能模塊

3設計構想

3.1流程規劃

3.2界面規劃

3.3算法思想

4游戲的詳細設計

4.1游戲初始化

4.2雷區的布置

4.3游戲中主要模塊的介紹與使用

4.3.1鼠標事件

4.4地雷及雷區表面探測情況

4.5清除未靠近地雷的格子

4.6游戲難度的選擇

4.7菜單欄的功能

4.8游戲的判斷

4.9游戲成功完成

4.10游戲失敗

5.類設計

5.1MineGame類

5.2Block類

5.3BlockView類

5.4Record類

5.5ShowRecord類

5.6MineArea類

5.7LayMines類

6.游戲實現

6.1游戲難度自定義

6.2掃雷

6.3玩家通過右鍵進行掃雷,并顯示小紅旗

6.4玩家因觸碰到雷而導致游戲結束

6.5玩家掃雷成功

6.6玩家游戲數據顯示

6.7程序打包發布過程

6.8游戲測試結果

6.9游戲難度自定義測試

7掃雷測試

7.1玩家游戲數據顯示測試

7.2游戲數據顯示區測試

7.3遞歸算法測試

結??? 論


Eclipse是一款非常好用的編譯軟件,它也經歷了很長時間的發展,并且是由許多公司聯合開發的免費軟件。2011年5月,公布穩 定版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是目前主流的編寫代碼的軟件,可以支持預編譯,在寫代碼的同時就能知道是否書寫錯誤,而不用等到運行的時候才發現。原本這個軟件只能編寫Java語言,但是經過多年的開發設計出了許多的插件,將這些插件安裝進去以后就可以編寫其他語言了,這也就是他被大部分人所喜愛的原因。正是由于插件的使用,Eclipse變得很靈活,可以通過安裝插件來實現原本沒有的功能,讓軟件更加的便利。

Eclipse一開始是由兩個團隊聯合設計開發出來的,由于該軟件的強大功能使得許多公司紛紛加盟該項目聯合開發。而且這個項目是開源的,任何人都能對其進行開發修改,這讓Eclipse的名氣愈來愈大,后來連甲骨文這種大公司都加入這個項目之中。這種免費的開發軟件也很受許多公司的喜愛,通過安裝插件可以使用各種語言。

Java語言是一種深受大家喜愛的語言,因為它是面向對象的,所以在理解了這種語言之后就會在代碼的設計上有更深刻的理解。

如果沒有JDK,你編寫的Java代碼是無法運行的,這是因為我們需要使用他自帶的類庫來幫助我們設計,由于不同的軟件都可以編寫代碼,語言規范也就顯得尤為重要,所以在開始編寫代碼之前一定要安裝好JDK。

現在在網上是有著許許多多的JDK版本,其中以Sun公司發布的最好,其他公司也有開發并發布出來。有的在性能上甚至超過了Sun公司的JDK,有的則在在執行的效率上高于Sun公司的JDK。但是我們還是選擇使用它的原因是因為它是最穩定的JDK,經過多年的開發和完善,是其他JDK所不能相比的。所以我們要熟練的運用它。

1選題目的和意義

在設計當中讓我的知識在實踐中融會貫通并得到提升,并且能發現許多平常發現不了的問題,期望能通過本次的設計讓我的能力再一次提高。這次一定會讓我收獲許多,在今后的工作生涯中能輕松的勝任任何任務。

1.1本文主要研究的內容

掃雷游戲風靡全球,受到很多人的喜愛。我研究了這個掃雷游戲之后,發現有兩個關鍵點:

第一點是鼠標事件的處理,包括鼠標點擊菜單項中按鈕的事件,點擊雷區中任意一格的事件,點擊界面上按鈕的事件等。

第二點是初始化雷區,包括隨機生成雷的位置,界面的初始化,計算周圍雷數等。

具體要求如下:

(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掃雷游戲功能需求

本次掃雷設計需要實現的主要功能有:

? (1)玩家可以選擇合適的游戲難度

點擊游戲界面左上角菜單欄中的“游戲”菜單,會出現出現“初級”、“中級”、“高級”、“自定義”四種選項。在玩家選擇難度之后游戲將會改變界面尺寸,并改變雷的總數。前三種雷數和尺寸都是固定的,無需玩家設置,而自定義則是玩家自己定義的。

? (2)進行掃雷游戲

游戲界面包括菜單欄,游戲數據顯示區域以及雷區,當玩家點擊雷區中的任意一格的時候游戲開始,雷區開始隨機布雷,玩家需要在最短的時間內找出雷區中所有的地雷,并加以標識。

掃雷的基本操作包括鼠標左鍵單擊和右鍵單擊兩種。其中左鍵用來點開玩家認為不是雷的格子,右鍵標記玩家認為是雷的格子。

左鍵單擊:玩家在判斷出該格子下沒有雷時單擊該格子,可以將該格子點開。如果該格子周圍有雷就會顯示周圍雷的數目(由于周圍最多只有8個格子,所以最多只能顯示8);如果格子上什么也不顯示(也就是為空),系統就會自動調用遞歸的方法打開附近的格子。如果點到了有地雷的格子,那么游戲結束,系統顯示所有雷的位置。

右鍵單擊:玩家可以通過使用鼠標右鍵單擊來標記自己認為是雷的格子,通過標記可以有效的提高掃雷游戲的效率。再次右擊該格子可以取消標記,且格子被標記的時候鼠標單擊無效(防止玩家誤操作導致游戲失敗)。

? (3)游戲計時

當點擊雷區任意一個格子的時候雷區開始布雷同時計時開始,計時標準是一秒增加1。如果游戲失敗時,則計時停止。如果玩家開始了新游戲,計時也會重新開始。

? (4)標記地雷

當玩家認為格子下有雷時可以右擊格子來標記該格子,被標記的格子顯示小紅旗。再次右擊可以取消標記,且格子被標記的時候鼠標單擊無效(防止玩家誤操作導致游戲失敗)。如果玩家標識的地雷的數量超過了該難度下規定的雷數,計數區會以負數來顯示超過的雷數并且游戲不會結束。

? (5)統計功能

當玩家游戲勝利后會彈框提示并可以輸入玩家的名字,確認后本次游戲的記錄會被保存。玩家可以點擊菜單欄上的“游戲”菜單,再點擊其中的“掃雷榜”即可查看游戲的最佳記錄。

? (6)退出

點擊關閉按鈕可以結束游戲。

2.4掃雷游戲界面需求

(1)游戲菜單

玩家有5項可以選擇,玩家在點擊初級時游戲界面的尺寸會變為初級的大小,雷區重新初始化,變為一共9*9的格子,其中有10顆是地雷;中級一共有16*16個格子,其中有40顆是地雷;高級一共有16*30個格子,其中有99顆是雷。除此之外,玩家還可以自定義難度,在彈框中填寫雷數與尺寸。

?

玩家通過點擊鼠標右鍵來標記自己認為是雷的格子,通過標記可以有效的提高掃雷游戲的效率,再次點擊右鍵可以取消標記。

掃雷榜,記錄玩家不同難度的最短時間。

(2)游戲區域

游戲區域由掃雷信息統計區和雷區組成,其中掃雷信息統計區又分為計數區、計時區、重新開始按鈕。

雷區的雷數,每個難度對應的雷數都不同,初級、中級、高級分別對應10、40、99個雷。

計數區初始顯示的雷數由難度而定,每次標記地雷雷數均減1,如果玩家標記的地雷的數量超過了該難度下規定的雷數,計數區會以負數顯示超過的雷數。

當玩家點開第一個格子雷區開始布雷同時計時開始,一秒加1,直到游戲勝利或者游戲失敗的時候停止計時。

2.5掃雷游戲功能模塊

游戲在功能上分為6個模塊:

(1) 游戲界面

(2) 布雷

(3) 鼠標事件

(4) 地雷判斷

(5) 游戲勝利(結束)

3設計構想

如今世界上很多人都在使用Windows操作系統,所以人們也對系統自帶的小游戲了如指掌。掃雷游戲的玩法簡單,只要玩家進行一定的判斷就可以輕松的游戲,所以玩掃雷的時候可以很輕松的玩。除了游戲本身帶給人們的樂趣以外,游戲的玩法也在鍛煉玩家的思維,如今大部分人都是依賴腦力勞動,這就可以通過在閑暇的時候玩玩掃雷來鍛煉一下自己。所以就可以理解,為什么在各種電子產品上都搭載這個小游戲了。

雖然游戲比較簡單,但是還是需要熟悉一下規則。

玩家需要在最短的時間內找出雷區中所有的地雷,并加以標識,其他沒有雷的格子全部點開后游戲勝利。但是如果點到了地雷則游戲失敗。

游戲的操作很簡單,當玩家用鼠標左鍵點擊自己認為不是地雷的格子會點開該格子,用鼠標右鍵點擊格子會標記該格子,再次右擊可以取消標記。玩家可以通過雷區中被點開的格子上顯示的數字來判斷該格子周圍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.1流程規劃

有三個部分,分別是游戲選擇難度后、玩家第一次點擊格子和為不是地雷的格子自動點開。

游戲選擇難度后,獲取該難度設定的雷數與界面尺寸顯示界面,但是還沒有布雷。當玩家第一次點開格子的時候系統隨機布雷并啟動定時器,為什么要在點過一次格子之后才布雷呢?這就是要讓玩家第一次不會點到地雷,要不然玩家該多郁悶,這樣才能提高玩家的游戲欲。之后是最重要的一步,就是如何將格子周圍沒有雷的格子自動點開,我們可以使用遞歸的方法來巧妙的判斷并點開周圍的格子。

?

?

3.2界面規劃

?

說明如下:
①:游戲主界面(Interface)。

②:菜單(Menu)。

③:地雷數顯示區(MineNumberArea)

④:重新開始(Restart)。

⑤:掃雷用時顯示區(TimeArea)。

⑥:地雷區(MineArea)。

3.3算法思想

(1)隨機布雷

掃雷游戲要求在雷區隨機布雷,雷數不能太多,這樣就沒法很好的判斷周圍是否有雷了;但也不能太少,這樣會出現點一下就會點開一大片的空白區域。使用java自帶的Math.random()方法產生隨機數,經過計算后得到將隨機數轉換成一個整數,這個整數就是雷的位置的角標。游戲的目標是在將所有的地雷標記出來,并將其它不是雷的格子點開。

(2)計算方格周圍雷數

當沒有雷的格子被點擊后,會顯示該格子周圍8個格子里所有的雷數,玩家通過這個數字就可以判斷出雷的位置,所以周圍雷數的計算也很重要。

4游戲的詳細設計

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.4地雷及雷區表面探測情況

在雷區的設計上,我使用循環加載組件的方法讓雷區布滿格子,如果玩家點擊了格子就會讓該格子下面隱藏的組件顯示出來

?

?

?

?

?

玩家通過單擊格子來點開格子,右擊格子標記地雷。由于使用了兩個數組記錄地雷的位置以及被點開的信息,所以可以通過兩層嵌套循環來判斷該格子周圍雷的數目,而且系統會點開該格子周圍8個格子中沒有雷的格子,這又需要用到遞歸調用來一直進行這個點開格子并驗證的過程,直到不符合條件為止。利用這種嵌套循環以及遞歸調用,都會使一個耗時耗力的問題變得容易解決起來,使得代碼結構也變得清晰明了,并且會提高系統的計算速度。

4.5清除未靠近地雷的格子

開始之前需要介紹并學習一下“遞歸”,遞歸的狹義解釋就是一個方法調用自己本身,通過一個判斷語句決定是否結束調用。在代碼的設計上也是一種非常重要的代碼結構,通過這種方法編寫代碼,會使得代碼結構看起來相當簡單明了。但是需要注意的是,如果操作不當會是系統無限循環調用,使得游戲崩潰,所以在編寫代碼時必須使用判斷的語句來控制循環調用的結束,以停止該方法的遞歸調用。

當玩家在進行游戲時點擊了任意一個格子,系統會檢測周圍8個格子下是否藏雷,如果雷都被標記或者沒有雷就會被點開并循環調用繼續判斷被點開格子周圍的雷數。

設計的時候需要考慮的判斷條件:玩家點擊了某一個格子后判斷該格子下是否藏雷;如果沒有雷則判斷周圍8個格的雷數并顯示;若雷都被標記出來或者本來就沒有雷則點開周圍的格子遞歸判斷被點開格子周圍的雷。

由于遞歸是循環調用方法本身,所以需要一個判斷語句來結束調用,當被點開的格子周圍有雷時在格子上顯示雷數并結束遞歸調用。

遞歸方法雖然很好但也有一些的缺點,除了結束條件的選取很重要外,如果在掃雷設計中將雷區的尺寸設置過大,而地雷數卻很少的話會使的循環調用變慢。所以在游戲的玩法設計上也要小心謹慎,不可以胡亂定義,以免造成系統負擔,使得游戲無法順利進行下去。

代碼部分如下所示

4.6游戲難度的選擇

我設計的掃雷有在難度的選擇上有三種難度,分別是初、中、高級,這三種難度定義的雷數和雷區的尺寸是固定的,假如玩家想要自己定義掃雷的難度可以自己設置雷數和尺寸,只要打開“自定義”配置彈窗,在之后的彈框里按提示輸入雷數和尺寸,行數最大為24,列數最大為30,如果玩家設置的雷數超過了范圍(比如雷數大于格子的總數或小于零),系統會默認雷數為行數減一與列數減一的乘積。

4.7菜單欄的功能

初級:設置格子總數為9*9,地雷總數為10顆雷,尺寸為300*380然后重新開始游戲。

中級:設置格子總數為16*16,地雷總數為40顆雷,尺寸為480*580然后重新開始游戲。

高級:設置格子總數為16*30,地雷總數為99顆雷,尺寸為800*500然后重新開始游戲。

自定義:設置格子總數為最大24*30,最多雷數為24*30的難度,然后重新開始游戲。

掃雷榜:?打開并顯示時間最短的掃雷記錄,可以進行更新和重新記分。

4.8游戲的判斷

4.9游戲成功完成

游戲要求玩家在最短的時間內完成游戲,當玩家將所有的雷標記出來并且其它格子都點開以后游戲勝利,系統會彈出提示框告訴玩家“您真厲害,請輸入您的名字,記錄上榜!”,系統會記錄玩家最短完成游戲的時間。

4.10游戲失敗

如果玩家不幸點擊到了有雷的格子,該格子的地雷會引爆其他的地雷,游戲失敗,系統會將剩下的地雷全部顯示出來,并彈框提示“你輸了,請繼續努力!”,玩家可以選擇彈框上的重新開始游戲選項來開始一局新的游戲。

格子類的對象有一個標識該格子是否是雷的屬性,通過該屬性來判斷玩家點到的是不是地雷。在游戲結束時也是通過該屬性來判斷哪些格子下有雷并顯示出來。

具體代碼如下所示:

5.類設計

5.1MineGame

MineGame類主要負責開始游戲,菜單的設計,以及難度的轉換。展示該類的UML圖

?

?

?

(1)成員變量

bar 是窗體的菜單欄變量。

fileMenu1 是掃雷游戲的菜單,叫做“游戲”。

fileMenu2 是掃雷的另一個菜單,叫做“幫助”。

初級 是掃雷游戲的難度變量。

中級 是掃雷游戲的難度變量。

高級 是掃雷游戲的難度變量。

掃雷榜 是掃雷的統計信息變量。

mineArea 是MineArea雷的對象,是設計雷區的變量。

file 是文件變量,用來讀取掃雷記錄。

hashtable 是用來臨時存放掃雷記錄。

showHeroRecord 是用來顯示掃雷記錄的變量。

?

(2)成員方法

MiwneGaame()通過該方法設置了游戲整體的位置和布局,并實現菜單欄功能,初始化統計信息。

actionPerformed(ActionEvent e)是響應點擊菜單項的方法,通過該方法可以實現選擇不同難度調整游戲的雷數和尺寸。玩家點選不同的菜單項會讓該方法執行不同的操作。

main()方法是游戲開始的方法,通過new了一個MineGame的對象來實現游戲的開始。

5.2Block類

Block類是一個POJO類,主要記錄了雷區一個個格子的屬性,比如名字,周圍雷的數目等等。展示該類的UML圖

?

?

(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()以字符串的格式輸出該對象。

5.3BlockView類

BlockView類繼承了JPanel類,主要布置每一個格子的布局,用來定義每個格子的屬性。顯示該類的UML圖如圖4-6所示。

?

(1)成員變量

blockeNameOrIcona 該變量用來顯示格子的名字和圖標屬性。

blockeCoverq 是一個標記變量。

card 卡片式布局,顯示第一次添加的組件。

(2)成員方法

??? BlockView()構造方法,初始化變量,設置塊上屬性顯示的位置為居中,并添加組件。

??? giveView()方法,給每一個格子提供視圖,如果該格子下有雷,會調用方法賦予該格子“地雷”的圖標,但被覆蓋在下面。如果下面沒有雷,會顯示該格子周圍地雷的數目,同樣會被覆蓋住。該方法被調用時顯示雷或者數字。

??? seeBlouckNamerOrIcon()方法是用來讓塊的屬性顯示出來。

??? seeBlouckCovear()方法是讓cover遮蓋塊的屬性。

??? getBlouckCovear()方法是得到用來遮蓋的按鈕。

5.4Record類

Record類主要實現通關后彈窗提示通關的窗口,以及記錄成績。當玩家掃雷成功時,該對象提供了保存成績到文件的界面。展示該類的UML圖如圖4-7所示。

?

(1)成員變量

?? time? 用來給游戲計時。

?? grade? 記錄難度的變量。

?? key? 表示一個判斷的變量。

?? message? 記錄成績的數據變量。

?? textName? 一個文本顯示組件。

?? label? 一個可輸入文本輸入框組件。

?? 確定,取消? 兩個按鈕組件,一個代表確定,一個代表取消。

?

(2)成員方法

?? Record() 構造方法,初始化變量,設置窗口是否可以調整大小。

?? setGrade() 方法可以設置成績。

writeRecord() 方法可以讀寫記錄,如果沒有記錄會先創建一個新的文檔來保存記錄,下次直接修改覆蓋記錄。

?? setTime() 方法是用來設置時間的。

?? actionPerformed(ActionEvent e) 方法是響應鼠標的點擊事件的方法,當玩家點擊彈窗上的任意位置都會觸發,但是只有點到正確的位置才會執行操作。比如點擊確認,就可以把玩家的游戲記錄存放到本地的文件中。

5.5ShowRecord類

ShowRecord類是顯示掃雷記錄的類。展示該類的UML圖如圖4-8所示。

?

  • 成員變量
  • file 記錄成績的文檔。

    name 名字。

    hashtable 是記錄成績的變量。

    show 是一個顯示成績的按鈕組件變量。

    Rescore 是一個初始分數的按鈕組件變量。

    Label1[] 顯示成績的組件。

    Label2[] 顯示成績的組件。

    Label3[] 顯示成績的組件。

    ?

    (2)成員方法

    ShowRecord() 方法是該類的構造方法,初始化成員變量。

    readAndShow() 方法會把在文檔中記錄的玩家通關信息篩選出來(按游戲完成是花費的時間最短為條件篩選),并顯示到彈出的對話框中。

    actionPerformed(ActionEvent e)方法是響應玩家操作的方法,當玩家想要顯示游戲記錄的時候系統會響應玩家的要求并調用顯示成績的方法,在彈框中刷新成績。

    5.6MineArea類

    MineArea類主要用于雷區的初始化以及鼠標事件的響應。展示該類的UML圖如圖4-9所示。

    ?

  • 成員變量
  • 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一樣的操作。

  • 成員方法
  • MineArea()方法是該類的構造方法,初始化組件和一下對象,設置字體顏色、邊框顏色等,并調用初始化雷區的方法來初始化雷區。

    initMineArea()方法用來設置雷數和游戲界面所有格子的數量,初始化雷區。

    initMine()方法是真正執行初始化的方法。

    setRow(int row)方法用來設置行數。

    setColum(int colum)方法用來設置列數。

    setMineCount(int mineCount)方法用來設置地雷總數。

    setGrade(int grade)方法用來設置難度。

    actionPerformed(ActionEvent)方法是響應鼠標點擊格子的事件的方法,當點擊的格子下面沒有雷,該方法會顯示該格子周圍雷的數目,有雷則顯示雷的圖標。

    show()方法是顯示格子內容,并且使用遞歸調用來顯示周圍格子的內容,直到這個格子周圍有雷。

    mousePressed(MouseEvent)方法響應玩家對格子進行的鼠標左鍵單擊事件和鼠標右鍵點擊事件。

    inquireWin()方法是在玩家在游戲過程中滿足獲勝條件是觸發的方法,同時會調用其他方法彈框提示玩家游戲結束。

    5.7LayMines類

    LayMines是計算不是雷的格周圍雷個數的類,以及設置點選之后的圖片樣式。標明該類的UML圖

    ?

  • 成員變量
  • mineIcon 圖片資源變量。

  • 成員方法
  • LayMines() 構造方法,定義圖片資源。

    layMinesForBlock(Block block[][], int mineCount) 方法會判斷是否是第一次點擊格子,如果玩家是第一次點擊格子,開始隨機產生雷,但是雷不會布置到第一次點的格子上。如果不是第一次點擊且該格子沒有雷時會計算周圍8個格子中有雷的數目并顯示出來。

    6.游戲實現

    6.1游戲難度自定義

    ?

    ?

    玩家可以自己選擇游戲難度,其中有初級,中級,高級以及自定義四種難度,所對應的游戲界面的尺寸也不相同,以及地雷的總數也不相同,雷數越多則難度越大,同時玩家可以自定義游戲難度,通過輸入行列數以及地雷數設置游戲界面的大小以及難度。

    分別展示了初級、中級、高級以及自定義難度的游戲界面尺寸和雷數。

    6.2掃雷

    6.3玩家通過右鍵進行掃雷,并顯示小紅旗

    ?

    玩家在游戲過程中會對某一格周圍是否有雷進行判斷,當玩家認為格子下有雷時就可以通過使用鼠標右鍵點擊該格子,將該格子標識為小紅旗如圖5-6所示。

    6.4玩家因觸碰到雷而導致游戲結束

    如圖5-7所示,當玩家在點開了有雷的格子時,游戲失敗,系統會自動將所有的地雷顯示出來,并且會彈出一個窗口提示玩家:“你輸了,請繼續努力!”。除此以外還有兩個選項,當玩家選擇重新開始按鈕時,游戲界面初始化,雷區中的雷全部取消,等待玩家第一次點擊格子后開始布雷;如果用戶點的是取消的話,就可以關掉這個提示的彈框。

    6.5玩家掃雷成功

    ?

    如圖5-8所示,當所有的地雷用都被玩家用小紅旗標識出來,并且非雷的格子也被點開時游戲結束,計時停止,系統彈框提醒玩家“您真厲害,請輸入您的名字,記錄上榜!”,玩家可以在這個界面輸入自己的名字來保存掃雷成績。

    6.6玩家游戲數據顯示

    ?

    每當玩家成功掃完所有的雷后,系統會自動的記錄本次的成績,保存在本地的txt文檔中,內容是三種難度,玩家姓名以及對應難度玩家所用的最少游戲時間。當玩家點擊查看英雄榜的時候系統默認只顯示三種難度和匿名。

    ?

    玩家點擊關閉時此窗口會關掉這個彈窗,當點擊重新記分時,統計信息會清空,點擊顯示成績就好刷新并將歷史最好的成績顯示出來。界面也會發生變化,可以顯示出游戲用時。

    6.7程序打包發布過程

    至此掃雷游戲已經編寫好了,我們可以將這個游戲打包發布,這就需要利用jar.exe命令來將編寫好的掃雷游戲的class文件打包發布。

    (1)編寫清單文件。首先需要使用“記事本”,根據要求自己編寫一個清單文件,格式和內容要和這里給的樣子一樣,具體內容如下:

    將清單文件保存到E:\workspace\掃雷\bin\com\zx\mine中,也就是和編寫的掃雷游戲程序生成的字節碼存放的位置相同,保證這些文件放在一個目錄下。

    需要注意的是,清單文件中的所有內容均為鍵值對的形式存放,鍵值直接必須空一個空格。

    ?

  • 生成JAR文件。E:\workspace\掃雷\jarcfmGame.jarMymoon.mf*.class,這條命令中有一些參數需要明白:
  • ①參數c意味著要讓系統生成一個文件,這個文件叫做JAR。

    ②參數f意味著要讓系統產生JAR文件的名字。

    ③參數m意味著顯示清單文件的名字。

    最后就可以將這個生成的JAR文件復制到任何一個安裝了Java運行環境(電腦上的jdk版本不能太低)的電腦上,玩家就可直接用鼠標雙擊圖標來運行自己編寫的掃雷小游戲了。

    6.8游戲測試結果

    6.9游戲難度自定義測試

    游戲難度自定義測試用例:

    預期結果

    選擇不同的難度后可以正確的初始化雷區

    輸入條件

    分別點擊初級、中級、高級和自定義

    測試結果

    點選不同難度后系統會自動改變雷區大小和地雷數

    ?

    ? ? ? 本次掃雷游戲設計將游戲的難度設定為初、中、高以及自定義四種難度,前三種難度對應的游戲界面的尺寸以及地雷總數是不同的,難度越大雷數越多,尺寸也越大,玩家掃雷時就需要更加的動腦思考才能通關。除了固定的難度以外還可以自定義難度,玩家需要自己輸入尺寸與雷數,系統根據玩家的要求生產新的游戲,難度可以更加的靈活,這樣可以讓玩家更滿意。

    ? ? ? ?測試了四種難度的選擇,由圖可以看出難度的選擇功能正常,可以自由變換尺寸和地雷總數。

    7掃雷測試

    掃雷勝利測試用例:

    預期結果

    成功的將所有地雷標記出來后,游戲可以立馬結束且會彈框提示輸入玩家名字

    輸入條件

    將所有地雷標記并將非雷格子點開

    測試結果

    游戲結束并且顯示了要求玩家輸入名字的彈框

    ?

    掃雷失敗測試用例:

    預期結果

    點擊了有雷的格子后游戲可以立馬結束且彈框提示玩家游戲失敗

    輸入條件

    點擊有雷的格子

    測試結果

    游戲正確的結束且彈框提示了游戲失敗的提示

    玩家可以通過左鍵單擊格子點開格子,右鍵單擊標識地雷的方式完成游戲。當玩家將所有的地雷都標識出來且其他的格子都被點開的情況下,游戲勝利。系統會彈框提示玩家成功完成了游戲任務“您真厲害,請輸入您的名字,記錄上榜!”。玩家可以在彈出的彈框中輸入自己的名字,若不輸入則默認為匿名,然后系統會保存玩家的游戲記錄。當玩家點擊掃雷榜的時候可以查看自己用時最短的游戲記錄。

    ?

    如圖6-7所示,玩家可以通過左鍵單擊格子點開格子,右鍵單擊標識地雷的方式完成游戲。當玩家在進行掃雷游戲的時候,不小心點擊了有雷的格子,這時候地雷被引爆了,所有未被標記的和已被標記的都被引爆,游戲結束。此時系統會自動將所有的地雷顯示出來,方便玩家查看之前標記的正確與否,可以總結經驗。然后系統彈框提示“你輸了,請繼續努力!”,玩家可以點擊重新開始的按鈕重開游戲,繼續挑戰掃雷游戲,也可以選擇結束游戲。

    7.1玩家游戲數據顯示測試

    最佳成績測試用例:

    預期結果

    點擊“最佳成績”按鈕時會顯示玩家最佳的游戲記錄

    輸入條件

    打開游戲的掃雷榜,點擊“最佳成績”按鈕

    測試結果

    游戲可以正確的顯示玩家的游戲記錄

    重新記分測試用例:

    預期結果

    點擊“重新記分”按鈕時會清除玩家以往的游戲記錄

    輸入條件

    打開游戲的掃雷榜,點擊“重新記分”按鈕

    測試結果

    點擊按鈕后游戲記錄消失,再點擊“最佳成績”按鈕只會顯示默認的成績

    如圖6-8和圖6-9所示,玩家在進行游戲時,如果成功的掃完雷,系統會提示并保存游戲記錄。在掃雷榜上玩家可以進行查看。但是當玩家反復通關后,系統會自動的將用時最短的掃雷記錄顯示出來,所以玩家在查看記錄的時候只能看到最快一次通關的記錄。

    通過圖6-10可以看出,當玩家點擊了“重新記分”按鈕后,之前游戲記錄都會被清除掉,只會顯示默認的數據:時間為999秒,名字是匿名。

    7.2游戲數據顯示區測試

    計時區顯示測試用例:

    預期結果

    第一次點擊雷區的格子時,計時區開始計時,游戲結束時計時停止,重新開始游戲時,計時歸零

    輸入條件

    點擊雷區的任意一格,然后結束游戲,最后點擊“重新開始”按鈕

    測試結果

    當點擊雷區任意一格后計時開始,計時正常。然后點擊有雷的格子結束游戲發現計時停止。點擊“重新開始”后計時區的計時正確歸零

    當點擊雷區中的任意一格后,計時區開始正常計時。當游戲結束時計時區的計時就會停止,最后點擊了“重新開始”后計時區的計時歸零。

    地雷數顯示區測試用例:

    預期結果

    標記地雷后計數區的數字會減1,如果標記數超過地雷數,計數區會用負數顯示

    輸入條件

    先標記一顆地雷,然后將所有的地雷標記出來

    測試結果

    標記一顆地雷后,計數區可以正確的減少1個,然后當所有的地雷全被標記后,如果繼續標記,計數區可以正確的以負數表示


    當標記了一顆地雷后計數區中的數字會相應的減少一個,表示有一顆雷被找到了。但是如果標記數超過了地雷的數目,計數區會以負數顯示,表示有的地雷標記錯了

    7.3遞歸算法測試

    遞歸調用測試用例:

    預期結果

    當點擊一個周圍八個格子中都沒有雷的格子時,系統會將這8個格子也點開

    輸入條件

    點開一個周圍沒有雷的格子

    測試結果

    系統正確的將周圍的八個格子點開,如果這些格子中周圍的格子沒有雷的話還會自動點開

    當點擊一個周圍八個格子中都沒有雷的格子時,系統會將周圍的格子點開,被點開的格子也會顯示周圍的地雷數。如果被點開的格子周圍還是沒有地雷,系統就會遞歸調用再把周圍的格子點開。

    掃雷游戲的代碼編寫完成,且基本功能也實現了,雖然與電腦上自帶的掃雷游戲相比在界面上還是有著一些差距,一些小細節也沒有完善,但已經讓我很滿意了,我會在以后繼續完善這些細節,讓這個掃雷游戲變得愈來愈好玩。在簡單的測試后,該游戲也達到了我的預期,所以本次的設計就到此結束了。

    結??? 論

    雖然這次的掃雷游戲看似簡單,但是其中卻涉及了GUI設計,需要我自己去學習。其中有各種組件的調用,各種控件的使用等

    通過編寫這次的掃雷游戲,我深刻的認識到了細節問題的重要性,這些問題看似無關緊要但是如果忽視會養成不好的編程習慣,所以我們要著眼于細節,善于去發現身邊的一些小事情,讓自己的水平不斷提高。而且我的編程能力在不斷的編寫代碼的過程中也有了顯著的提高。很多時候人們都認為知識學過了就行,但是當實際去用的時候就會發現這些知識是多么的陌生。所以我認為學過的知識就要多用,用實際操作來讓知識真正變成自己的。

    ?

    總結

    以上是生活随笔為你收集整理的一文教你从零开始设计并实现一个Java扫雷游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。