北京郵電大學(xué)畢業(yè)設(shè)計(jì)_第1頁(yè)
北京郵電大學(xué)畢業(yè)設(shè)計(jì)_第2頁(yè)
北京郵電大學(xué)畢業(yè)設(shè)計(jì)_第3頁(yè)
北京郵電大學(xué)畢業(yè)設(shè)計(jì)_第4頁(yè)
北京郵電大學(xué)畢業(yè)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于Java的迷宮游戲摘要迷宮游戲是我們最常見的游戲之一,該游戲出現(xiàn)在手機(jī)游戲、掌上游戲機(jī)和電腦游戲當(dāng)中,因此迷宮游戲也是一個(gè)十分經(jīng)典的游戲。一般的迷宮游戲比較簡(jiǎn)單,游戲中隨機(jī)出現(xiàn)一些障礙,要求玩家能夠找出一條從起點(diǎn)到終點(diǎn)的通路。它看似簡(jiǎn)單確變化無(wú)窮,迷宮游戲上手及其簡(jiǎn)單,但要熟練的掌握其中的奧秘且快速找出一條通路,難度卻不低。作為家喻戶曉老少皆宜的大眾游戲,其普及程度可以說(shuō)是史上任何一款游戲都無(wú)法比較的。本設(shè)計(jì)是一款基于Java的迷宮游戲。目前用于游戲開發(fā)的計(jì)算機(jī)語(yǔ)言多種多樣,而Java只是其中一種。然而,Java是現(xiàn)在全球最時(shí)髦的開發(fā)工具之一,它擁有一套龐大且完整的類庫(kù),內(nèi)置了其他怨言需要

2、靠庫(kù)甚至是操作系統(tǒng)才能支持的功能。所以,程序員可以很容易的用Java編寫并運(yùn)行基于Java的游戲。本文從游戲的背景研究和發(fā)展現(xiàn)狀開始,詳細(xì)描述了整個(gè)游戲的制作過(guò)程。對(duì)實(shí)現(xiàn)功能以及操作過(guò)程進(jìn)行了重點(diǎn)討論,開發(fā)用到了Java類庫(kù)中的許多包以及其中的類,例如java.util包,java.lang包,java.awt包等等,穩(wěn)重會(huì)對(duì)這些包和類的用法進(jìn)行講解。關(guān)鍵詞 游戲;迷宮;Java;算法AbsractJava-Based Maze GameMaze Game is one of the most common of our game , the game appeared in mobile g

3、ames , handheld game consoles and computer games which , therefore maze game is a very classic game. Generally relatively simple maze game , the game randomly some obstacles , requiring players to be able to find a path from start to finish . It seems simple indeed enormous, and its simple maze game

4、 started , but a skilled master mystery cut quickly identify a path , the difficulty really is not low . As a well-known popular game for all ages , its popularity can be said that the history of any game can not be compared.This design is a Java-based maze game . Current computer language for a var

5、iety of game development , and Java is just one of them. However , Java is now one of the worlds most fashionable development tools, it has a large and complete library, built-in library or other complaints need to rely on the operating system to support functions. Therefore, the programmer can easi

6、ly written in Java and run Java-based games.In this paper, the status of research and development background of the game began , a detailed description of the entire game production process. The realization of functions and operations are focused on the process , the development of the Java class li

7、braries used in many packages as well as one of the categories, such as java.util package , java.lang package , java.awt package and so on , will these packages and steady type of usage to explain.Keywords game;maze;Java Language;algorithm目 錄1 緒論51.1 課題的研究背景與意義51.2 Java簡(jiǎn)介51.2.1 名字起源51.2.2 發(fā)展歷史51.2.3

8、 語(yǔ)言特征51.2.4 開發(fā)平臺(tái)62 可行性研究72.1 可行性分析72.1.1 技術(shù)可行性72.1.2 經(jīng)濟(jì)可行性72.1.3 操作可行性72.1.4 法律可行性73 需求分析83.1 系統(tǒng)初步分析83.1.1 用戶需求分析83.1.2 功能需求分析83.1.3 系統(tǒng)的可靠性和可用性需求分析84 總體設(shè)計(jì)94.1 系統(tǒng)開發(fā)94.1.1 系統(tǒng)開發(fā)的原則94.1.2 系統(tǒng)設(shè)計(jì)階段94.1.3 結(jié)構(gòu)設(shè)計(jì)階段94.2 相關(guān)算法介紹104.2.1 深度優(yōu)先算法生成迷宮介紹104.2.2 普里姆算法生成迷宮介紹115 詳細(xì)設(shè)計(jì)135.1核心包的設(shè)計(jì)135.1.1 MainFrame類的設(shè)計(jì)與實(shí)現(xiàn)135.

9、1.2 SetFrame類的設(shè)計(jì)與實(shí)現(xiàn)155.1.3 ShowPane類的設(shè)計(jì)與實(shí)現(xiàn)175.1.4 MainController類的設(shè)計(jì)與實(shí)現(xiàn)205.1.5 AbstractMap類的設(shè)計(jì)與實(shí)現(xiàn)235.1.6 DFSMap類的設(shè)計(jì)與實(shí)現(xiàn)235.1.7 PriMap類的設(shè)計(jì)與實(shí)現(xiàn)295.1.8 Point類的設(shè)計(jì)與實(shí)現(xiàn)326 結(jié)論34參考文獻(xiàn)35致 謝36外文文獻(xiàn)37中文翻譯471 緒論1.1 課題的研究背景與意義隨著經(jīng)濟(jì)的快速發(fā)展,計(jì)算機(jī)的地位在人們生活中已日益突出,基于各種操作系統(tǒng)的娛樂(lè)游戲也越來(lái)越多、越來(lái)越大眾化,成為人們生活中必不可少的一部分。而隨著人們生活品質(zhì)的提高,電腦游戲也越來(lái)越多

