版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘要</b></p><p> 關(guān)鍵字:發(fā)展,java,連連看,程序設(shè)計(jì);</p><p> 現(xiàn)代科學(xué)技術(shù)的發(fā)展,改變了人類(lèi)的生活,作為新世紀(jì)的大學(xué)生,應(yīng)該站在時(shí)代發(fā)展的前沿,掌握現(xiàn)代科學(xué)技術(shù)知識(shí),以適應(yīng)社會(huì)的發(fā)展,能夠獨(dú)立完成面臨的任務(wù),作一名有創(chuàng)新意識(shí)的新型人才。</p><p> Java語(yǔ)言的學(xué)習(xí)熱潮
2、并沒(méi)有因?yàn)闀r(shí)間的推移而消退,相反,由于計(jì)算機(jī)技術(shù)的發(fā)展所帶來(lái)的新應(yīng)用的出現(xiàn),Java越來(lái)越流行,這種情況是以往程序設(shè)計(jì)語(yǔ)言在其生存周期內(nèi)所不多見(jiàn)的。Java語(yǔ)言之所以這樣長(zhǎng)盛不衰,一是因?yàn)槠浔姸嗟募夹g(shù)特點(diǎn)與現(xiàn)今的應(yīng)用十分合拍,可以覆蓋大部分的需求;二是因?yàn)镾UN公司不斷推出新的版本,完善Java自身的功能。有了這兩點(diǎn),Java語(yǔ)言成為程序員首選的程序設(shè)計(jì)開(kāi)發(fā)工具就在情理之中了。</p><p> 連連看游戲是一
3、種很流行的小游戲,記得在小時(shí)候去游戲廳玩的時(shí)候就有兩臺(tái)專(zhuān)門(mén)的連連看的機(jī)器(當(dāng)然當(dāng)時(shí)不叫這個(gè)名字),一個(gè)是連麻將牌、另一個(gè)是連水果圖片。當(dāng)時(shí)的麻將牌分好幾層,相鄰層的牌還可以連,看得人眼花繚亂。作為一個(gè)java初學(xué)者,我所編輯的“悠嘻猴連連看”小游戲,只有幾個(gè)基本功能:“開(kāi)始”“再來(lái)一局”炸彈“重新開(kāi)始”“退出”。我所選中給出的游戲界面很漂亮,不過(guò)似乎圖形只有一層,而且數(shù)量也不是很多,只有64張圖,降低了不少難度。</p>
4、<p><b> 目 錄</b></p><p><b> 摘要I</b></p><p> 第1章 需求分析1</p><p> 1.1 功能分析1</p><p><b> 1.2 流程圖2</b></p><p>
5、; 第2章 詳細(xì)設(shè)計(jì)3</p><p> 2.1課程設(shè)計(jì)目的3</p><p> 2.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境3</p><p> 2.3 課程設(shè)計(jì)的預(yù)備知識(shí)3</p><p> 2.4 課程設(shè)計(jì)要求3</p><p> 2.5 連連看算法設(shè)計(jì)4</p><p> 2.6
6、類(lèi)的實(shí)現(xiàn)方法4</p><p> 2.6.1 成員變量4</p><p> 2.6.2 方法設(shè)計(jì)5</p><p> 第3章 測(cè)試分析7</p><p> 3.1程序運(yùn)行情況7</p><p> 3.2測(cè)試計(jì)劃及分析9</p><p> 3.2.1檢驗(yàn)的先后順序9<
7、;/p><p> 3.2.2程序異常處理9</p><p> 第4章 課程設(shè)計(jì)總結(jié)10</p><p><b> 附件A1</b></p><p><b> 參考資料26</b></p><p> 第1章 需求分析 </p><p>
8、<b> 1.1 功能分析</b></p><p> 每次用戶(hù)選擇兩個(gè)圖形,如果圖形滿(mǎn)足一定條件(兩個(gè)圖形一樣,且這兩個(gè)圖形之間存在轉(zhuǎn)彎少于3的路徑),則兩個(gè)圖形都能消掉。給定任意具有相同圖形的兩個(gè)格子,我們需要尋找這兩個(gè)格子之間在轉(zhuǎn)彎最少的情況下,經(jīng)過(guò)格子數(shù)目最少的路徑。如果這個(gè)最優(yōu)路徑的轉(zhuǎn)彎數(shù)目少于3 ,則這兩個(gè)格子可以消去。</p><p> 將界面中相同
9、的猴子圖片消去,游戲限時(shí)1000秒,如果在規(guī)定的時(shí)間內(nèi)沒(méi)有完成,就會(huì)跳出對(duì)話框“笨蛋!游戲時(shí)間到!GAME OVER ?。?!”的字樣。如果玩家贏了這局,還沒(méi)有過(guò)癮的話,可以單擊“再來(lái)一局”。判斷游戲是否結(jié)束。如果所有圖形全部消去,或者游戲玩家不可能再消去任意兩個(gè)格子的時(shí)候,游戲應(yīng)該結(jié)束。后一種情況,我們稱(chēng)之為“死鎖”。</p><p> 在死鎖的情況下,我們也可以暫時(shí)不終止游戲,而是隨機(jī)打亂局面,使得打破“死鎖
10、”局面。不管怎樣,我們需要判別游戲當(dāng)前狀態(tài)是否為“死鎖”狀態(tài)。我們首先思考問(wèn)題:怎么判斷兩個(gè)圖形能否相消?前面分析中,我們已經(jīng)知道,兩個(gè)圖形能夠相消,當(dāng)且僅當(dāng)這兩個(gè)圖形相同,且它們之間存在路徑轉(zhuǎn)彎數(shù)目小于3。</p><p> 因此,我們主要需要解決的問(wèn)題還是,怎樣求出相同圖形之間的最短路徑?這個(gè)最短的路徑,我們首先需要保證轉(zhuǎn)彎數(shù)目最少。在轉(zhuǎn)彎數(shù)目最少的情況下,經(jīng)過(guò)的格子數(shù)目要盡可能地少。</p>
11、<p> 在經(jīng)典的最短路問(wèn)題中,我們需要求出經(jīng)過(guò)格子數(shù)目最少的路徑。而這里,要保證轉(zhuǎn)彎數(shù)目最少,需要把最短路問(wèn)題的目標(biāo)函數(shù)修改為從一個(gè)點(diǎn)到另一個(gè)點(diǎn)的轉(zhuǎn)彎次數(shù)。雖然,目標(biāo)函數(shù)修改了,但算法的框架仍然可以保持不變。廣度優(yōu)先搜索是解決經(jīng)典最</p><p> 短路問(wèn)題的一個(gè)思路。我們看看在新的目標(biāo)函數(shù)(轉(zhuǎn)彎數(shù)目最少)下,如何用廣度優(yōu)先搜索來(lái)解決圖形A(x1,y1)和圖形B(x2,y2)之間的最短路問(wèn)題。
12、</p><p><b> 1.2 流程圖</b></p><p><b> 第2章 詳細(xì)設(shè)計(jì)</b></p><p><b> 2.1課程設(shè)計(jì)目的</b></p><p> 《JAVA程序設(shè)計(jì)》是計(jì)算機(jī)相關(guān)專(zhuān)業(yè)的必修專(zhuān)業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必
13、不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專(zhuān)題實(shí)際是計(jì)算機(jī)相關(guān)專(zhuān)業(yè)學(xué)生學(xué)習(xí)完《JAVA程序設(shè)計(jì)》課程后,進(jìn)行的一次全面的綜合訓(xùn)練,JAVA程序設(shè)計(jì)的設(shè)計(jì)目的是加深對(duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計(jì)及其在網(wǎng)絡(luò)開(kāi)發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識(shí),利用軟件工程為基礎(chǔ)進(jìn)行軟件開(kāi)發(fā)、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。</p><p> 2.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境</p>&
14、lt;p> 硬件要求能運(yùn)行Windows 9.X操作系統(tǒng)的微機(jī)系統(tǒng)。JAVA程序設(shè)計(jì)語(yǔ)言及相應(yīng)的集成開(kāi)發(fā)環(huán)境,UltraEdit-32開(kāi)發(fā)工具。</p><p> 2.3 課程設(shè)計(jì)的預(yù)備知識(shí)</p><p> 熟悉JAVA語(yǔ)言及UltraEdit-32開(kāi)發(fā)工具。</p><p> 2.4 課程設(shè)計(jì)要求</p><p> 按課程
15、設(shè)計(jì)指導(dǎo)書(shū)提供的課題,要求學(xué)生在自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且達(dá)到舉一反三的目的,完成一個(gè)項(xiàng)目解決一類(lèi)問(wèn)題。要求學(xué)生能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、設(shè)計(jì)和解答類(lèi)似問(wèn)題;對(duì)此能夠較好地理解和掌握,能夠進(jìn)行簡(jiǎn)單分析和判斷;能編寫(xiě)出具有良好風(fēng)格的程序;掌握J(rèn)AVA程序設(shè)計(jì)的基本技能和面向?qū)ο蟮母拍詈头椒?;了解多線程、安全和網(wǎng)絡(luò)等編程技術(shù)。同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問(wèn)題、解決問(wèn)題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作
16、與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。</p><p> 2.5 連連看算法設(shè)計(jì)</p><p> 在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿(mǎn)足兩個(gè)條件才行,就是兩者配對(duì)并且連線成功。</p><p> * 分3種情況:(從下面的這三種情況,我們可以知道,需要三個(gè)檢測(cè),這三個(gè)檢測(cè)分別檢測(cè)一條直路經(jīng)。這樣就會(huì)有三條路經(jīng)。若這三條路經(jīng)上都是空按鈕
17、,那么就剛好是三種直線(兩個(gè)轉(zhuǎn)彎點(diǎn))把兩個(gè)按鈕連接起來(lái)了)</p><p><b> * 1.相鄰 </b></p><p> * 2. 若不相鄰的先在第一個(gè)按鈕的同行找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕橫向到這個(gè)空按鈕所在的列是否有按鈕。2).沒(méi)有的話再看第一個(gè)按鈕到與它同行的那個(gè)空按鈕之間是否有按鈕。3).沒(méi)有的話,再?gòu)呐c第一個(gè)按鈕同行的那個(gè)空按鈕豎向到與
18、第二個(gè)按鈕的同行看是否有按鈕。沒(méi)有的話路經(jīng)就通了,可以消了. </p><p> * 3.若2失敗后,再在第一個(gè)按鈕的同列找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕豎向到這個(gè)空按鈕所在的行是否有按鈕 2).沒(méi)有的話,再看第一個(gè)按鈕到與它同列的那個(gè)空按鈕之間是否有按鈕。3).沒(méi)有的話,再?gòu)呐c第一個(gè)按鈕同列的那個(gè)空按鈕橫向到與第二個(gè)按鈕同列看是否有按鈕。沒(méi)有的話路經(jīng)就通了,可以消了。</p><p&
19、gt; * 若以上三步都失敗,說(shuō)明這兩個(gè)按鈕不可以消去。</p><p><b> 2.6類(lèi)的實(shí)現(xiàn)方法</b></p><p> 2.6.1 成員變量</p><p> 成員變量也叫類(lèi)的屬性,一般帶有訪問(wèn)控制屬性的,而全局變量雖然也有類(lèi)的屬性,但全局變量嚴(yán)重影響了封裝和模塊化,一般的全局變量前面要加上static和 fina屬性其中,
20、static使該變量任何類(lèi)都可用(方法 ClassName.全局變量名) ,而 fina則使得變量不可更改,基本上算是常量了,這也在一定程度上防止對(duì)變量的非法修改。</p><p> 表 2-6-1 成員變量 </p><p> 2.6.2 方法設(shè)計(jì)</p><p> 方法名稱(chēng)為任何合乎語(yǔ)法的識(shí)別字,返回值類(lèi)型是方法執(zhí)行結(jié)果返回給調(diào)用者的數(shù)據(jù)類(lèi)型,void表
21、示沒(méi)有返回值,參數(shù)行(parameter list)是調(diào)用時(shí)給予的參數(shù)聲明,兩個(gè)以上的參數(shù)聲明以逗號(hào)隔開(kāi),若沒(méi)有參數(shù)則參數(shù)行為空白,調(diào)用時(shí)每一個(gè)參數(shù)對(duì)應(yīng)一個(gè)參數(shù)值(argument)大括號(hào)內(nèi)為方法本體,也稱(chēng)為方法程序模塊(block),包含聲明(declarations)和語(yǔ)句(statements),聲明也可以摻雜在語(yǔ)句之間。一個(gè)方法不能聲明在另一個(gè)方法內(nèi)。</p><p> 表 2-6-2 方
22、法定義</p><p><b> 第3章 測(cè)試分析</b></p><p><b> 3.1程序運(yùn)行情況</b></p><p> 連連看游戲規(guī)則很簡(jiǎn)單,就是點(diǎn)中兩個(gè)互相匹配并且可以通過(guò)不多于兩個(gè)折點(diǎn)的折線連在一起的方塊后,這兩個(gè)方塊就可以消掉。</p><p><b> 圖1初始
23、界面</b></p><p> 菜單選項(xiàng)中,包括“開(kāi)始游戲”、“重新開(kāi)始”、“炸彈”、“退出”功能。</p><p> 當(dāng)選擇炸彈功能時(shí):每次含有三個(gè)炸彈,所炸的位置也是隨機(jī)的;</p><p><b> 圖2 游戲界面</b></p><p> 粗略想來(lái),由于用戶(hù)每次只能消除一對(duì)圖形,即只會(huì)用到一個(gè)
24、最短路徑,但由于實(shí)現(xiàn)并不知道用戶(hù)會(huì)選擇哪一對(duì)圖形,所以需要事先計(jì)算出所有可能的最短路徑并保存起來(lái)。此外,采用這種方法的話似乎每次用戶(hù)消去一對(duì)相同圖像之后都需要重新計(jì)算出當(dāng)前所有可能被連接的相同圖形之間最短路徑,這是因?yàn)楫?dāng)某些圖像被消去之后可能會(huì)產(chǎn)生很多新路徑,而我們又不能確定這些空出來(lái)的格子到底能夠影響哪些路徑,所以就只好都重新計(jì)算一遍。其缺點(diǎn)很明顯就是每次消去圖形動(dòng)作之后重新計(jì)算所有可能的最短路徑所需要消耗的時(shí)間;而該方法的優(yōu)點(diǎn)則是可
25、以很快地判斷兩個(gè)相同圖形之間是否存在滿(mǎn)足條件的最短路徑。</p><p> 如果用戶(hù)很厲害,每次都能選中可以消除的圖形對(duì),那么用這種方法浪費(fèi)的時(shí)間就會(huì)相當(dāng)可觀,畢竟用戶(hù)未選中的其他可以連接的圖形對(duì)之間的最短路徑都被浪費(fèi)掉了;而如果用戶(hù)很差勁,每輪選擇的次數(shù)都遠(yuǎn)遠(yuǎn)大于當(dāng)前可能的連接數(shù)量時(shí),該方法就會(huì)比書(shū)中正文提到的方法高效。但這種情況是比較少的,因?yàn)樵谡麄€(gè)游戲中用戶(hù)主要是會(huì)用眼睛“找”而不是頻繁的用鼠標(biāo)去“試”。
26、所以總的來(lái)看,維護(hù)所有最短路徑的方法的效率相對(duì)比較低。游戲結(jié)束后,在頁(yè)面出現(xiàn)對(duì)話框,詢(xún)問(wèn)玩家是否進(jìn)行下一局。</p><p> 3.2測(cè)試計(jì)劃及分析</p><p> 3.2.1檢驗(yàn)的先后順序</p><p> 在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿(mǎn)足兩個(gè)條件才行,就是兩者配對(duì)并且連線成功。所以,這里應(yīng)該先檢驗(yàn)配對(duì),如果該條件不成立的話,就不要再
27、進(jìn)行連線檢查了,這樣可以避免很多不必要的復(fù)雜運(yùn)算。當(dāng)然,如果你在做這個(gè)游戲的時(shí)候,配對(duì)規(guī)則不夠如此簡(jiǎn)單的話,那么就看哪個(gè)算起來(lái)麻煩就把它放在后面。</p><p> 3.2.2程序異常處理</p><p> 本程序沒(méi)有涉及到程序的異常處理,只有關(guān)于“死鎖”問(wèn)題,本質(zhì)上還是判別兩個(gè)格子是否可以消去的問(wèn)題。最直接的方法就是,對(duì)于游戲中尚未消去的格子,兩兩都計(jì)算一下,它們是否可以消去。此外,
28、從上面的廣度優(yōu)先搜索可以看出,我們每次都是擴(kuò)展出起始格子A(x1,y1)能夠到達(dá)的格子。也就是說(shuō),對(duì)于每一個(gè)格子,我們可以調(diào)用一次上面的擴(kuò)展過(guò)程,得到所有可以到達(dá)的格子,如果這些格子中有任意一個(gè)跟起始格子的圖形一致,則它們可以消去,目前游戲還不是“死鎖”狀態(tài)。</p><p> 第4章 課程設(shè)計(jì)總結(jié)</p><p> 通過(guò)這次課程設(shè)計(jì)還使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知
29、識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,并且還發(fā)現(xiàn)了自己的許多不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固。但通過(guò)這次課程設(shè)計(jì)之后,一定把以前所學(xué)過(guò)的知識(shí)重新溫故。</p><p> 我完成了這次JAVA課程設(shè)計(jì),不過(guò)這只是我學(xué)習(xí)路上的驛站。我相信我在未來(lái)的學(xué)
30、習(xí)中會(huì)記住從本次課程設(shè)計(jì)中所學(xué)到的東西,并將它用到未來(lái)的學(xué)習(xí)中去。在這里謝謝老師的指導(dǎo),我會(huì)更加努力的學(xué)習(xí)</p><p><b> 附件A</b></p><p> ********************************************************** </p><p> * 類(lèi)名: MainFrame&l
31、t;/p><p> * 作用: 自定義主類(lèi),對(duì)鼠標(biāo)拖拽的初始界面進(jìn)行聲明* </p><p> * 繼承的父類(lèi): JFrame類(lèi) * </p><p> * 實(shí)現(xiàn)的接口: Strings* </p><p> ********************************************************** </p
32、><p> import java.awt.*;</p><p> import javax.swing.*;</p><p> import cn.elva.Settings;</p><p> import cn.elva.model.Map;</p><p> public class MainFrame
33、extends JFrame{</p><p> private static final long serialVersionUID = 1L;</p><p><b> //炸彈的次數(shù)</b></p><p> private int bombCount = Settings.BOMBCOUNT;</p><p&g
34、t; private JPanel jContentPane = null;</p><p> private JMenuBar menuBar = null;</p><p> private JMenu fileMenu = null;</p><p> private JMenuItem reloadItem = null;</p>&l
35、t;p> private JMenuItem startItem = null;</p><p><b> //炸彈</b></p><p> private JMenuItem bombItem = null;</p><p> private JMenuItem exitItem = null;</p><
36、p> private MapUI mapUI = null;</p><p><b> // 游戲開(kāi)始時(shí)間</b></p><p> private long startTime;</p><p><b> // 結(jié)束時(shí)間</b></p><p> private long endT
37、ime;</p><p> private Timer timer = null;</p><p> // private JMenuItem ti</p><p> private JMenuBar initMenuBar(){</p><p> if (menuBar == null){</p><p>
38、 menuBar = new JMenuBar();</p><p> fileMenu = new JMenu("菜單");</p><p> startItem = new JMenuItem("開(kāi)始游戲");</p><p> startItem.addActionListener(new ActionListen
39、er(){</p><p> public void actionPerformed(ActionEvent e){</p><p><b> reload();</b></p><p><b> }</b></p><p><b> });</b></p>
40、<p> reloadItem = new JMenuItem("重新開(kāi)始");</p><p> reloadItem.addActionListener(new ActionListener(){</p><p> public void actionPerformed(ActionEvent e){</p><p>&l
41、t;b> reload();</b></p><p><b> }</b></p><p><b> });</b></p><p> bombItem = new JMenuItem("炸彈");</p><p> bombItem.addActio
42、nListener(new ActionListener(){</p><p> public void actionPerformed( ActionEvent e ){</p><p> if( bombCount==0 ){</p><p> JOptionPane.showMessageDialog(MainFrame.this,"三枚炸彈已
43、用完!!!" );</p><p> bombItem.setEnabled(false);</p><p><b> return;</b></p><p><b> }</b></p><p> mapUI.bomb();</p><p> bombC
44、ount--;</p><p><b> }</b></p><p><b> });</b></p><p> exitItem = new JMenuItem("退出");</p><p> exitItem.addActionListener(new ActionL
45、istener(){</p><p> public void actionPerformed(ActionEvent e){</p><p> System.exit(0);</p><p><b> }</b></p><p><b> });</b></p><p&
46、gt; fileMenu.add(startItem);</p><p> fileMenu.add(reloadItem);</p><p> fileMenu.add( bombItem );</p><p> fileMenu.add(exitItem);</p><p> menuBar.add(fileMenu);<
47、/p><p><b> }</b></p><p> return menuBar;</p><p><b> }</b></p><p> public static void main(String[] args){</p><p> // 自動(dòng)生成方法存根<
48、;/p><p> SwingUtilities.invokeLater(new Runnable(){</p><p> public void run(){</p><p> MainFrame thisClass = new MainFrame();</p><p> thisClass.setDefaultCloseOperatio
49、n(JFrame.EXIT_ON_CLOSE);</p><p> thisClass.setVisible(true);</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><
50、;p> public MainFrame(){</p><p><b> super();</b></p><p> initialize();</p><p><b> }</b></p><p> private void initialize(){</p><
51、;p> this.setSize(650, 650);</p><p> this.setTitle("llk");</p><p> this.setJMenuBar(initMenuBar());</p><p> this.setTitle("悠嘻猴連連看");</p><p>&l
52、t;b> }</b></p><p> private void reload(){</p><p> mapUI = new MapUI();</p><p> startTime = System.currentTimeMillis() / 1000;</p><p> endTime = startTime
53、+ Settings.PERTIME;</p><p> jContentPane = new JPanel();</p><p> jContentPane.setLayout(new BorderLayout());</p><p> jContentPane.add(mapUI);</p><p> this.setConten
54、tPane(jContentPane);</p><p> this.validate();</p><p> Map.LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;</p><p> initTimer();</p><p> bombItem.setEnabled(true);</
55、p><p> bombCount=Settings.BOMBCOUNT;</p><p><b> }</b></p><p> private void initTimer(){</p><p> ActionListener actionListener = new ActionListener(){</p
56、><p> public void actionPerformed(ActionEvent e){</p><p> startTime = System.currentTimeMillis() / 1000;</p><p> if (startTime == endTime){</p><p> JOptionPane.showMes
57、sageDialog(MainFrame.this, "笨蛋!時(shí)間到! GAME OVER!!");</p><p> int result = JOptionPane.showConfirmDialog(MainFrame.this,</p><p> "重玩一次?", "Again", JOptionPane.YES_NO
58、_CANCEL_OPTION);</p><p> if (result == JOptionPane.YES_OPTION){</p><p><b> reload();</b></p><p><b> }</b></p><p><b> else{</b>&l
59、t;/p><p> jContentPane.setVisible(false);</p><p> validate();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></
60、p><p><b> };</b></p><p> timer = new javax.swing.Timer(1000, actionListener);</p><p> timer.start();</p><p><b> }</b></p><p><b
61、> }</b></p><p> ********************************************************** </p><p> * 類(lèi)名: MapUI</p><p> * 作用: 定義按鈕和炸彈功能* </p><p> * 繼承的父類(lèi): JPanel類(lèi) * </
62、p><p> * 實(shí)現(xiàn)的接口: Stings * </p><p> ********************************************************** </p><p> import java.awt.*;</p><p> import javax.swing.*;</p><p
63、> import cn.elva.Settings;</p><p> import cn.elva.model.ArrayPoint;</p><p> import cn.elva.model.Map;</p><p> public class MapUI extends JPanel implements ActionListener{<
64、/p><p> private static final long serialVersionUID = 1L;</p><p> // 棋子數(shù)組,用按鈕來(lái)表示</p><p> private ChessButton[] chesses = null;</p><p><b> // 數(shù)據(jù)模型</b></p&
65、gt;<p> private Map map = new Map();</p><p> // 判斷當(dāng)前點(diǎn)擊的棋子是否是第二次選中的</p><p> private boolean two = false;</p><p> // 前面點(diǎn)的那個(gè)棋子</p><p> private ArrayPoint privi
66、ousPoint;</p><p> // 第二次選中的棋子</p><p> private ArrayPoint currPoint;</p><p><b> // 構(gòu)造函數(shù)</b></p><p> public MapUI(){</p><p><b> super(
67、);</b></p><p> initialize();</p><p><b> }</b></p><p><b> // 初始化函數(shù)</b></p><p> private void initialize(){</p><p> initChe
68、sses();</p><p> GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,</p><p> Settings.COLUMNS + 2);</p><p> gridLayout.setHgap(2);</p><p> gridLayout.setVgap(2
69、);</p><p> this.setLayout(gridLayout);</p><p> this.setSize(300, 200);</p><p> // 放置按鈕,按行</p><p> for (int row = 0; row < Settings.ROWS + 2; row++){</p>&
70、lt;p> for (int col = 0; col < Settings.COLUMNS + 2; col++){</p><p> add(chesses[row * (Settings.COLUMNS + 2) + col]);</p><p><b> }</b></p><p><b> }</b
71、></p><p><b> }</b></p><p> private void initChesses(){</p><p> int[][] values = map.getMap();</p><p> // 初始化棋子,和數(shù)據(jù)模型里保持一樣 </p><p>
72、 this.chesses = new ChessButton[(Settings.ROWS + 2)</p><p> * (Settings.COLUMNS + 2)];</p><p> for (int row = 0; row < 10; row++){</p><p> for (int col = 0; col < 10; col+
73、+){</p><p> // 通過(guò)二維的數(shù)據(jù)模型坐標(biāo)得到一維的棋子坐標(biāo) </p><p> int index = row * (Settings.COLUMNS + 2) + col;</p><p> // 對(duì)棋子的數(shù)據(jù)模型,即ArrayPoint對(duì)象進(jìn)行設(shè)置,指定此棋子具體的位置和值</p><p> chesse
74、s[index] = new ChessButton(row, col, values[row][col]);</p><p><b> // 添加監(jiān)聽(tīng)器</b></p><p> chesses[index].addActionListener(this);</p><p> // 將外圍的一圈設(shè)為不可見(jiàn),行,列為0 和為最大值的情況&
75、lt;/p><p> if (row == 0 || row == (Settings.ROWS + 2 - 1) || col == 0</p><p> || col == (Settings.COLUMNS + 2 - 1)){</p><p> chesses[index].setVisible(false);</p><p>&l
76、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> public void clearCheese(ArrayPoint priviousPoint
77、, ArrayPoint currPoint){</p><p> // 處理匹配,看兩點(diǎn)是否聯(lián)通</p><p> int[][] values = map.getMap();</p><p> // 將模型中對(duì)應(yīng)的棋子設(shè)為0</p><p> values[priviousPoint.getI()][priviousPoint.g
78、etJ()] = 0;</p><p> values[currPoint.getI()][currPoint.getJ()] = 0;</p><p> // 使兩個(gè)已經(jīng)消除的按鈕不可見(jiàn)</p><p> int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)</p><p&g
79、t; + priviousPoint.getJ();</p><p> int index2 = currPoint.getI() * (Settings.COLUMNS + 2)</p><p> + currPoint.getJ();</p><p> chesses[index1].setVisible(false);</p><p
80、> chesses[index2].setVisible(false);</p><p> // 如果棋子總數(shù)已為0,則程序結(jié)束</p><p> if (map.LEFTCOUNT == 0){</p><p> JOptionPane.showMessageDialog(this, "恭喜您通過(guò)!!");</p>
81、<p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 事件監(jiān)聽(tīng)器處理函數(shù),也是處理棋子消除的地方</p><p><b> */</b></p>
82、<p> public void actionPerformed(ActionEvent e){</p><p> // 獲得當(dāng)前的柜子</p><p> ChessButton button = (ChessButton) e.getSource();</p><p> // 獲得當(dāng)前棋子的數(shù)據(jù)結(jié)構(gòu)</p><p>
83、ArrayPoint p = button.getPoint();</p><p> // 如果已有兩個(gè)棋子選中, 則進(jìn)行判斷操作</p><p><b> if (two){</b></p><p> currPoint = p;</p><p> if( map.match(this.priviousPoin
84、t, this.currPoint)){</p><p> clearCheese(this.priviousPoint, this.currPoint);</p><p><b> }</b></p><p> // 設(shè)置為沒(méi)有兩個(gè)按鈕的選中的狀態(tài)</p><p> two = false;</p>
85、<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> // 將當(dāng)前點(diǎn)擊的棋子賦給變量priviousPoint</p><p> this.priviousPoint = p;&
86、lt;/p><p> // 標(biāo)志位設(shè)為T(mén)RUE,用于點(diǎn)擊下個(gè)棋子的時(shí)候使用</p><p> two = true;</p><p><b> }</b></p><p><b> }</b></p><p><b> //炸彈的功能</b><
87、;/p><p> public void bomb(){</p><p> int[][] values = map.getMap();</p><p> ArrayPoint p1 = null;</p><p> ArrayPoint p2 = null;</p><p> for (int row = 1;
88、 row < Settings.ROWS + 1; row++){</p><p> for (int col = 1; col < Settings.COLUMNS + 1; col++){</p><p> if (values[row][col] != 0){</p><p> p1 = new ArrayPoint(row, col, va
89、lues[row][col]);</p><p> for (int i = 1; i < Settings.ROWS + 1; i++){</p><p> for (int j = 1; j < Settings.COLUMNS + 1; j++){</p><p> if (values[i][j] != 0){</p><
90、;p> p2 = new ArrayPoint(i, j, values[i][j]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> continue
91、;</b></p><p><b> }</b></p><p> if (map.match(p1, p2)){</p><p> clearCheese(p1, p2);</p><p><b> return;</b></p><p><b&g
92、t; }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }
93、</b></p><p><b> }</b></p><p><b> }</b></p><p> ********************************************************** </p><p> * 類(lèi)名: ChessButton&
94、lt;/p><p> * 作用: 初始化游戲中鼠標(biāo)點(diǎn)擊按鈕* </p><p> * 繼承的父類(lèi): JButton類(lèi) * </p><p> * 實(shí)現(xiàn)的接口: 沒(méi)有 * </p><p> ********************************************************** </p><
95、p> import java.net.*;</p><p> import javax.swing.*;</p><p> import cn.elva.Settings;</p><p> import cn.elva.model.ArrayPoint;</p><p> public class ChessButton e
96、xtends JButton{</p><p> protected ArrayPoint point = null;</p><p> public ChessButton(int row, int col, int value){</p><p> this(new ArrayPoint(row, col, value));</p><
97、p><b> }</b></p><p> public ChessButton(ArrayPoint point){</p><p> this.point = point;</p><p> String name ="Resource/"+point.getValue() + Settings.RELEX
98、;</p><p> URL url = ChessButton.class.getResource(name);</p><p> ImageIcon icon = new ImageIcon( url );</p><p> this.setIcon(icon);</p><p><b> }</b><
99、/p><p> //構(gòu)造函數(shù),使用默認(rèn)值</p><p> public ChessButton(){</p><p> this(new ArrayPoint(0, 0, 0));</p><p><b> }</b></p><p> //返回當(dāng)前按鈕代表的位置和值</p>
100、<p> public ArrayPoint getPoint(){</p><p> return point;</p><p><b> }</b></p><p> public void setPoint(ArrayPoint point){</p><p> this.point = po
101、int;</p><p><b> }</b></p><p><b> }</b></p><p> ********************************************************** </p><p> * 接口名:Settings*</p>
102、<p> * 作用: 聲明各個(gè)變量大小* </p><p> ********************************************************** </p><p> package cn.elva;</p><p> public interface Settings{</p><p>
103、<b> //行數(shù)</b></p><p> public static final int ROWS = 8;</p><p><b> //列數(shù)</b></p><p> public static final int COLUMNS=8;</p><p><b> //圖片
104、后綴名</b></p><p> public static final String RELEX=".gif";</p><p> //每局所花時(shí)間(秒)</p><p> public static final int PERTIME = 600;</p><p><b> //判斷的時(shí)間
105、間隔</b></p><p> public static final int PER = 1;</p><p><b> //炸彈的使用次數(shù)</b></p><p> public static final int BOMBCOUNT = 3;</p><p><b> }</b&g
106、t;</p><p> ********************************************************** </p><p><b> * 類(lèi)名: Map</b></p><p> * 作用: 連入圖片并聲明游戲規(guī)則* </p><p> *******************
107、*************************************** </p><p> package cn.elva.model;</p><p> import java.util.Random;</p><p> import cn.elva.Settings;</p><p> public class Map {
108、</p><p> public static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;</p><p> // 讓其最外層的數(shù)據(jù)不顯示,可以解決邊框消除不掉的情況</p><p> private int[][] map = new int[Settings.ROWS + 2][Settings.CO
109、LUMNS + 2];</p><p> // 出現(xiàn)的不同圖片個(gè)數(shù)</p><p> private int maxKinds = 4;</p><p> public Map(){</p><p><b> init();</b></p><p><b> }</b&g
110、t;</p><p> public int[][] getMap(){</p><p> return map;</p><p><b> }</b></p><p> private void init(){</p><p> int[] tempArr = new int[Sett
111、ings.ROWS * Settings.COLUMNS];</p><p> int len = tempArr.length;</p><p> // 根據(jù)圖片的種類(lèi)數(shù)來(lái)確定數(shù)組大小,如有64張圖片,每四個(gè)為一樣的,則需要圖片數(shù)為64/4=16</p><p> for (int i = 0; i < len / maxKinds; i++){<
112、;/p><p> tempArr[i * 4] = i + 1;</p><p> tempArr[i * 4 + 1] = i + 1;</p><p> tempArr[i * 4 + 2] = i + 1;</p><p> tempArr[i * 4 + 3] = i + 1;</p><p><b&
113、gt; }</b></p><p> // 打亂一維數(shù)組內(nèi)數(shù)據(jù)的排列</p><p> random(tempArr);</p><p> // 填充到二維數(shù)組中</p><p> for (int i = 1; i < Settings.ROWS + 1; i++){</p><p>
114、for (int j = 1; j < Settings.COLUMNS + 1; j++){</p><p> this.map[i][j] = tempArr[(i - 1) * Settings.COLUMNS</p><p> + (j - 1)];</p><p><b> }</b></p><p&g
115、t;<b> }</b></p><p><b> }</b></p><p> private void random(int[] array){</p><p> Random random = new Random();</p><p> int len = array.length
116、;</p><p> for (int i = len; i > 0; i--){</p><p> int j = random.nextInt(i);</p><p> int temp = array[i - 1];</p><p> array[i - 1] = array[j];</p><p>
117、; array[j] = temp;</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 判斷是否在一條直線上,這里不去比較兩者值是否相等,主要用于后面兩個(gè)拐點(diǎn)的情況</p
118、><p><b> * p1之前的點(diǎn)</b></p><p> * p2當(dāng)前所點(diǎn)的點(diǎn)</p><p> * true 相通,false 不通</p><p><b> */</b></p><p> public boolean oneLineWithoutVal
119、ue(ArrayPoint p1, ArrayPoint p2){</p><p> if (horizonMatch(p1, p2)){</p><p> return true;</p><p><b> }</b></p><p> else if (verticalMatch(p1, p2)){</
120、p><p> return true;</p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p><b> /**</b></p><p>
121、* 判斷是否在一條直線上,其中包括了垂直和水平兩種情況</p><p><b> * p1之前的點(diǎn)</b></p><p> * p2當(dāng)前所點(diǎn)的點(diǎn)</p><p> * true 相通,false 不通</p><p><b> */</b></p><p>
122、 public boolean oneLine(ArrayPoint p1, ArrayPoint p2){</p><p> if (p1.value != p2.value){</p><p> return false;</p><p><b> }</b></p><p> if (oneLineWith
123、outValue(p1, p2)){</p><p> return true;</p><p><b> }</b></p><p> return false;</p><p><b> }</b></p><p><b> /**</b>
124、</p><p><b> * 豎線上的判斷</b></p><p><b> * p1之前的點(diǎn)</b></p><p> * p2當(dāng)前所點(diǎn)的點(diǎn)</p><p> * true 相通,false 不通</p><p><b> */</b>
125、;</p><p> public boolean verticalMatch(ArrayPoint p1, ArrayPoint p2){</p><p> if (p1.j != p2.j){</p><p> return false;</p><p><b> }</b></p><p
126、> if (p1.i > p2.i){</p><p> ArrayPoint temp = null;</p><p> temp = p1;</p><p><b> p1 = p2;</b></p><p> p2 = temp;</p><p><b>
127、}</b></p><p> // 之間的相隔的棋子數(shù)</p><p> int spaceCount = p2.i - p1.i;</p><p> // 如果相鄰,直接消除</p><p> if (spaceCount == 1 && p1.value == p2.value){</p>
128、<p> return true;</p><p><b> }</b></p><p> for (int i = p1.i + 1; i < p2.i; i++){</p><p> ArrayPoint point = new ArrayPoint(i, p1.j, map[i][p1.j]);</p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java連連看課程設(shè)計(jì)
- java課程設(shè)計(jì)—連連看
- java連連看課程設(shè)計(jì)報(bào)告
- java連連看課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--連連看游戲設(shè)計(jì)
- java課程設(shè)計(jì)--連連看游戲的開(kāi)發(fā)
- 課程設(shè)計(jì)報(bào)告----java實(shí)現(xiàn)游戲連連看
- 連連看課程設(shè)計(jì)
- 連連看課程設(shè)計(jì)
- java課程設(shè)計(jì)說(shuō)明書(shū)---連連看
- 連連看課程設(shè)計(jì)報(bào)告
- labview連連看課程設(shè)計(jì)報(bào)告
- 基于java連連看游戲
- java連連看含代碼
- 連連看c語(yǔ)言課程設(shè)計(jì)報(bào)告
- android課程設(shè)計(jì)連連看小游戲
- 基于java的連連看游戲設(shè)計(jì)
- jav課程設(shè)計(jì)報(bào)告書(shū)——連連看
- 連連看java小游戲畢業(yè)設(shè)計(jì)論文
- 連連看
評(píng)論
0/150
提交評(píng)論