java課程設(shè)計(jì)--連連看游戲的開(kāi)發(fā)_第1頁(yè)
已閱讀1頁(yè),還剩26頁(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、<p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  課程名稱(chēng):程序設(shè)計(jì)實(shí)訓(xùn)</p><p>  報(bào)告題目:連連看游戲的開(kāi)發(fā)</p><p><b>  學(xué)生姓名:</b></p><p><b>  所在學(xué)院:</b></p><p>

2、;<b>  專(zhuān)業(yè)班級(jí):</b></p><p><b>  學(xué)生學(xué)號(hào):</b></p><p><b>  指導(dǎo)教師:</b></p><p>  2013年6月20日</p><p><b>  課程設(shè)計(jì)任務(wù)書(shū)</b></p><p

3、><b>  摘 要</b></p><p>  近年來(lái),Java作為一種新的編程語(yǔ)言,以其可移植性和平臺(tái)無(wú)關(guān)性等優(yōu)點(diǎn),得到了廣泛地應(yīng)用,特別是Java與萬(wàn)維網(wǎng)的完美結(jié)合,使其成為網(wǎng)絡(luò)編程和嵌入式編程領(lǐng)域的首選編程語(yǔ)言。 </p><p>  本設(shè)計(jì)報(bào)告闡述了連連看游戲的分析與設(shè)計(jì)的全過(guò)程,并在論文中相應(yīng)的位置插入了圖片、流程圖以及一些具有技巧性的程

4、序代碼,更加清晰的描述了該游戲是如何實(shí)現(xiàn)的。連連看游戲有編寫(xiě)簡(jiǎn)單容易上手等特點(diǎn),非常適合人們?cè)谕瓿晒ぷ鞯臅r(shí)候適當(dāng)?shù)膴蕵?lè)要求。這些小游戲大都是以益智和娛樂(lè)為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開(kāi)發(fā)。</p><p>  連連看游戲采用JAVA語(yǔ)言開(kāi)發(fā),以MyEclipse為開(kāi)發(fā)平臺(tái)。游戲主界面是基于SWING(圖形用戶界面)的開(kāi)發(fā),使得游戲界面簡(jiǎn)單清晰。并調(diào)用了其中的一些函數(shù),完成了事件的觸發(fā)功

5、能。希望通過(guò)這次開(kāi)發(fā)設(shè)計(jì)出的連連看小游戲,給大家的生活帶來(lái)一點(diǎn)樂(lè)趣。 游戲通過(guò)定義動(dòng)態(tài)的二維數(shù)組,根據(jù)一定的算法實(shí)現(xiàn)規(guī)定的路徑判斷。</p><p>  關(guān)鍵詞:連連看游戲;算法設(shè)計(jì);路徑判斷;Java</p><p><b>  目 錄</b></p><p>  課程設(shè)計(jì)任務(wù)書(shū)II</p><p><b&

6、gt;  摘 要III</b></p><p><b>  一、緒 論1</b></p><p><b>  二、可行性分析2</b></p><p>  2.1 技術(shù)可行性2</p><p>  2.2 經(jīng)濟(jì)可行性2</p><p>  2.3 操

7、作可行性3</p><p>  三、課程設(shè)計(jì)題目任務(wù)描述和要求4</p><p>  3.1 任務(wù)描述4</p><p>  3.1.1 界面4</p><p><b>  3.1.2程序4</b></p><p>  3.2 設(shè)計(jì)要求及目的5</p><p>

8、<b>  四、需求分析6</b></p><p>  4.1 方案選擇6</p><p><b>  4.2功能描述6</b></p><p>  4.3 功能需求6</p><p>  4.4 功能模塊及思路7</p><p>  4.5 系統(tǒng)需求分析總結(jié)9&

9、lt;/p><p><b>  五、設(shè)計(jì)方案11</b></p><p>  5.1 總體設(shè)計(jì)11</p><p>  5.2 詳細(xì)設(shè)計(jì)12</p><p><b>  六、實(shí)現(xiàn)14</b></p><p>  6.1 游戲界面14</p><p&g

10、t;  6.2 游戲各功能及代碼15</p><p><b>  七、總結(jié)21</b></p><p><b>  八、參考資料22</b></p><p><b>  一、緒論</b></p><p>  計(jì)算機(jī)產(chǎn)業(yè)的進(jìn)步與發(fā)展也促進(jìn)了游戲產(chǎn)業(yè)的進(jìn)步。當(dāng)前我們生活中的各

11、類(lèi)游戲?qū)映霾桓F,但是經(jīng)典總會(huì)存在,有一些游戲不是時(shí)間的推移或是技術(shù)的革新可以洗刷掉它的存在和光環(huán)的。其中連連看游戲就是計(jì)算機(jī)游戲世界里典型的經(jīng)典游之一。</p><p>  電子游戲產(chǎn)業(yè)作為現(xiàn)代計(jì)算機(jī)技術(shù)的產(chǎn)物,正在以其獨(dú)特的魅力在全世界的娛樂(lè)領(lǐng)域占據(jù)主流位置。我們必須明確的一點(diǎn)就是游戲本身所具有的強(qiáng)大的吸引力。游戲其吸引力主要在于,它在讓玩家打發(fā)時(shí)間的同時(shí),也可以讓人發(fā)泄對(duì)現(xiàn)實(shí)生活中的不滿,得到在現(xiàn)實(shí)中不能得到