10、元化,迷宮游戲就是其中的一種。迷宮游戲操作簡(jiǎn)單方便,也具有一定的思考力,能夠引發(fā)人的思維及興趣,老少皆宜,是一款經(jīng)久不衰的大眾化游戲。游戲的最初目的就是讓玩家在游戲中得到放松。游戲一直存在于人類生活中,如今定義的游戲從早期的猜謎游戲,發(fā)展至如今的單擊RPG游戲,網(wǎng)絡(luò)游戲等,已經(jīng)升華為更高級(jí)別意義上的娛樂(lè)游戲,對(duì)人們的感官刺激也越發(fā)強(qiáng)烈,得到樂(lè)趣也更多。對(duì)于編寫游戲而言,Java已變得足夠成熟。它現(xiàn)在是一種開發(fā)能都在多種平臺(tái)上運(yùn)行的中小型游戲的很好的方式。此外,Java支持和其他庫(kù)一起工作,而且它的速度變得越來(lái)越快。由于Java游戲一般來(lái)說(shuō)簡(jiǎn)單有趣,并且對(duì)用戶硬件要求極小,所以Java游戲通常對(duì)

11、85%的計(jì)算機(jī)用戶都有吸引力。1.2 Java簡(jiǎn)介1.2.1 名字起源Java是印度尼西亞爪哇島的英文名稱。Java語(yǔ)言中的許多庫(kù)類名稱,多與咖啡有關(guān):如JavaBeans、NetBeans以及ObjectBeans等等。SUN和JAVA的標(biāo)識(shí)也正是一杯正冒著熱氣的咖啡。1.2.2 發(fā)展歷史Java是由Sun Microsystems公司推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱Java語(yǔ)言)和Java平臺(tái)的總稱。用Java實(shí)現(xiàn)的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)、動(dòng)態(tài)的Web、Internet計(jì)算。從此,Java被廣泛接受并推動(dòng)了Web的迅速發(fā)展

12、,常用的瀏覽器現(xiàn)在均支持Java applet。另一方面,Java技術(shù)也不斷更新。(2010年Oracle公司收購(gòu)了SUN) 1.2.3 語(yǔ)言特征Java是一個(gè)純粹的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它繼承了 C+語(yǔ)言面向?qū)ο蠹夹g(shù)的核心。Java舍棄了容易引起錯(cuò)誤的指針、運(yùn)算符重載、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對(duì)象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在 Java 1.5 版本中,Java 又引入了泛型編程、類型安全的枚舉、不定長(zhǎng)參數(shù)和自動(dòng)裝/拆箱等語(yǔ)言特性。Java不同于一般的編譯執(zhí)行計(jì)算機(jī)語(yǔ)言和解釋執(zhí)行計(jì)算機(jī)語(yǔ)言。它首先將源代碼編譯成二進(jìn)制字節(jié)

13、碼,然后依賴各種不同平臺(tái)上的虛擬機(jī)來(lái)解釋執(zhí)行字節(jié)碼。從而實(shí)現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺(tái)特性。編輯Java源代碼可以使用任何無(wú)格式的純文本編輯器。1.2.4 開發(fā)平臺(tái)Java平臺(tái)由Java虛擬機(jī)和Java應(yīng)用編程接口(簡(jiǎn)稱API)構(gòu)成。Java應(yīng)用編程接口為此提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以就可以在各種系統(tǒng)中運(yùn)行。Java程序設(shè)計(jì)語(yǔ)言共分為三個(gè)體系JavaSE(java平臺(tái)標(biāo)準(zhǔn)版),JavaEE(java平臺(tái)企業(yè)版),JavaME(java平臺(tái)微型版)。2 可行性研究可行性研究的目的,就是用最小的代

14、價(jià)在盡可能短的時(shí)間內(nèi)確定問(wèn)題是否能解決。要達(dá)到這個(gè)目的,必須分析集中主要的可能解法的利弊,從而判斷原定的系統(tǒng)規(guī)模和目標(biāo)是否現(xiàn)實(shí),系統(tǒng)完成后所能帶來(lái)的經(jīng)濟(jì)效益時(shí)候大到值得投資開發(fā)這個(gè)系統(tǒng)的程度。因此,可行性研究實(shí)質(zhì)上是要進(jìn)行一次大大壓縮簡(jiǎn)化了的系統(tǒng)分析和設(shè)計(jì)的過(guò)程,也就是在較高層次上以較抽象的方式進(jìn)行的系統(tǒng)分析和設(shè)計(jì)的過(guò)程。2.1 可行性分析2.1.1 技術(shù)可行性開發(fā)本游戲的編程語(yǔ)言有多種,如:VC,VB,Java等,但考慮到自身對(duì)語(yǔ)言的熟悉程度和編寫程序的困難度,選擇Java語(yǔ)言進(jìn)行游戲的開發(fā)。本游戲?qū)嵲赪indows 環(huán)境下開發(fā)的,一般機(jī)器配置就可以滿足要求,對(duì)機(jī)器本身沒(méi)有太高的要求,環(huán)境只