12、的東西。而且游戲產(chǎn)業(yè)促動(dòng)高科技技術(shù)不斷升級(jí),作為經(jīng)濟(jì)增長(zhǎng)的一大支撐點(diǎn),已經(jīng)成為經(jīng)濟(jì)騰飛的“第四產(chǎn)業(yè)”。</p><p>  游戲產(chǎn)業(yè)的多樣性發(fā)展趨勢(shì)促使一門(mén)使程序設(shè)計(jì)更加方便、功能更加強(qiáng)大的開(kāi)發(fā)語(yǔ)言發(fā)展起來(lái)。</p><p>  連連看游戲的設(shè)計(jì)主要采用的Java編程技術(shù),就語(yǔ)言技術(shù)、風(fēng)格、嚴(yán)謹(jǐn)?shù)忍攸c(diǎn)上來(lái)說(shuō),Java是編程語(yǔ)言中最為優(yōu)秀的一種語(yǔ)言之一,甚至由它而引發(fā)出計(jì)算機(jī)語(yǔ)言界中的多種新

13、的規(guī)范和特征。特別的,在連連看游戲的設(shè)計(jì)中需要將一些小圖片貼入到游戲界面上,如果利用C或C++來(lái)設(shè)計(jì)這部分是比較復(fù)雜的,但是使用Java語(yǔ)言只需將圖片set到button控件的背景圖片即可,并將圖片直接導(dǎo)入到控件中便可省去很部分的代碼。所以,Java的產(chǎn)生和發(fā)展使得程序設(shè)計(jì)的功能更加的強(qiáng)大、設(shè)計(jì)的方法更加的便捷。</p><p><b>  二、 可行性分析</b></p>

14、<p>  2.1 技術(shù)可行性</p><p>  此次編寫(xiě)的連連看游戲是建立在MyEclipse8.5開(kāi)發(fā)環(huán)境下,Java中swing為連連看游戲的設(shè)計(jì)提供了便利,此次設(shè)計(jì)主要是運(yùn)用的Java語(yǔ)言編程與實(shí)現(xiàn)的。在此開(kāi)發(fā)環(huán)境中是完全可行的。</p><p>  連連看游戲是涉及到圖形界面處理的,其中圖片的導(dǎo)入可以通過(guò)開(kāi)發(fā)軟件的圖片導(dǎo)入控件直接導(dǎo)入,但是相應(yīng)的操作需要對(duì)界面進(jìn)行重

15、繪,圖1.1是界面控制處理的流程圖:</p><p>  圖2.1 圖形界面控制</p><p><b>  2.2 經(jīng)濟(jì)可行性</b></p><p>  一個(gè)游戲的實(shí)現(xiàn),需要考慮玩家花費(fèi)的人力物力,不計(jì)算能夠回收多少資金就不是一個(gè)好的項(xiàng)目負(fù)責(zé)人。一個(gè)新想法如果不經(jīng)過(guò)項(xiàng)目負(fù)責(zé)人的決策是不可能立項(xiàng)的。所以,在進(jìn)行游戲設(shè)計(jì)的過(guò)程中,一定要把項(xiàng)目的

16、規(guī)模和市場(chǎng)效果考慮進(jìn)去,否則游戲再好,如果不適合市場(chǎng)的需要也是徒勞 。</p><p>  通過(guò)花費(fèi)、時(shí)間和人力的綜合考慮,連連看游戲的設(shè)計(jì)只需要一臺(tái)裝有開(kāi)發(fā)軟件Java的計(jì)算機(jī)和一個(gè)具有相關(guān)知識(shí)的開(kāi)發(fā)者,是有經(jīng)濟(jì)可行性的。 </p><p><b>  2.3 操作可行性</b></p><p>  從技術(shù)上來(lái)考慮,這是可以實(shí)現(xiàn)的。需要你熟悉

17、C#與asp.net 以及SQL SERVER 2008并能夠簡(jiǎn)單的應(yīng)用,那樣留言簿就能夠?qū)崿F(xiàn)了。但對(duì)于用戶來(lái)說(shuō)他要的僅僅是能夠與大家交流,分享心情的平臺(tái)。他并不會(huì)在乎你用什么技術(shù)去實(shí)現(xiàn)以及你花費(fèi)多少精力去完成的。因此在操作上必須簡(jiǎn)單,這是完全能夠去實(shí)現(xiàn)的。因此在操作上是完全可行的。 </p><p>  此次課程設(shè)計(jì)的連連看游戲是基于MyEclipse8.5之上的,只要你的電腦安裝了此軟件就可以玩連連看游戲了.

18、</p><p>  三、課程設(shè)計(jì)題目任務(wù)描述和要求</p><p><b>  3.1 任務(wù)描述</b></p><p><b>  3.1.1 界面</b></p><p>  用Java swing的JFrame設(shè)計(jì)界面,使用JFrame繼承。([1])其主體實(shí)現(xiàn)如下:public class

19、 TestLLK01 extends JFrame 設(shè)置游戲界面的大小以及布局</p><p>  this.setSize(1200, 800); //將窗體的大小設(shè)定</p><p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); </p>

20、<p>  this.setResizable(false); //窗體不能改變大小</p><p>  this.setTitle("連連看"); //設(shè)置標(biāo)題</p><p>  其界面如下(圖3.1.1):</p><p><b>  圖3.1.1</b>&l

21、t;/p><p><b>  3.1.2程序</b></p><p>  游戲過(guò)程,如果玩家在規(guī)定的時(shí)間內(nèi)消完則提示玩家勝利,如果在一定時(shí)間內(nèi)圖片沒(méi)有消完則提示玩家時(shí)間到,游戲失敗。</p><p>  經(jīng)過(guò)對(duì)游戲的初步分析,連連看游戲包含了如下規(guī)則:</p><p>  1、條件:程序的關(guān)鍵在于判斷用戶連續(xù)點(diǎn)擊的兩個(gè)圖案能

22、否消除。兩個(gè)圖片可以消除的條件有兩個(gè): </p><p><b>  圖片相同 </b></p><p>  圖片間連線的轉(zhuǎn)角數(shù)不得超過(guò)2 。 </p><p><b>  2、操作:</b></p><p>  第一次使用鼠標(biāo)點(diǎn)擊游戲界面中的牌,該牌此時(shí)為"被選中",以特殊方式

23、顯示;再次以鼠標(biāo)點(diǎn)擊其他牌,若該牌與被選中的牌圖案相同,且把第一個(gè)牌到第二個(gè)牌連起來(lái),中間的直線不超過(guò) 3 根,則消掉這一對(duì)牌,否則第一個(gè)牌恢復(fù)成未被選中狀態(tài),而第二個(gè)牌變成被選中狀態(tài)。在規(guī)定的時(shí)間內(nèi)將游戲界面上的牌全部消除掉。則游戲勝利 ,在規(guī)定時(shí)間,界面上的牌仍未全部消掉。則游戲失敗</p><p>  3.2 設(shè)計(jì)要求及目的</p><p>  通過(guò)本次課程設(shè)計(jì),并在實(shí)際運(yùn)用中學(xué)習(xí)和

24、熟悉Java程序開(kāi)發(fā)的基礎(chǔ)過(guò)程,進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)內(nèi)容、基本技能和方法,同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問(wèn)題、解決問(wèn)題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。 </p><p>  主要是能通過(guò)開(kāi)發(fā)“連連看”這個(gè)小游戲,提高自己Java程序設(shè)計(jì)編程的實(shí)際能力。</p><p>  進(jìn)一步熟悉掌握J(rèn)ava程序設(shè)計(jì)的基礎(chǔ)內(nèi)容, J

25、ava多線程編程等。</p><p>  大體了解怎樣用Java來(lái)編寫(xiě)小游戲,增強(qiáng)我們實(shí)踐能力和創(chuàng)新精神的綜合培養(yǎng)。 </p><p>  設(shè)計(jì)過(guò)程中,對(duì)整個(gè)游戲所實(shí)現(xiàn)的功能進(jìn)行詳細(xì)的設(shè)計(jì)以及對(duì)存在的問(wèn)題及解決辦法進(jìn)行最終確定;而后完成游戲的程序編寫(xiě),并優(yōu)化;最后,寫(xiě)出設(shè)計(jì)本游戲的詳細(xì)文檔說(shuō)明,并作課程設(shè)計(jì)匯報(bào)。</p><p><b>  四、需求分析&

26、lt;/b></p><p><b>  4.1 方案選擇</b></p><p>  在概要設(shè)計(jì)階段,主要有兩中方案可供選擇: </p><p>  一、所有的圖片都是按約定好的種類(lèi)數(shù)和在同一區(qū)域的重復(fù)次數(shù)隨機(jī)出現(xiàn),并且每張圖片的的出現(xiàn)次數(shù)為偶數(shù) ,時(shí)間會(huì)有限制,每一關(guān)的圖片數(shù)量或種方案的設(shè)計(jì)思想,時(shí)間是不同的,這樣就增加了游戲的難度。

27、</p><p>  二、在同一區(qū)域中,圖片出現(xiàn)的種類(lèi)數(shù)和重復(fù)次數(shù)是可以由玩家選擇的,時(shí)間由游戲約定。不過(guò)玩家選擇的種類(lèi)數(shù)和重復(fù)次數(shù)必須是偶數(shù)才可以順利完成游戲,否則游戲雖然可以正常運(yùn)行,但無(wú)法完成游戲。</p><p>  在第一種方案中,由于出現(xiàn)的圖像按種類(lèi)數(shù)和重復(fù)次數(shù)都由軟件約定,這樣就缺乏玩家自主選擇的空間,只是在玩系統(tǒng)已經(jīng)是設(shè)定好的游戲,不能改變什么,這樣就在無(wú)意中降低了玩家在游

28、戲的過(guò)程中樂(lè)趣,最后致使玩家放棄繼續(xù)玩下去。我們參考了網(wǎng)絡(luò)上的連連看游戲,考慮到游戲的娛樂(lè)性。所以我們放棄第一種方案的設(shè)計(jì)思想,參考網(wǎng)絡(luò)上流行的連連看的游戲,設(shè)計(jì)出第二種方案。</p><p><b>  4.2功能描述</b></p><p>  本設(shè)計(jì)采用單機(jī)模式,當(dāng)在規(guī)定的時(shí)間內(nèi)消完全部的圖片則當(dāng)前關(guān)卡通過(guò),如果在規(guī)定的時(shí)間內(nèi)沒(méi)能消完所有的圖片則游戲結(jié)束,重新開(kāi)