15、需裝上jdk即可,Java是現(xiàn)在全球最流行的開發(fā)語(yǔ)言之一,他擁有一套龐大且完善的類庫(kù),內(nèi)置了其他語(yǔ)言所需要的靠庫(kù)甚至是操作系統(tǒng)才能支持的功能,擁有一個(gè)虛擬機(jī)。Eclipse是SUN公司開發(fā)的Java集成開發(fā)環(huán)境工具,是目前最優(yōu)秀的Java集成開發(fā)工具之一。2.1.2 經(jīng)濟(jì)可行性由于本系統(tǒng)使用到的工具一般機(jī)器都具有,使用的環(huán)境也很簡(jiǎn)單,開發(fā)成本低。Java一直以來(lái)由于其可以“跨平臺(tái)”以及“一次編譯,到處運(yùn)行”等特點(diǎn),且因?yàn)镴ava游戲簡(jiǎn)單有趣,并且對(duì)用戶硬性要求極小,所以Java游戲通常對(duì)85%的計(jì)算機(jī)用戶都有吸引力。2.1.3 操作可行性由于整個(gè)系統(tǒng)的開發(fā)過(guò)程中從操作簡(jiǎn)便、界面美觀、靈活使用、

16、的用戶要求為出發(fā)點(diǎn),界面設(shè)計(jì)是要充分考慮玩家的感受,界面比較直觀,互動(dòng)性很好,操作起來(lái)簡(jiǎn)單明了。2.1.4 法律可行性信息產(chǎn)業(yè)部已將游戲通用引擎研究及師范產(chǎn)品納入國(guó)家“863計(jì)劃”,這是中國(guó)首次將游戲技術(shù)納入國(guó)家科技計(jì)劃當(dāng)中。文化部也想國(guó)內(nèi)多家游戲業(yè)的實(shí)力廠商首次頒發(fā)了網(wǎng)絡(luò)文化經(jīng)營(yíng)許可證,加大對(duì)游戲的監(jiān)管力度,進(jìn)口游戲的審查制度,限制國(guó)內(nèi)對(duì)國(guó)外的受理措施??萍疾恐付萍及l(fā)展計(jì)劃,將把游戲開發(fā)的扶持力度加大。這樣一來(lái),國(guó)內(nèi)游戲廠商將可獲得發(fā)展的核心技術(shù)平臺(tái),政策有利于保護(hù)中國(guó)游戲軟件的自主知識(shí)產(chǎn)權(quán),這位游戲開發(fā)發(fā)展創(chuàng)造了良好的政策環(huán)境。3 需求分析所謂系統(tǒng)分析,就是指在整個(gè)系統(tǒng)開發(fā)過(guò)程中,解決“

17、做什么”的問(wèn)題,把要解決哪些問(wèn)題,滿足用戶哪些具體的信息需求調(diào)查分析清楚,從邏輯上或者說(shuō)從信息處理的功能希求上提出系統(tǒng)方案,即邏輯模型,為下一階段進(jìn)行物理設(shè)計(jì)方案設(shè)計(jì),解決怎么辦提供依據(jù)。3.1 系統(tǒng)初步分析3.1.1 用戶需求分析隨著Internet的發(fā)展,進(jìn)入信息時(shí)代后快速獲得網(wǎng)絡(luò)共享資源成為很簡(jiǎn)單的事情,人們對(duì)計(jì)算機(jī)產(chǎn)品產(chǎn)生更大的依賴性。計(jì)算機(jī)的普及使得原本生活已經(jīng)不嫩更適應(yīng)人們的需要,廣大計(jì)算機(jī)愛好者迫切的需要能夠使用計(jì)算機(jī)進(jìn)行必要的娛樂(lè)活動(dòng)來(lái)豐富自己的生活,這樣,計(jì)算機(jī)游戲應(yīng)運(yùn)而生。據(jù)目前的游戲調(diào)研來(lái)看,由Java開發(fā)的游戲仍然是一個(gè)空白頁(yè),但是它卻是一個(gè)繼續(xù)填補(bǔ)的空白頁(yè)。而Java

18、語(yǔ)言由于其天生的語(yǔ)言特性,很適合進(jìn)行游戲應(yīng)用的開發(fā),但由于系統(tǒng)環(huán)境問(wèn)題時(shí)的它一直以來(lái)未能用于游戲開發(fā),而近來(lái)由于Java的發(fā)展,它已經(jīng)擺脫了束縛,浮出了游戲開發(fā)的水面。這也是玩家迫切要求的。3.1.2 功能需求分析系統(tǒng)功能的需求指定系統(tǒng)必須提供的服務(wù)。通過(guò)需求分析應(yīng)該劃分出系統(tǒng)必須完成的所有功能。本作的功能模塊主要包括游戲的后臺(tái)設(shè)計(jì),游戲的界面設(shè)計(jì)。游戲的引擎設(shè)計(jì)的需求分析:游戲后臺(tái)是游戲的靈魂,也就是這個(gè)游戲的框架,它的好壞直接決定著游戲的質(zhì)量。它是控制所有游戲功能的主程序,包括畫面的處理,路徑尋找算法的實(shí)現(xiàn),接收玩家的設(shè)置等。所以堅(jiān)定一個(gè)游戲的好壞,從內(nèi)部設(shè)計(jì)的原因上說(shuō),是從游戲的后臺(tái)設(shè)計(jì)