29、始新游戲。游戲規(guī)則是模仿普通的連連看游戲,主要是鼠標(biāo)兩次點(diǎn)擊的圖片能否消去的問(wèn)題。當(dāng)前,前提是點(diǎn)擊兩張相同的圖片,若點(diǎn)擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片用三根以?xún)?nèi)的直線能連在一起,就可以消去;否則,不予處理。</p><p>  游戲過(guò)程,如果玩家在一定的時(shí)間內(nèi)消完則提示玩家勝利;如果在一定時(shí)間內(nèi)圖片沒(méi)有消完則提示玩家時(shí)間到。</p><p><b>

30、  4.3 功能需求</b></p><p><b>  設(shè)計(jì)游戲界面</b></p><p><b>  游戲基本功能</b></p><p>  在游戲無(wú)解決方案時(shí)重排</p><p>  4.4 功能模塊及思路</p><p>  4.4.1 解決游戲區(qū)域問(wèn)

31、題 </p><p>  這個(gè)問(wèn)題最簡(jiǎn)單,但是卻是最花時(shí)間的。正所謂:萬(wàn)事開(kāi)頭難。剛開(kāi)始想了好多控件來(lái)實(shí)現(xiàn)。比如Label,Panel,button等等,[2]后來(lái)在參考文獻(xiàn)中發(fā)現(xiàn)一個(gè)掃雷游戲可以通過(guò)image控件來(lái)畫(huà)圖。因此在幾天之后才解決這個(gè)最早的最簡(jiǎn)單的也是最頭疼的問(wèn)題。 </p><p>  4.4.2 獲取圖片位置的思路 </p><p>  首先,最基本

32、的就是用button代替圖片進(jìn)行布局了,然后將圖片set到button用來(lái)做背景圖片。這里采用最簡(jiǎn)單的方法——數(shù)組。考慮到圖片是多行多列的格式。所以采用二維數(shù)組(數(shù)組名為game_grid[][]方式來(lái)控制比較直觀,并且為了程序容易解讀,統(tǒng)一在不同過(guò)程中用名為i和j的變量來(lái)分別表示行列。程序開(kāi)始時(shí)給數(shù)組中的各個(gè)元素賦初值為0,即表示沒(méi)有圖片。 </p><p>  然后數(shù)組控制整個(gè)游戲區(qū)域,游戲區(qū)域最外圍為空白區(qū)

33、域,即相關(guān)元素的值為0。這樣就可以保證游戲剛開(kāi)始后,第二層顯示的圖片之間的相連路徑處理時(shí)就沒(méi)有阻礙了。 </p><p>  這個(gè)游戲考慮到玩家對(duì)圖片的愛(ài)好不同,故可以自由修改。將數(shù)組game_grid的數(shù)據(jù)與圖片名匹配(如:game_grid的數(shù)據(jù)為1~25則圖片名為1,2...25與之一一對(duì)應(yīng)),玩家則只需要將自己喜歡的圖片改變圖片名字去替換就可以了。其button背景圖片的方法是用ImageIcon來(lái)存

34、儲(chǔ)圖片信息然后set到button中。這個(gè)思路的具體算法可以后面的3.2.2的第二個(gè)步驟中得以體現(xiàn)。 </p><p>  4.4.3 分類(lèi)判斷法</p><p>  這里實(shí)質(zhì)上是一種遞歸的思想,要判斷圖片A與圖片B能否通過(guò)一條有N個(gè)轉(zhuǎn)角的路徑相連,可以轉(zhuǎn)化為判斷能否找到圖片C,C與A能直線相連,且C與B能用一條有N-1個(gè)轉(zhuǎn)角的路徑相連。若這樣的圖片C存在,那么A與B就可以通過(guò)一條有N個(gè)轉(zhuǎn)

35、角的路徑相連。 </p><p>  根據(jù)轉(zhuǎn)角數(shù)不得超過(guò)2個(gè)的規(guī)則,我們可以分為轉(zhuǎn)角數(shù)分別為0個(gè)、1個(gè)、2個(gè)這三種情況分別討論。[3] </p><p> ?。?)0轉(zhuǎn)角連通(直線連通):兩個(gè)圖片的縱坐標(biāo)或橫坐標(biāo)相等,且兩者連線間沒(méi)有其他圖案阻隔。 </p><p> ?。?)一個(gè)轉(zhuǎn)角連通:其實(shí)相當(dāng)于兩個(gè)圖片的橫向與縱向的直線相交只有一個(gè)焦點(diǎn)。</p>

36、<p>  圖4.4.2一個(gè)轉(zhuǎn)角連通 </p><p> ?。?)兩個(gè)轉(zhuǎn)角連通: 判斷圖片A與圖片B能否經(jīng)過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通實(shí)質(zhì)上可以轉(zhuǎn)化為判斷能否找到一個(gè)點(diǎn)C,這個(gè)C點(diǎn)與A可以直線連通,且C與B可以通過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通。若能找到這樣一個(gè)C點(diǎn),那么A與B就可以經(jīng)過(guò)有兩個(gè)轉(zhuǎn)角的路徑連通 。 </p><p>  判斷是否經(jīng)兩個(gè)轉(zhuǎn)角連通的算法需要做兩個(gè)方向上的掃描:水平掃描

37、和垂直掃描。 </p><p>  水平判斷。如下圖所示,為了判斷A,B能否通過(guò)2個(gè)轉(zhuǎn)角連通,則從A開(kāi)始在水平方向上向左右掃描,并判斷經(jīng)過(guò)的點(diǎn)能否與B點(diǎn)經(jīng)過(guò)1個(gè)轉(zhuǎn)角連通。顯然C點(diǎn)能與B點(diǎn)經(jīng)1個(gè)轉(zhuǎn)角連通,故A,B能經(jīng)2個(gè)轉(zhuǎn)角連通。</p><p>  圖4.4.3兩個(gè)轉(zhuǎn)角連通的判斷 </p><p>  垂直判斷。如下圖所示,為了判斷A,B能否通過(guò)2個(gè)轉(zhuǎn)角連通,則從A