19、體現(xiàn)出來(lái)的。一個(gè)游戲的后臺(tái)設(shè)計(jì),直接關(guān)系到游戲設(shè)計(jì)的其他方面,諸如游戲的圖形系統(tǒng)、聲音系統(tǒng)及設(shè)計(jì)的物理模塊等各方面。就如一臺(tái)CPU一樣,游戲的后臺(tái)也是直接牽制著整個(gè)游戲的設(shè)計(jì)。它主要的作用是處理游戲的時(shí)間,運(yùn)行游戲,輸出相應(yīng)提示,響應(yīng)玩家的游戲監(jiān)聽時(shí)間等。所以,游戲的后臺(tái)設(shè)計(jì)是必要的功能模塊,而且游戲的后臺(tái)必須設(shè)計(jì)好,這樣游戲才具有更好的可玩性。游戲程序是一樣精度要求很高的程序系統(tǒng),因?yàn)槠浯a利用率很高。一個(gè)實(shí)時(shí)運(yùn)行的最終作品,每秒都會(huì)運(yùn)行成千上萬(wàn)的程序,且需要極高頻率在后臺(tái)等待響應(yīng)。因此,其伙計(jì)設(shè)計(jì)應(yīng)當(dāng)相當(dāng)嚴(yán)謹(jǐn)。游戲界面設(shè)計(jì)的需求分析:作為一個(gè)游戲吸引玩家的最重要的方便就是幾面。本作品界面簡(jiǎn)

20、潔明了,是玩家人容易上手操作,且適應(yīng)性強(qiáng)。3.1.3 系統(tǒng)的可靠性和可用性需求分析可靠性需求定量地指定系統(tǒng)的可靠性,例如,游戲在運(yùn)行過(guò)程中不能頻繁發(fā)生錯(cuò)誤而不得不中止游戲??捎眯詣t與可靠性密切相關(guān),它量化了用戶可以使用系統(tǒng)的程度。例如,游戲的運(yùn)行必須保證隨時(shí)可以,不能在一段時(shí)間內(nèi),游戲產(chǎn)生不可預(yù)見的錯(cuò)誤而致無(wú)法運(yùn)行等。4 總體設(shè)計(jì)總體設(shè)計(jì)過(guò)程通常由兩個(gè)主要階段組成:系統(tǒng)設(shè)計(jì)階段,確定系統(tǒng)的具體實(shí)現(xiàn)方案;結(jié)構(gòu)設(shè)計(jì)階段,確定軟件結(jié)構(gòu)和功能模塊。4.1 系統(tǒng)開發(fā)4.1.1 系統(tǒng)開發(fā)的原則經(jīng)過(guò)需求分析階段的工作,系統(tǒng)必須“做什么”已經(jīng)明確,而系統(tǒng)開發(fā)是要明確“怎么做”。總體設(shè)計(jì)的基本目的就是回答“概括

21、地說(shuō),系統(tǒng)應(yīng)該如何實(shí)現(xiàn)?”這個(gè)問(wèn)題,因此,總體設(shè)計(jì)又稱概要設(shè)計(jì)或者初步設(shè)計(jì)。通過(guò)這個(gè)階段的工作將劃分出組成系統(tǒng)的物理元素程序、文件、數(shù)據(jù)庫(kù)、人工過(guò)程和文檔等等,但每個(gè)物理元素仍然處于黑盒子級(jí),這些黑盒里的具體內(nèi)容在詳細(xì)設(shè)計(jì)中。總體設(shè)計(jì)的另一項(xiàng)重要的任務(wù)就是設(shè)計(jì)軟件的結(jié)構(gòu),也就是確定系統(tǒng)中每個(gè)程序是由哪些模塊組成,以及這些模塊相互之間的關(guān)系??傮w設(shè)計(jì)過(guò)程首先尋找實(shí)現(xiàn)目標(biāo)系統(tǒng)的各種不同的方案。然后從這些提供的選擇方案中選取若干合理的方案,為每個(gè)合理的方案都準(zhǔn)備一份系統(tǒng)流程圖,列出組成系統(tǒng)所有元素,進(jìn)程成本、效益分析,并且制定實(shí)現(xiàn)此方案的進(jìn)度計(jì)劃。通常,設(shè)計(jì)出初步軟件結(jié)構(gòu)后還要進(jìn)行多方改進(jìn),從而得到

22、更合理的結(jié)構(gòu),進(jìn)行必要的數(shù)據(jù)庫(kù)設(shè)計(jì),確定測(cè)試要求并且制定測(cè)試計(jì)劃?;谏厦娴臄⑹?,在詳細(xì)設(shè)計(jì)之前先進(jìn)行總體設(shè)計(jì)的必要性:可以站在全局高度上,花較少的成本,從較抽象的層次上分析對(duì)比多種系統(tǒng)方案和軟件結(jié)構(gòu),從中選出最佳方案和最合理的軟件結(jié)構(gòu),從而用較低的成本開發(fā)出較高成本的軟件系統(tǒng)。4.1.2 系統(tǒng)設(shè)計(jì)階段系統(tǒng)設(shè)計(jì)階段的主要目的是確定軟件如何做的問(wèn)題。主要任務(wù)是確定系統(tǒng)中的大模塊和設(shè)計(jì)方法,確定軟件的功能模塊和模塊作用、組成、關(guān)系等。本系統(tǒng)是一款較為傳統(tǒng)的游戲,當(dāng)玩家打開游戲,顯示游戲界面,設(shè)置游戲難度之后便可開始游戲。當(dāng)玩家找不到通往出口的路徑時(shí),可以點(diǎn)擊“顯示路徑”按鈕來(lái)顯示一條從入口到出口的