38、開(kāi)始在垂直方向上下掃描,并判斷經(jīng)過(guò)的點(diǎn)能否與B點(diǎn)經(jīng)過(guò)1個(gè)轉(zhuǎn)角連通。顯然C點(diǎn)能與B點(diǎn)經(jīng)1個(gè)轉(zhuǎn)角連通,故A,B能經(jīng)2個(gè)轉(zhuǎn)角連通。</p><p>  圖4.4.4兩個(gè)轉(zhuǎn)角連通的判斷 </p><p>  4.5 系統(tǒng)需求分析總結(jié)</p><p>  通過(guò)對(duì)現(xiàn)行連連看系統(tǒng)的調(diào)查與分析,本系統(tǒng)的結(jié)構(gòu)基本合理,系統(tǒng)功能基本能夠達(dá)到Windows小游戲的要求。本系統(tǒng)的輸入邊界是

39、用戶進(jìn)行鼠標(biāo)事件操作,圖片全部消除,游戲結(jié)束,并且游戲勝利[4]。</p><p>  通過(guò)對(duì)連連看游戲規(guī)則以及相關(guān)算法的分析,本系統(tǒng)總的數(shù)據(jù)量較小,規(guī)模不大,適合于在普通微機(jī)或小型機(jī)上運(yùn)行。</p><p><b>  五、設(shè)計(jì)方案</b></p><p><b>  5.1 總體設(shè)計(jì)</b></p>&l

40、t;p>  本設(shè)計(jì)采用單機(jī)模式,當(dāng)在規(guī)定的時(shí)間內(nèi)消完全部的圖片則當(dāng)前關(guān)卡通過(guò),如果在規(guī)定的時(shí)間內(nèi)沒(méi)能消完所有的圖片則游戲結(jié)束,重新開(kāi)始新游戲。游戲規(guī)則是模仿普通的連連看游戲,主要是鼠標(biāo)兩次點(diǎn)擊的圖片能否消去的問(wèn)題。當(dāng)前,前提是點(diǎn)擊兩張相同的圖片,若點(diǎn)擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片用三根以?xún)?nèi)的直線能連在一起,就可以消去;否則,不予處理。連連看游戲其結(jié)構(gòu)圖如下:</p><p>

41、<b>  5.2 詳細(xì)設(shè)計(jì)</b></p><p>  5.2.1 游戲界面設(shè)計(jì) </p><p>  游戲界面的設(shè)計(jì)對(duì)于編程人員來(lái)說(shuō),可能算是最簡(jiǎn)單的問(wèn)題,但是,對(duì)于大多數(shù)玩家來(lái)說(shuō),他可能不會(huì)關(guān)心你是怎么實(shí)現(xiàn)的,玩家一開(kāi)始選擇玩這個(gè)游戲,他可能更加關(guān)心的界面是否美觀,是不是能讓他有耳目一新的感覺(jué)。在本次課程設(shè)計(jì)中,主要用 Java中swing界面編程來(lái)實(shí)現(xiàn)[5]。