23、通路,不過(guò)這樣的機(jī)會(huì)只有一次。也可以在此選擇“繪制地圖”,選擇同一難度的其他地圖樣式,重新開始游戲。當(dāng)玩家自己找到出口時(shí),游戲便會(huì)提醒“恭喜您,已找到出口!”。4.1.3 結(jié)構(gòu)設(shè)計(jì)階段經(jīng)過(guò)系統(tǒng)設(shè)計(jì)階段的思考和實(shí)踐,需要對(duì)功能結(jié)構(gòu)進(jìn)行細(xì)致的劃分。一個(gè)程序的結(jié)構(gòu)設(shè)計(jì)的好壞也需要決定其發(fā)展的重要指標(biāo)。對(duì)一個(gè)程序的模塊劃分往往也能是程序設(shè)計(jì)變得簡(jiǎn)單。本游戲的模塊大致分為后臺(tái)引擎和用戶界面兩大塊,界面模塊包括總體界面設(shè)計(jì)和設(shè)置界面設(shè)計(jì)。后臺(tái)引擎模塊包括深度優(yōu)先迷宮生成算法和普里姆迷宮生成算法。除此之外,還包括一個(gè)主界面控制類,用于界面算法和界面生成之間的連接控制,還有一個(gè)點(diǎn)類,主要用于定義點(diǎn)的相關(guān)操作,

24、一個(gè)迷宮生成的接口類,類中聲明了迷宮生成算法所需要定義的三個(gè)方法。以為不做具體定義,所以被稱為接口類。其功能模塊圖如下:圖4-1 功能模塊圖4.2 相關(guān)算法介紹算法是解題方案的準(zhǔn)確而完整的描述,其代表著用系統(tǒng)的方法描述解決問(wèn)題的策略機(jī)制。算法就相當(dāng)于對(duì)一定規(guī)范的輸入,在有限的時(shí)間內(nèi)獲得所要求的的輸出。描述算法的方法有好多種,常用的自然語(yǔ)言、結(jié)構(gòu)化流程圖,偽代碼等,其中最普遍的就是流程圖。本設(shè)計(jì)除了實(shí)現(xiàn)迷宮的相關(guān)功能之外,還著重就實(shí)現(xiàn)迷宮的算法進(jìn)行研究,通過(guò)算法及實(shí)現(xiàn)迷宮的特點(diǎn)比較深度優(yōu)先算法和普里姆算法在迷宮生成方面的優(yōu)劣性。4.2.1 深度優(yōu)先算法生成迷宮介紹DFSMap類使用深度優(yōu)先算法得

25、到地圖的類。設(shè)置一個(gè)二維數(shù)組,數(shù)組的值為格子的狀態(tài)。初始地圖的上所有的格都設(shè)為墻,不可達(dá)。之后,再定義出口和入口,也將其設(shè)置為背景,可以被訪問(wèn)的通道。這樣,生成的迷宮中顯示的是每一個(gè)格子的四面都是墻。從入口點(diǎn)開始向四個(gè)方向中的一個(gè)隨機(jī)訪問(wèn),每找到一個(gè)可被訪問(wèn)的點(diǎn),就去掉該點(diǎn)上的墻,可被訪問(wèn)的點(diǎn)繼續(xù)以這樣的方式向下進(jìn)行下去。對(duì)每個(gè)已被訪問(wèn)的格子都設(shè)置為已訪問(wèn)。當(dāng)一個(gè)點(diǎn)對(duì)某一方向進(jìn)行訪問(wèn)時(shí),首先需要根據(jù)判斷條件判斷被訪問(wèn)的點(diǎn)是否被訪問(wèn)過(guò),或者處于邊界,若該點(diǎn)的四個(gè)方向已經(jīng)被訪問(wèn)或者無(wú)法訪問(wèn),就退回上一個(gè)點(diǎn),而上一個(gè)點(diǎn)需重復(fù)進(jìn)行這一過(guò)程。這樣一次遍歷過(guò)后,可以確保每一個(gè)可被訪問(wèn)的點(diǎn)均被訪問(wèn)過(guò)。由于每

26、次訪問(wèn)的方向是隨機(jī)的,這樣導(dǎo)致許多種不同的遍歷情況,因?yàn)樾纬闪瞬煌拿詫m。所以迷宮的形成是堆積的,但是從起點(diǎn)到終點(diǎn)只有唯一路徑。在算法上,只要是利用棧來(lái)實(shí)現(xiàn)。第一次先將第一個(gè)起始點(diǎn)入棧,之后每訪問(wèn)一個(gè)點(diǎn)就將該點(diǎn)入棧,之后再對(duì)棧頂點(diǎn)的四個(gè)方向進(jìn)行隨機(jī)訪問(wèn)。若訪問(wèn)到新點(diǎn),就將新點(diǎn)入棧,直到這個(gè)點(diǎn)的四個(gè)方向都無(wú)法訪問(wèn)時(shí),將該點(diǎn)出棧。然后利用棧頂?shù)狞c(diǎn)繼續(xù)朝著四個(gè)方向訪問(wèn)。以此類推,直到所有的點(diǎn)全被遍歷過(guò),遍歷就結(jié)束了,這樣就形成了迷宮地圖。深度優(yōu)先算法生成迷宮的流程圖如圖4-2。圖4-2 深度優(yōu)先算法生成迷宮4.2.2 普里姆算法生成迷宮介紹普里姆算法是圖的最小生成樹的一種構(gòu)造算法。其構(gòu)成最小生成樹的

27、過(guò)程為:在所有“其一個(gè)頂點(diǎn)已經(jīng)落在生成樹上,另一個(gè)頂點(diǎn)尚未落在生成樹上”的邊中取一條權(quán)值為最小的邊,逐條加在生成樹上,直至生成樹中含有n-1條邊為止。PriMap類是利用普里姆算法實(shí)現(xiàn)迷宮的形成。首先,設(shè)置迷宮中的格子均為墻。其次,選擇入口點(diǎn)并將其設(shè)置為可行,然后將其鄰墻放入列表中。當(dāng)列表中有狀態(tài)為不可行的格子時(shí),從列表中隨機(jī)選擇一個(gè)作為墻的格子。此時(shí),如果它相鄰的格子不是迷宮的通路,則把墻打通,即設(shè)置此格子的狀態(tài)為可行,讓其成為迷宮的通路,再將該格子的鄰墻加入列表;如果墻的鄰格已經(jīng)是通路,則就從列表中刪除這面墻。兩種算法都有各自的有點(diǎn),從兩種生成算法所生成的迷宮中可以很清楚的看出。深度優(yōu)先算

28、法所生成的迷宮有些扭曲,曲折較多,但想要找出一條通路比較容易。所以深度優(yōu)先算法適用于較為簡(jiǎn)單的迷宮的生成。相較而言,普里姆算法比較復(fù)雜。其生成的迷宮岔路較多,生成的迷宮看起來(lái)很自然,但是想要找出一條通路是比較有難度的。所以相比,普里姆算法適用于難度較大的迷宮生成算法。相關(guān)示意圖如圖4-3。圖4-3 深普里姆算法生成迷宮5 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)階段的根本目標(biāo)是確定應(yīng)該怎樣具體實(shí)現(xiàn)所要求的系統(tǒng),也就是說(shuō),經(jīng)過(guò)這個(gè)階段的設(shè)計(jì)工作,應(yīng)該得出對(duì)目標(biāo)系統(tǒng)的精確描述,從而在編碼階段可以吧這個(gè)描述直接翻譯成某種程序設(shè)計(jì)語(yǔ)言書寫的程序。詳細(xì)設(shè)計(jì)的結(jié)果基本上決定了最終程序設(shè)計(jì)代碼的質(zhì)量。詳細(xì)設(shè)計(jì)的目標(biāo)你僅僅是邏輯上正

29、確地實(shí)現(xiàn)每個(gè)模塊的功能,更重要的是設(shè)計(jì)出的處理過(guò)程盡可能簡(jiǎn)明易懂。結(jié)構(gòu)程序設(shè)計(jì)技術(shù)是實(shí)現(xiàn)上述目標(biāo)的關(guān)鍵技術(shù),因此是詳細(xì)設(shè)計(jì)的邏輯基礎(chǔ)。5.1核心包的設(shè)計(jì)本游戲主要由游戲界面和游戲后臺(tái)兩大部分組成,其中的基本類包括如下:AbstractMap,DFSMap,MainController,MainFrame,PathMap,Point,SetFrame,ShowPane,Test工程圖如圖5-1。圖 5-1 工程圖5.1.1 MainFrame類的設(shè)計(jì)與實(shí)現(xiàn)本類主要是主界面的顯示設(shè)計(jì)。主界面主要由JMenuBar、Container、JPanel三個(gè)容器組成。其中JMenuBar主要放置菜單選項(xiàng)“

30、開始”和“設(shè)置”,Container是用來(lái)顯示地圖,JPanel是放置“開始游戲”、“顯示路線”及上下左右四個(gè)方向鍵。之后為菜單項(xiàng)設(shè)置監(jiān)聽器以及為上下左右四個(gè)方向鍵設(shè)置監(jiān)聽。MainFrame類的主要代碼如下:SuppressWarnings(serial)class EnterKeyListener implements KeyListener Overridepublic void keyTyped(KeyEvent e) / TODO Auto-generated method stubint keyCode = e.getKeyCode();switch (keyCode) case

31、KeyEvent.VK_UP:dfspan.play(1);break;case KeyEvent.VK_DOWN:dfspan.play(2);break;case KeyEvent.VK_LEFT:dfspan.play(3);break;case KeyEvent.VK_RIGHT:dfspan.play(4);break;class GoListener implements ActionListener/ 方向監(jiān)聽int i;GoListener(int i) this.i = i;Overridepublic void actionPerformed(ActionEvent e)

32、/ TODO Auto-generated method stubdfspan.play(i);con.repaint();class ItemListener implements ActionListener/ 菜單項(xiàng)監(jiān)聽器MainFrame mainFrame;public ItemListener(MainFrame mainFrame) / TODO Auto-generated constructor stubthis.mainFrame = mainFrame;Overridepublic void actionPerformed(ActionEvent e) / TODO Au