42、</p><p>  5.2.2鼠標(biāo)點(diǎn)擊控制</p><p>  鼠標(biāo)點(diǎn)擊控制主要表現(xiàn)在游戲的功能控制上,外部的鼠標(biāo)、鍵盤(pán)對(duì)游戲操作的相應(yīng),連連看游戲主要是鼠標(biāo)點(diǎn)擊對(duì)游戲操作的作用,例如:鼠標(biāo)單擊開(kāi)始、結(jié)束選項(xiàng)對(duì)游戲的控制[6]。</p><p>  鼠標(biāo)點(diǎn)擊退出選項(xiàng)退出游戲,程序中由系統(tǒng)觸發(fā)了public void actionPerformed(ActionEv

43、ent e)鼠標(biāo)響應(yīng),添加系統(tǒng)內(nèi)置代碼 System.exit(0);,點(diǎn)擊觸發(fā),退出游戲。</p><p>  鼠標(biāo)點(diǎn)擊選擇游戲區(qū)的圖片響應(yīng)則交予Java系統(tǒng)自動(dòng)響應(yīng)</p><p>  for(int row_i=0;row_i<ROW;row_i++){</p><p>  for(int column_j=0;column_j<COLUMN;c

44、olumn_j++){</p><p>  if(e.getSource()==game_all[row_i][column_j]){//game_all[row_i][column_j].setBackground(Color.red);button_check(row_i+1,column_j+1,game_all[row_i][column_j]);</p><p>

45、;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  5.2.3 路徑判斷的設(shè)計(jì)</p><p>  連連看游戲的所要求的是:兩個(gè)目標(biāo)之間連接線的折點(diǎn)不超過(guò)兩個(gè)。(連接線由x軸和y軸的平行線組成) 那

46、么分析一下連接的情況可以看到,一般分直線連接、一個(gè)折點(diǎn)、兩個(gè)折點(diǎn)三種情況(其理論在第二章已詳述)。</p><p>  其滿足游戲規(guī)則:那么目標(biāo)圖片將順利的消除。否則,繼續(xù)游戲。</p><p>  5.2.4 游戲詳細(xì)過(guò)程流程圖 </p><p>  如圖5.2.4所示:</p><p>  圖5.2.4 游戲過(guò)程流程圖</p>

47、;<p><b>  六、 實(shí)現(xiàn)</b></p><p><b>  6.1 游戲界面</b></p><p>  1、游戲初始界面 如下圖6.1所示</p><p>  游戲界面設(shè)計(jì)比較簡(jiǎn)潔,用swing的JFrame,以及一個(gè)button控件。其已經(jīng)消除的圖片將button隱藏。具體界面如圖6.1所示:&

48、lt;/p><p>  圖6.1 基本界面圖</p><p>  其部分實(shí)現(xiàn)代碼如下:</p><p>  this.setSize(1200, 800); //將窗體的大小設(shè)定</p><p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

49、 //退出游戲時(shí)關(guān)掉進(jìn)程</p><p>  this.setResizable(false); //窗體不能改變大小</p><p>  this.setTitle("連連看"); //設(shè)置標(biāo)題</p><p><b>  /**</b><

50、/p><p>  * 頭部容器init</p><p><b>  */</b></p><p>  JPanel toolBar = new JPanel();</p><p>  Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED

51、, Color.blue,</p><p>  Color.yellow,Color.blue,Color.yellow);</p><p>  toolBar.add(button);</p><p>  button.addActionListener(this);</p><p>  toolBar.setBorder(border);

52、</p><p>  toolBar.setPreferredSize(new Dimension(1200, 50));</p><p><b>  /**</b></p><p>  * 用戶選擇區(qū)init</p><p><b>  */</b></p><p>  J

53、Panel actionPanel = new JPanel(); //新建JPanel型的控件</p><p>  actionPanel.setBorder(border);</p><p>  actionPanel.setPreferredSize(new Dimension(300, 740)); //設(shè)置大小</p><p>

54、;<b>  /**</b></p><p><b>  * 游戲區(qū)init</b></p><p><b>  */</b></p><p>  JPanel contentPanel = new JPanel();</p><p>  GridLayout gridlayo

55、ut = new GridLayout(ROW,COLUMN);</p><p>  contentPanel.setBorder(border);</p><p>  contentPanel.setPreferredSize(new Dimension(900, 740));</p><p>  contentPanel.setLayout(gridla

56、yout); //將游戲區(qū)contentPanel布局改為gridlayout布局</p><p>  this.getContentPane().add(toolBar, BorderLayout.NORTH);</p><p>  this.getContentPane().add(actionPanel, BorderLayout.EAST);</p

57、><p>  this.getContentPane().add(contentPanel, BorderLayout.CENTER);</p><p>  游戲完成界面 如圖6.2所示</p><p><b>  圖6.2 完成界面</b></p><p>  6.2 游戲各功能及代碼</p><p&g

58、t;<b>  1、游戲界面初始化</b></p><p>  public class LLKanTest implements ActionListener {</p><p>  JFrame mainFrame; // 主面板</p><p>  JButton firs

59、tButton, secondButton; // 第一二次選擇button</p><p>  Container thisContainer;</p><p>  JPanel centerPanel, eastPanel, northPanel; //子面板</p><p>  public static int

60、ROW=8,COLUMN=8;</p><p>  JButton game_all[][] = new JButton[ROW][COLUMN]; // 游戲?qū)嶋H按鈕數(shù)組</p><p>  JButton exitButton, resetButton, newlyButton; // 退出,重列,重新開(kāi)始按鈕</p><p>  int game_g

61、rid[][] = new int[10][10];</p><p>  static boolean flag = false; // 判斷是否有按鈕被選中</p><p>  int row1 = 0, column1 = 0, row2 = 0, column2 = 0;</p><p>  int fristMsg =

62、0, secondMsg = 0, validateLV; // 游戲按鈕的位置坐標(biāo)</p><p>  int i, j, k, n; </p><p>  String str="src/images/",str1=".jpg";</p><p>  Im

63、ageIcon icon;</p><p>  public void init() {</p><p>  Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED, Color.blue,</p><p>  Color.yellow,Color.blue,Color.yellow);

64、</p><p>  mainFrame = new JFrame("無(wú)聊連連看");</p><p>  thisContainer = mainFrame.getContentPane(); //得到內(nèi)存中窗體內(nèi)容</p><p>  thisContainer.setLayout(new BorderLayout()); //實(shí)現(xiàn)窗體

65、</p><p>  centerPanel = new JPanel();</p><p>  eastPanel = new JPanel();</p><p>  northPanel = new JPanel();</p><p>  thisContainer.add(centerPanel,"Center");

66、</p><p>  eastPanel.setBorder(border);</p><p>  thisContainer.add(eastPanel,"East");</p><p>  thisContainer.add(northPanel,"North");</p><p>  center

67、Panel.setLayout(new GridLayout(ROW,ROW));</p><p><b>  /**</b></p><p><b>  * 畫(huà)button</b></p><p><b>  */</b></p><p>  for ( row1 = 0;

68、row1 <ROW; row1++) {</p><p>  for ( column1 = 0; column1 < ROW; column1++) { </p><p>  if(game_grid[row1+1][column1+1]>15){</p><p>  game_grid[row1+1][column1+1]=0;</p

69、><p>  game_all[row1][column1]= new JButton();</p><p>  game_all[row1][column1].setBorder(border);</p><p>  centerPanel.add(game_all[row1][column1]);</p><p>  game_all[row

70、1][column1].setVisible(false);</p><p><b>  }else{</b></p><p>  icon = new ImageIcon(str+game_grid[row1+1][column1+1]+str1);</p><p>  game_all[row1][column1] = new JButto

71、n(null,icon);</p><p>  game_all[row1][column1].setBorder(border);</p><p>  game_all[row1][column1].addActionListener(this); //添加響應(yīng)事件</p><p>  centerPanel.add(game_all[row1][column

72、1]);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  newlyButton = new JButton("重玩");</p><p> 

73、 newlyButton.addActionListener(this); </p><p>  resetButton = new JButton("重列");</p><p>  resetButton.addActionListener(this);</p><p>  exitButton = new JButton("退出&

74、quot;);</p><p>  exitButton.addActionListener(this);</p><p>  eastPanel.add(exitButton);</p><p>  eastPanel.add(resetButton);</p><p>  eastPanel.add(newlyButton);</p

75、><p>  mainFrame.setBounds(300, 100, 850, 500);</p><p>  mainFrame.setVisible(true); </p><p>  mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //退出后關(guān)閉程序</p><p

76、><b>  }</b></p><p><b>  2、游戲隨機(jī)布局</b></p><p><b>  /**</b></p><p><b>  * 隨機(jī)布局</b></p><p><b>  */</b></p&

77、gt;<p>  public void randomBuild() {</p><p>  int randoms, col01, row01;</p><p>  for (int ii = 1; ii <= ROW*COLUMN/2; ii++){//一共ROW*COLUMN/2對(duì)button</p><p>  randoms = (in

78、t) (Math.random() * 25 +1);//button上的數(shù)字 </p><p>  for (int jj = 1; jj <= 2; jj++){</p><p>  col01 = (int) (Math.random() * ROW + 1);</p><p>  row01 = (int) (Math.random() * R

79、OW + 1);</p><p>  while (game_grid[col01][row01] != 0) {//等于0說(shuō)明這個(gè)空格有了button</p><p>  col01 = (int) (Math.random() * ROW + 1);</p><p>  row01 = (int) (Math.random() * ROW + 1);</p

80、><p><b>  }</b></p><p>  this.game_grid[col01][row01] = randoms;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&l

81、t;/b></p><p><b>  選擇圖片</b></p><p>  獲取用戶點(diǎn)擊兩張圖片的位置,并傳入xiaochu()函數(shù)進(jìn)行判斷</p><p>  public void estimateEven(int placerow2, int placecolumn2, JButton bz) {</p><p

82、>  if (flag == false) {</p><p>  row2 = placerow2;</p><p>  column2 = placecolumn2;</p><p>  secondMsg = game_grid[row2][column2];</p><p>  secondButton = bz;</p&

83、gt;<p>  flag = true;</p><p><b>  } else {</b></p><p>  row1 = row2;</p><p>  column1 = column2;</p><p>  fristMsg = secondMsg;</p><p> 

84、 firstButton = secondButton;</p><p>  row2 = placerow2;</p><p>  column2 = placecolumn2;</p><p>  secondMsg = game_grid[row2][column2];</p><p>  secondButton = bz;</

85、p><p>  if (fristMsg == secondMsg &&secondButton != firstButton) {//button不同數(shù)字相同則消掉</p><p>  xiaochu();</p><p><b>  }</b></p><p><b>  }</b>

86、;</p><p><b>  }</b></p><p><b>  4、判斷消除圖片</b></p><p>  1. 消除圖片時(shí)要判斷是否可達(dá),即優(yōu)化判斷是否可以消除的算法是本程序的靈魂,連連看游戲分為三種消去方式,分別為“0折型”,“一折型”,“兩折型”,由圖4-5可以看出,如果兩點(diǎn)間只需要一條直線能夠連接起來(lái),則

87、A、B兩點(diǎn)的橫坐標(biāo)或縱坐標(biāo)必定相同,有了這個(gè)條件,我們判斷 A、B兩點(diǎn)是否只需要一條直接連接就簡(jiǎn)單了許多。</p><p><b>  其分析如下:</b></p><p><b>  1.“0折型”:</b></p><p>  水平消去或者垂直消去,如果兩個(gè)點(diǎn)擊的兩個(gè)圖片相同,并且它們?cè)谕凰交虼怪狈较蛏?,即返回H_

88、LINE的畫(huà)線類(lèi)型,代碼如下:</p><p>  if ((row1 == row2 && (column1 == column2 + 1 || column1 ==column2 - 1))</p><p>  || ((row1 == row2 + 1 || row1 == row2 - 1) &&(column1 == column2))) { //

89、 判斷是否相鄰</p><p>  remove();}</p><p>  2.“一折型”,當(dāng)點(diǎn)擊的兩個(gè)點(diǎn)相同,它們不在同一水平或垂直方向上,并且它們要用</p><p>  兩條直線相連,就返回ONE_C_LINE,代碼如:</p><p>  for (j = 0; j < 10; j++) {</p><p&

90、gt;  if (game_grid[row1][j] == 0) {// 判斷和第一個(gè)按鈕同行的哪個(gè)按鈕為空</p><p>  if (column2 > j) {//第二個(gè)按鈕在空按鈕右邊</p><p>  for (i = column2 - 1; i >= j; i--) { //檢測(cè)從第二個(gè)按鈕橫向左邊到空格所在列為止是否全是空格</p><p

91、>  if (game_grid[row2][i] != 0) {</p><p><b>  k = 0;</b></p><p><b>  break;</b></p><p><b>  } else {</b></p><p><b>  k = 1;

92、</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  if (k == 1) {</p><p>  line_check();//進(jìn)入第二次驗(yàn)證,也就是從第一個(gè)按鈕到它同行的空格之間的空格判斷</p><p&

93、gt;<b>  }</b></p><p><b>  }</b></p><p>  if (column2 < j) {// 第二個(gè)按鈕在空按鈕左邊</p><p>  for (i = column2 + 1; i <= j; i++) {//檢測(cè)從第二個(gè)按鈕橫向右邊到空格所在列為止是否全是空格<

94、/p><p>  if (game_grid[row2][i] != 0) {</p><p><b>  k = 0;</b></p><p><b>  break;</b></p><p><b>  } else {</b></p><p><

95、b>  k = 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (k == 1) {</p><p>  line_check();</p><p><b>  }</b

96、></p><p><b>  }</b></p><p>  if (column2 == j) {//第二個(gè)按鈕和空按鈕同列</p><p>  line_check();</p><p><b>  }</b></p><p><b>  }</b

97、></p><p>  3.“兩折型”,當(dāng)點(diǎn)擊的兩個(gè)點(diǎn)相同,它們不在同一水平或垂直方向上,并且它們要用三條直線相連,就返回TWO_C_LINE,代碼如下:</p><p>  if (k == 2) {</p><p>  if (row1 == row2) {//第一,二按鈕在同行</p><p><b>  remove(

98、);</b></p><p><b>  }</b></p><p>  if (row1 < row2) {//第二按鈕在第一按鈕下邊</p><p>  for (n = row1; n <= row2 - 1; n++) {//從空按鈕豎向到第二個(gè)按鈕所在行是否有按鈕</p><p>  i

99、f (game_grid[n][j] != 0) {</p><p><b>  k= 0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  //沒(méi)有按鈕,說(shuō)明這條路經(jīng)就通了</p><p

100、>  if (game_grid[n][j] == 0 && n == row2 -1) {//在某一列第一二按鈕是空按鈕連接</p><p><b>  remove();</b></p><p><b>  }</b></p><p><b>  }</b></p>

101、;<p><b>  }</b></p><p>  if (row1 > row2) {//第一按鈕在第二按鈕上邊</p><p>  for (n = row1; n >= row2 + 1; n--) {</p><p>  if (game_grid[n][j] != 0) {</p><p

102、><b>  k = 0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  if (game_grid[n][j] == 0 && n == row2 +1) {</p><p><

103、;b>  remove();</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

104、<b>  消除圖片代碼</b></p><p>  public void remove() {</p><p>  firstButton.setVisible(false);</p><p>  secondButton.setVisible(false);</p><p>  flag = false;</

105、p><p><b>  k = 0;</b></p><p>  game_grid[row1][column1] = 0;</p><p>  game_grid[row2][column2] = 0;</p><p><b>  }</b></p><p><b>

106、  七 、總結(jié)</b></p><p>  課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.</p><p>  回顧此次連連看游戲設(shè)計(jì),從理論到實(shí)踐,學(xué)到了很多很多的東西的同時(shí)也意識(shí)到不足,由于以前對(duì)Java的swing編程不是很熟悉,所以在寫(xiě)代碼時(shí)遇到了一些問(wèn)題。如:游戲界面的布局在重列的

107、時(shí)候其button有可能顯示不完全,</p><p>  連連看其判斷路徑的算法開(kāi)始編寫(xiě)時(shí)有漏洞等。</p><p>  這次連連看設(shè)計(jì)實(shí)現(xiàn)了:游戲界面的窗體實(shí)現(xiàn),連連看消除路徑的判斷算法,button界面布局,button的背景圖片set寫(xiě)入,相關(guān)游戲區(qū)總體布局以及玩家的人機(jī)互動(dòng)性操作。</p><p>  這個(gè)連連看游戲還諸多不足之處,如:沒(méi)有實(shí)現(xiàn)玩家排行榜設(shè)計(jì)

108、,游戲內(nèi)容設(shè)計(jì),趣味性不足等。關(guān)于后續(xù)改進(jìn)方案如下:實(shí)現(xiàn)已有不足之處,以及根據(jù)自己的技術(shù)去實(shí)現(xiàn)連連看局域網(wǎng)對(duì)戰(zhàn),玩家互動(dòng)性操作等。</p><p>  總體上這次連連看游戲設(shè)計(jì)讓我懂得:實(shí)踐才是真理。而你所想到的并不一定能夠完全實(shí)現(xiàn)。</p><p><b>  八、參考資料</b></p><p>  [1] 朱福喜. J

109、ava語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)[M], 武漢: 武漢大學(xué)出版社,2006:123-130 </p><p>  [2] 印旻. Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)[M],北京: 清華大學(xué)出版社,2005.4: 58-72 </p><p>  [3] 朱站立、沈偉. Java程序設(shè)計(jì)實(shí)用教程[M]

110、, 北京: 電子工業(yè)出版社, 2007.5: 82-95 </p><p>  [4] 葉核亞. Java 2程序設(shè)計(jì)實(shí)用教程[M], 北京: 電子工業(yè)出版  ,2008:35-48</p><p>  [5] 艾力江. Java 2 范例入

溫馨提示

  • 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ù)僅提供信息存儲(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)論