33、to-generated method stubif (e.getSource() = item11) System.exit(0); else if (e.getSource() = item21) new SetFrame(mainFrame);public static void main(String args) new MainFrame();主界面如圖5-2。圖 5-2 主界面5.1.2 SetFrame類的設(shè)計(jì)與實(shí)現(xiàn)SetFrame主要實(shí)現(xiàn)菜單中“設(shè)置”選項(xiàng)的設(shè)計(jì)。在設(shè)置選項(xiàng)中可以選擇生成迷宮的算法,各為深度優(yōu)先算法或者普里姆算法。還可以對(duì)游戲的難度進(jìn)行設(shè)置,分別為“簡(jiǎn)單”、“中

34、等”、“復(fù)雜”。設(shè)置其默認(rèn)選項(xiàng)為“深度優(yōu)先算法”和“中等”難度。設(shè)置完畢之后,按確認(rèn)鍵開始游戲。對(duì)不同的游戲難度進(jìn)行相應(yīng),即不同難度的游戲設(shè)置地圖的邊界大小的不同。通過(guò)變換地圖長(zhǎng)寬的值近而改變地圖的難易程度。當(dāng)玩家不想在繼續(xù)游戲時(shí),可選擇設(shè)置欄上的“開始”選項(xiàng),繼續(xù)選擇“退出”,則可以退出游戲。SetFrame類的主要代碼如下:private void setRadio() int m = main.getM();if (m = 20)simRadio.setSelected(true);else if (m = 50)difRadio.setSelected(true);else if (m

35、 = 35)midRadio.setSelected(true);private void setMapRadio() int w = main.getCurflag();if (w = 0)dfsRadio.setSelected(true);else if (w = 1)priRadio.setSelected(true);else if (w = 2)graRadio.setSelected(true);class SureListener implements ActionListener SetFrame s;public SureListener(SetFrame setFrame

36、) / TODO Auto-generated constructor stubs = setFrame;Override/ 不同難度的響應(yīng)public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = okBut) if (simRadio.isSelected() main.setM(20);main.setN(20); if (dfsRadio.isSelected()main.setCurflag(0);else if (priRadio.isSelected

37、()main.setCurflag(1);else if (graRadio.isSelected()main.setCurflag(2); else if (e.getSource() = exitBut);/ s.setVisible(false);main.setEnabled(true);s.setVisible(false);設(shè)置界面如圖5-3。圖 5-3 設(shè)置界面圖5.1.3 ShowPane類的設(shè)計(jì)與實(shí)現(xiàn)首先將迷宮所有格子設(shè)置成背景黑色,繪制迷宮時(shí),所有迷宮的墻均為綠色,若尋找出的路徑中含有某塊格子,則將此塊格子設(shè)置成紅色。若不依賴游戲?qū)ふ页龅穆窂剑峭婕易约簩ふ衣窂?,?dāng)玩家走

38、到迷宮的出口時(shí),則此時(shí)彈出對(duì)話框“恭喜你,到迷宮的盡頭!”ShowPane類主要代碼如下:SuppressWarnings(serial)public class ShowPane extends JPanel boolean a;private static final int SX = 30;private static final int SY = 30;private Stack stack;ShowPane(boolean a) this.a = a;stack = new Stack();this.setBackground(Color.black);stack.add(new P

39、oint(1, 0);repaint();ShowPane() a = new boolean11;stack = new Stack();this.setBackground(Color.black);Overrideprotected void paintComponent(Graphics g) / TODO Auto-generated method stubg.setColor(Color.black);g.fillRect(0, 0, this.getWidth(), this.getHeight();g.setColor(Color.green);for (int i = 0;

40、i a.length; i+) for (int j = 0; j a0.length; j+) if (aij = false) g.fillRect(SX + i * 8, SY + j * 8, 8, 8); else if (isHas(i, j) g.setColor(Color.red);g.fillRect(SX + i * 8, SY + j * 8, 8, 8);g.setColor(Color.green);public void redraw(boolean a)/ 重繪界面this.a = a;stack.clear();stack.push(new Point(1,

41、0);repaint();public void play(int keyvalue)/ 走迷宮(玩家自玩)if (stack.size() = 1) Point p = stack.peek();int x = p.getX();int y = p.getY();if (x = 1 & y = 0) if (keyvalue = 2) stack.pop();stack.push(new Point(x, y + 1); else if (x = a.length - 2 & y = a0.length - 1) JOptionPane.showMessageDialog(this, 恭喜你

42、,到迷宮的盡頭。); else if (keyvalue = 1 & axy - 1 = true) stack.pop();stack.push(new Point(x, y - 1); else if (keyvalue = 2 & axy + 1 = true) stack.pop();stack.push(new Point(x, y + 1); else if (keyvalue = 3 & ax - 1y = true) stack.pop();stack.push(new Point(x - 1, y); else if (keyvalue = 4 & ax + 1y = tru

43、e) stack.pop();stack.push(new Point(x + 1, y);repaint();相關(guān)示意圖如圖5-4和圖5-5。圖 5-4 迷宮路線顯示圖圖 5-5 玩家找到出口時(shí)的相關(guān)提示5.1.4 MainController類的設(shè)計(jì)與實(shí)現(xiàn)本類主要負(fù)責(zé)“繪制地圖”、“顯示路徑”、“隱藏路徑”單個(gè)按鈕的控制。通過(guò)為按鈕增加監(jiān)聽,使按鍵被得到相應(yīng)的控制。本游戲中,每一種游戲的難度可以繪制若干種地圖,但每種顯示的地圖只有一次顯示路徑的機(jī)會(huì)。MainController類的主要代碼如下:package maze4;public class MainController class

44、ButtonListener implements ActionListener Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = button_kaishi) int curflag = mainFrame.getCurflag();if (curflag = 0)map = new DFSMap(mainFrame.getM(), mainFrame.getN();else if (curflag = 1)map = new PriM

45、ap(mainFrame.getM(), mainFrame.getN();boolean b = map.getData();dfspan.redraw(b);dfspan.setVisible(true);button_xianshi.setEnabled(true);button_xianshi.setText(顯示路徑); else if (e.getSource() = button_xianshi) if (button_xianshi.getText() = 顯示路徑) int curflag = mainFrame.getCurflag();if (curflag = 0) d

46、fspan.showResult(map.getPath(); else if (curflag = 1) pripan.showResult(map.getPath();button_xianshi.setText(隱藏路徑); else int curflag = mainFrame.getCurflag();if (curflag = 0) dfspan.showResult(null); else if (curflag = 1) pripan.showResult(null);button_xianshi.setText(顯示路徑);button_xianshi.setEnabled

47、(false);con.repaint();不同難易程度繪制的地圖及其路徑顯示如圖5-7、圖5-8和圖5-9。圖 5-7 簡(jiǎn)單難度的迷宮游戲路徑顯示界面圖 5-8 復(fù)雜難度的迷宮游戲界面圖 5-9 復(fù)雜難度的迷宮游戲路徑顯示界面5.1.5 AbstractMap類的設(shè)計(jì)與實(shí)現(xiàn)AbstractMap類為一個(gè)抽象類,表示選擇不同的算法。在這里定義了getData、reset、getPath三個(gè)接口,分別表示 得到數(shù)據(jù)、重置、得到路徑三種方法。這三種方法將會(huì)在DFSMap和PriMap兩個(gè)類中得以詳細(xì)定義及實(shí)現(xiàn)。AbstractMap類的代碼如下:public abstract class Abst

48、ractMap/* * 得到數(shù)據(jù)*/public abstract boolean getData();/* * 重置*/public abstract void reset(int m,int n);/* * 得到路徑*/public abstract Stack getPath();5.1.6 DFSMap類的設(shè)計(jì)與實(shí)現(xiàn)DFSMap類使用深度優(yōu)先算法得到地圖的類。設(shè)置一個(gè)二維數(shù)組,數(shù)組的值為格子的狀態(tài)。初始地圖的上所有的格都設(shè)為墻,不可達(dá)。之后,再定義出口和入口,也將其設(shè)置為背景,可以被訪問(wèn)的通道。這樣,生成的迷宮中顯示的是每一個(gè)格子的四面都是墻。迷宮形成:首先判斷地圖上的每一個(gè)點(diǎn)是否都已

49、經(jīng)被遍歷過(guò),若沒(méi)有,得到一點(diǎn)的坐標(biāo),判斷該點(diǎn)實(shí)在地圖畫布的四個(gè)角、四條邊上、或是在中間位置,分別用0-8表示該點(diǎn)是在左上角、左下角、右上角、右下角、左邊界、右邊界、上邊界、下邊界、中間位置。之后逐一進(jìn)行分析,若該點(diǎn)位于地圖的四個(gè)角,則下一步只有兩個(gè)方向可以選擇;若該點(diǎn)位于地圖的四條邊界上,則下一步有三個(gè)方向可以選擇;若該點(diǎn)位于地圖中間位置,則下一步有四個(gè)方向可以選擇。不管朝上下左右四個(gè)方向如何移動(dòng),若此點(diǎn)可達(dá),即將該點(diǎn)入棧。DFSMap類的主要代碼如下:public class DFSMap extends AbstractMap public Stack getPath()/ 得到/ TOD

50、O Auto-generated method stubreturn stack;private boolean check()/ 判斷是否全部走過(guò)。for (int i = 1; i m; i += 2) for (int j = 1; j n; j += 2) if (aij = false)return false;return true;private void forward()/ 后退一步if (DFSflag = false) stack.pop();Point p = stack.pop();currX = p.getX();currY = p.getY(); else int

51、 i, j;boolean flag = false;while (!flag) i = (int) (Math.random() * m);j = (int) (Math.random() * n);if (aij = true & i % 2 = 1 & j % 2 = 1) currX = i;currY = j;flag = true;從入口點(diǎn)開始向四個(gè)方向中的一個(gè)隨機(jī)訪問(wèn),每找到一個(gè)可被訪問(wèn)的點(diǎn),就去掉該點(diǎn)上的墻,可被訪問(wèn)的點(diǎn)繼續(xù)以這樣的方式向下進(jìn)行下去。對(duì)每個(gè)已被訪問(wèn)的格子都設(shè)置為已訪問(wèn)。當(dāng)一個(gè)點(diǎn)對(duì)某一方向進(jìn)行訪問(wèn)時(shí),首先需要根據(jù)判斷條件判斷被訪問(wèn)的點(diǎn)是否被訪問(wèn)過(guò),或者處于邊界,若該點(diǎn)的四個(gè)方向已經(jīng)被訪問(wèn)或者無(wú)法訪問(wèn),就退回上一個(gè)點(diǎn),而上一個(gè)點(diǎn)需重復(fù)進(jìn)行這一過(guò)程。這樣一次遍歷過(guò)后,可以確保每一個(gè)可被訪問(wèn)的點(diǎn)均被訪問(wèn)過(guò)。由于每次訪問(wèn)的方向是隨機(jī)的,這樣導(dǎo)致許

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論