Java連連看課程設(shè)計(jì)_第1頁
Java連連看課程設(shè)計(jì)_第2頁
Java連連看課程設(shè)計(jì)_第3頁
Java連連看課程設(shè)計(jì)_第4頁
Java連連看課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 摘要 關(guān)鍵字:發(fā)展,關(guān)鍵字:發(fā)展,java,java,連連看,程序設(shè)計(jì);連連看,程序設(shè)計(jì); 現(xiàn)代科學(xué)技術(shù)的發(fā)展,改變了人類的生活,作為新世紀(jì)的大學(xué)生,應(yīng)該站在時(shí)代發(fā) 展的前沿,掌握現(xiàn)代科學(xué)技術(shù)知識,以適應(yīng)社會(huì)的發(fā)展,能夠獨(dú)立完成面臨的任務(wù), 作一名有創(chuàng)新意識的新型人才。 java 語言的學(xué)習(xí)熱潮并沒有因?yàn)闀r(shí)間的推移而消退,相反,由于計(jì)算機(jī)技術(shù)的發(fā) 展所帶來的新應(yīng)用的出現(xiàn),java 越來越流行,這種情況是以往程序設(shè)計(jì)語言在其生存 周期內(nèi)所不多見的。java 語言之所以這樣長盛不衰,一是因?yàn)槠浔姸嗟募夹g(shù)特點(diǎn)與現(xiàn) 今的應(yīng)用十分合拍,可以覆蓋大部分的需求;二是因?yàn)?sun 公司不斷推出新的版本, 完

2、善 java 自身的功能。有了這兩點(diǎn),java 語言成為程序員首選的程序設(shè)計(jì)開發(fā)工具就 在情理之中了。 連連看游戲是一種很流行的小游戲,記得在小時(shí)候去游戲廳玩的時(shí)候就有兩臺(tái)專門 的連連看的機(jī)器(當(dāng)然當(dāng)時(shí)不叫這個(gè)名字),一個(gè)是連麻將牌、另一個(gè)是連水果圖片。 當(dāng)時(shí)的麻將牌分好幾層,相鄰層的牌還可以連,看得人眼花繚亂。作為一個(gè) java 初學(xué) 者,我所編輯的“悠嘻猴連連看”小游戲,只有幾個(gè)基本功能:“開始”“再來一局” 炸彈“重新開始”“退出”。我所選中給出的游戲界面很漂亮,不過似乎圖形只有一 層,而且數(shù)量也不是很多,只有 64 張圖,降低了不少難度。 目 錄 摘要 .i 第 1 章 需求分析 .1

3、 1.1 功能分析 .1 1.2 流程圖 .2 第 2 章 詳細(xì)設(shè)計(jì) .3 2.1 課程設(shè)計(jì)目的.3 2.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境 .3 2.3 課程設(shè)計(jì)的預(yù)備知識 .3 2.4 課程設(shè)計(jì)要求 .3 2.5 連連看算法設(shè)計(jì) .4 2.6 類的實(shí)現(xiàn)方法.4 2.6.1 成員變量 .4 2.6.2 方法設(shè)計(jì) .5 第 3 章 測試分析 .7 3.1 程序運(yùn)行情況.7 3.2 測試計(jì)劃及分析.9 3.2.1 檢驗(yàn)的先后順序.9 3.2.2 程序異常處理.9 第 4 章 課程設(shè)計(jì)總結(jié) .10 附件 a.1 參考資料 .26 第 1 章 需求分析 1.1 功能分析 每次用戶選擇兩個(gè)圖形,如果圖形滿足一定條

4、件(兩個(gè)圖形一樣,且這兩個(gè)圖形之 間存在轉(zhuǎn)彎少于 3 的路徑) ,則兩個(gè)圖形都能消掉。給定任意具有相同圖形的兩個(gè)格子, 我們需要尋找這兩個(gè)格子之間在轉(zhuǎn)彎最少的情況下,經(jīng)過格子數(shù)目最少的路徑。如果 這個(gè)最優(yōu)路徑的轉(zhuǎn)彎數(shù)目少于 3 ,則這兩個(gè)格子可以消去。 將界面中相同的猴子圖片消去,游戲限時(shí) 1000 秒,如果在規(guī)定的時(shí)間內(nèi)沒有完成, 就會(huì)跳出對話框“笨蛋!游戲時(shí)間到!game over !”的字樣。如果玩家贏了這 局,還沒有過癮的話,可以單擊“再來一局” 。判斷游戲是否結(jié)束。如果所有圖形全部 消去,或者游戲玩家不可能再消去任意兩個(gè)格子的時(shí)候,游戲應(yīng)該結(jié)束。后一種情況, 我們稱之為“死鎖” 。

5、在死鎖的情況下,我們也可以暫時(shí)不終止游戲,而是隨機(jī)打亂局面,使得打破“死 鎖”局面。不管怎樣,我們需要判別游戲當(dāng)前狀態(tài)是否為“死鎖”狀態(tài)。我們首先思 考問題:怎么判斷兩個(gè)圖形能否相消?前面分析中,我們已經(jīng)知道,兩個(gè)圖形能夠相 消,當(dāng)且僅當(dāng)這兩個(gè)圖形相同,且它們之間存在路徑轉(zhuǎn)彎數(shù)目小于 3。 因此,我們主要需要解決的問題還是,怎樣求出相同圖形之間的最短路徑?這個(gè)最 短的路徑,我們首先需要保證轉(zhuǎn)彎數(shù)目最少。在轉(zhuǎn)彎數(shù)目最少的情況下,經(jīng)過的格子 數(shù)目要盡可能地少。 在經(jīng)典的最短路問題中,我們需要求出經(jīng)過格子數(shù)目最少的路徑。而這里,要保證 轉(zhuǎn)彎數(shù)目最少,需要把最短路問題的目標(biāo)函數(shù)修改為從一個(gè)點(diǎn)到另一個(gè)點(diǎn)

6、的轉(zhuǎn)彎次數(shù)。 雖然,目標(biāo)函數(shù)修改了,但算法的框架仍然可以保持不變。廣度優(yōu)先搜索是解決經(jīng)典 最 短路問題的一個(gè)思路。我們看看在新的目標(biāo)函數(shù)(轉(zhuǎn)彎數(shù)目最少)下,如何用廣度優(yōu) 先搜索來解決圖形 a(x1,y1)和圖形 b(x2,y2)之間的最短路問題。 1.2 流程圖 第 2 章 詳細(xì)設(shè)計(jì) 2.1 課程設(shè)計(jì)目的 java 程序設(shè)計(jì)是計(jì)算機(jī)相關(guān)專業(yè)的必修專業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很 強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專題實(shí)際是計(jì)算機(jī) 相關(guān)專業(yè)學(xué)生學(xué)習(xí)完java 程序設(shè)計(jì)課程后,進(jìn)行的一次全面的綜合訓(xùn)練,java 程 序設(shè)計(jì)的設(shè)計(jì)目的是加深對理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較

7、系統(tǒng)地掌握程序設(shè) 計(jì)及其在網(wǎng)絡(luò)開發(fā)中的廣泛應(yīng)用,基本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識,利用 軟件工程為基礎(chǔ)進(jìn)行軟件開發(fā)、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。 2.2 課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境 硬件要求能運(yùn)行 windows 9.x 操作系統(tǒng)的微機(jī)系統(tǒng)。java 程序設(shè)計(jì)語言及相應(yīng)的 集成開發(fā)環(huán)境,ultraedit-32 開發(fā)工具。 2.3 課程設(shè)計(jì)的預(yù)備知識 熟悉 java 語言及 ultraedit-32 開發(fā)工具。 2.4 課程設(shè)計(jì)要求 按課程設(shè)計(jì)指導(dǎo)書提供的課題,要求學(xué)生在自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且達(dá) 到舉一反三的目的,完成一個(gè)項(xiàng)目解決一類問題。要求學(xué)生能夠全面、深入理解和熟 練掌握所學(xué)內(nèi)

8、容,并能夠用其分析、設(shè)計(jì)和解答類似問題;對此能夠較好地理解和掌 握,能夠進(jìn)行簡單分析和判斷;能編寫出具有良好風(fēng)格的程序;掌握 java 程序設(shè)計(jì)的 基本技能和面向?qū)ο蟮母拍詈头椒ǎ涣私舛嗑€程、安全和網(wǎng)絡(luò)等編程技術(shù)。同時(shí)培養(yǎng) 學(xué)生進(jìn)行分析問題、解決問題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作 與測試、設(shè)計(jì)過程的觀察、理解和歸納能力的提高。 2.5 連連看算法設(shè)計(jì) 在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿足兩個(gè)條件才行,就 是兩者配對并且連線成功。 * 分 3 種情況:(從下面的這三種情況,我們可以知道,需要三個(gè)檢測,這三個(gè) 檢測分別檢測一條直路經(jīng)。這樣就會(huì)有三條路經(jīng)。若這三條

9、路經(jīng)上都是空按鈕,那么 就剛好是三種直線(兩個(gè)轉(zhuǎn)彎點(diǎn))把兩個(gè)按鈕連接起來了) * 1.相鄰 * 2. 若不相鄰的先在第一個(gè)按鈕的同行找一個(gè)空按鈕。1).找到后看第二個(gè)按鈕 橫向到這個(gè)空按鈕所在的列是否有按鈕。2).沒有的話再看第一個(gè)按鈕到與它同行的那 個(gè)空按鈕之間是否有按鈕。3).沒有的話,再從與第一個(gè)按鈕同行的那個(gè)空按鈕豎向到 與第二個(gè)按鈕的同行看是否有按鈕。沒有的話路經(jīng)就通了,可以消了. * 3.若 2 失敗后,再在第一個(gè)按鈕的同列找一個(gè)空按鈕。1).找到后看第二個(gè)按 鈕豎向到這個(gè)空按鈕所在的行是否有按鈕 2).沒有的話,再看第一個(gè)按鈕到與它同列 的那個(gè)空按鈕之間是否有按鈕。3).沒有的話

10、,再從與第一個(gè)按鈕同列的那個(gè)空按鈕橫 向到與第二個(gè)按鈕同列看是否有按鈕。沒有的話路經(jīng)就通了,可以消了。 * 若以上三步都失敗,說明這兩個(gè)按鈕不可以消去。 2.6 類的實(shí)現(xiàn)方法 2.6.1 成員變量 成員變量也叫類的屬性,一般帶有訪問控制屬性的,而全局變量雖然也有類的屬 性,但全局變量嚴(yán)重影響了封裝和模塊化,一般的全局變量前面要加上 static 和 fina 屬性其中,static 使該變量任何類都可用(方法 classname.全局變量名) ,而 fina 則使得變量不可更改,基本上算是常量了,這也在一定程度上防止對變量的非法 修改。 表 2-6-1 成員變量 成員變量描述變量類型名稱 文件

11、 filefile 文件區(qū) jtextareatextarea 菜單項(xiàng) jmenuitemmenuitem_copy 菜單 umenuitemumenuitem 標(biāo)簽 jlabellabel_seek 文件名 stringseel 2.6.2 方法設(shè)計(jì) 方法名稱為任何合乎語法的識別字,返回值類型是方法執(zhí)行結(jié)果返回給調(diào)用者的 數(shù)據(jù)類型,void 表示沒有返回值,參數(shù)行(parameter list)是調(diào)用時(shí)給予的參數(shù)聲明, 兩個(gè)以上的參數(shù)聲明以逗號隔開,若沒有參數(shù)則參數(shù)行為空白,調(diào)用時(shí)每一個(gè)參數(shù)對 應(yīng)一個(gè)參數(shù)值(argument)大括號內(nèi)為方法本體,也稱為方法程序模塊(block),包含聲 明(

12、declarations)和語句(statements),聲明也可以摻雜在語句之間。一個(gè)方法不能 聲明在另一個(gè)方法內(nèi)。 表 2-6-2 方法定義 方法名功能備注 mytexteditor 創(chuàng)建文本編輯器構(gòu)造方法 dialog 創(chuàng)建對話框 addmenu 添加菜單欄菜單項(xiàng) writetofile 向文本區(qū)寫文件 readfromfile 讀文件 opendialog 打開文件 savedialog 保存對話框 actionperformed 事件處理 itemstatechanged itemlistener 事件處理方法 mouseclicked 鼠標(biāo)處理事件接口方法 mouseevent 鼠

13、標(biāo)處理事件接口方法 mousereleased 鼠標(biāo)處理事件接口方法 mouseentered 鼠標(biāo)處理事件接口方法 mouseexit 鼠標(biāo)處理事件接口方法 mousedragged 鼠標(biāo)處理事件接口方法 main 程序開始運(yùn)行 第 3 章 測試分析 3.1 程序運(yùn)行情況 連連看游戲規(guī)則很簡單,就是點(diǎn)中兩個(gè)互相匹配并且可以通過不多于兩個(gè)折點(diǎn)的 折線連在一起的方塊后,這兩個(gè)方塊就可以消掉。 圖 1 初始界面 菜單選項(xiàng)中,包括“開始游戲”、“重新開始”、“炸彈”、“退出”功能。 當(dāng)選擇炸彈功能時(shí):每次含有三個(gè)炸彈,所炸的位置也是隨機(jī)的; 圖 2 游戲界面 粗略想來,由于用戶每次只能消除一對圖形,

14、即只會(huì)用到一個(gè)最短路徑,但由于 實(shí)現(xiàn)并不知道用戶會(huì)選擇哪一對圖形,所以需要事先計(jì)算出所有可能的最短路徑并保 存起來。此外,采用這種方法的話似乎每次用戶消去一對相同圖像之后都需要重新計(jì) 算出當(dāng)前所有可能被連接的相同圖形之間最短路徑,這是因?yàn)楫?dāng)某些圖像被消去之后 可能會(huì)產(chǎn)生很多新路徑,而我們又不能確定這些空出來的格子到底能夠影響哪些路徑, 所以就只好都重新計(jì)算一遍。其缺點(diǎn)很明顯就是每次消去圖形動(dòng)作之后重新計(jì)算所有 可能的最短路徑所需要消耗的時(shí)間;而該方法的優(yōu)點(diǎn)則是可以很快地判斷兩個(gè)相同圖 形之間是否存在滿足條件的最短路徑。 如果用戶很厲害,每次都能選中可以消除的圖形對,那么用這種方法浪費(fèi)的時(shí)間 就

15、會(huì)相當(dāng)可觀,畢竟用戶未選中的其他可以連接的圖形對之間的最短路徑都被浪費(fèi)掉 了;而如果用戶很差勁,每輪選擇的次數(shù)都遠(yuǎn)遠(yuǎn)大于當(dāng)前可能的連接數(shù)量時(shí),該方法 就會(huì)比書中正文提到的方法高效。但這種情況是比較少的,因?yàn)樵谡麄€(gè)游戲中用戶主 要是會(huì)用眼睛“找”而不是頻繁的用鼠標(biāo)去“試” 。所以總的來看,維護(hù)所有最短路徑 的方法的效率相對比較低。游戲結(jié)束后,在頁面出現(xiàn)對話框,詢問玩家是否進(jìn)行下一 局。 3.2 測試計(jì)劃及分析 3.2.1 檢驗(yàn)的先后順序 在檢驗(yàn)兩個(gè)方塊能否消掉的時(shí)候,我們要讓兩個(gè)方塊同時(shí)滿足兩個(gè)條件才行,就 是兩者配對并且連線成功。所以,這里應(yīng)該先檢驗(yàn)配對,如果該條件不成立的話,就 不要再進(jìn)行連

16、線檢查了,這樣可以避免很多不必要的復(fù)雜運(yùn)算。當(dāng)然,如果你在做這 個(gè)游戲的時(shí)候,配對規(guī)則不夠如此簡單的話,那么就看哪個(gè)算起來麻煩就把它放在后 面。 3.2.2 程序異常處理 本程序沒有涉及到程序的異常處理,只有關(guān)于“死鎖”問題,本質(zhì)上還是判別兩個(gè) 格子是否可以消去的問題。最直接的方法就是,對于游戲中尚未消去的格子,兩兩都 計(jì)算一下,它們是否可以消去。此外,從上面的廣度優(yōu)先搜索可以看出,我們每次都 是擴(kuò)展出起始格子 a(x1,y1)能夠到達(dá)的格子。也就是說,對于每一個(gè)格子,我們可以 調(diào)用一次上面的擴(kuò)展過程,得到所有可以到達(dá)的格子,如果這些格子中有任意一個(gè)跟 起始格子的圖形一致,則它們可以消去,目前

17、游戲還不是“死鎖”狀態(tài)。 第 4 章 課程設(shè)計(jì)總結(jié) 通過這次課程設(shè)計(jì)還使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是 遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真 正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇 到問題,可以說得是困難重重,并且還發(fā)現(xiàn)了自己的許多不足之處,對以前所學(xué)過的 知識理解得不夠深刻,掌握得不夠牢固。但通過這次課程設(shè)計(jì)之后,一定把以前所學(xué) 過的知識重新溫故。 我完成了這次 java 課程設(shè)計(jì),不過這只是我學(xué)習(xí)路上的驛站。我相信我在未來的 學(xué)習(xí)中會(huì)記住從本次課程設(shè)計(jì)中所學(xué)到的東西,并將它用到未來的學(xué)習(xí)中去。在這

18、里 謝謝老師的指導(dǎo),我會(huì)更加努力的學(xué)習(xí) 附件 a * * 類名: mainframe * 作用: 自定義主類,對鼠標(biāo)拖拽的初始界面進(jìn)行聲明* * 繼承的父類: jframe 類 * * 實(shí)現(xiàn)的接口: strings* * import java.awt.*; import javax.swing.*; import cn.elva.settings; import cn.elva.model.map; public class mainframe extends jframe private static final long serialversionuid = 1l; /炸彈的次數(shù) pri

19、vate int bombcount = settings.bombcount; private jpanel jcontentpane = null; private jmenubar menubar = null; private jmenu filemenu = null; private jmenuitem reloaditem = null; private jmenuitem startitem = null; /炸彈 private jmenuitem bombitem = null; private jmenuitem exititem = null; private mapu

20、i mapui = null; / 游戲開始時(shí)間 private long starttime; / 結(jié)束時(shí)間 private long endtime; private timer timer = null; / private jmenuitem ti private jmenubar initmenubar() if (menubar = null) menubar = new jmenubar(); filemenu = new jmenu(菜單); startitem = new jmenuitem(開始游戲); startitem.addactionlistener(new act

21、ionlistener() public void actionperformed(actionevent e) reload(); ); reloaditem = new jmenuitem(重新開始); reloaditem.addactionlistener(new actionlistener() public void actionperformed(actionevent e) reload(); ); bombitem = new jmenuitem(炸彈); bombitem.addactionlistener(new actionlistener() public void

22、actionperformed( actionevent e ) if( bombcount=0 ) joptionpane.showmessagedialog(mainframe.this,三枚 炸彈已用完! ); bombitem.setenabled(false); return; mapui.bomb(); bombcount-; ); exititem = new jmenuitem(退出); exititem.addactionlistener(new actionlistener() public void actionperformed(actionevent e) syste

23、m.exit(0); ); filemenu.add(startitem); filemenu.add(reloaditem); filemenu.add( bombitem ); filemenu.add(exititem); menubar.add(filemenu); return menubar; public static void main(string args) / 自動(dòng)生成方法存根 swingutilities.invokelater(new runnable() public void run() mainframe thisclass = new mainframe();

24、 thisclass.setdefaultcloseoperation(jframe.exit_on_close); thisclass.setvisible(true); ); public mainframe() super(); initialize(); private void initialize() this.setsize(650, 650); this.settitle(llk); this.setjmenubar(initmenubar(); this.settitle(悠嘻猴連連看); private void reload() mapui = new mapui();

25、starttime = system.currenttimemillis() / 1000; endtime = starttime + settings.pertime; jcontentpane = new jpanel(); jcontentpane.setlayout(new borderlayout(); jcontentpane.add(mapui); this.setcontentpane(jcontentpane); this.validate(); map.leftcount = settings.rows * settings.columns; inittimer(); b

26、ombitem.setenabled(true); bombcount=settings.bombcount; private void inittimer() actionlistener actionlistener = new actionlistener() public void actionperformed(actionevent e) starttime = system.currenttimemillis() / 1000; if (starttime = endtime) joptionpane.showmessagedialog(mainframe.this, 笨蛋!時(shí)

27、間到! game over!); int result = joptionpane.showconfirmdialog(mainframe.this, 重玩一次?, again, joptionpane.yes_no_cancel_option); if (result = joptionpane.yes_option) reload(); else jcontentpane.setvisible(false); validate(); ; timer = new javax.swing.timer(1000, actionlistener); timer.start(); * * 類名: m

28、apui * 作用: 定義按鈕和炸彈功能* * 繼承的父類: jpanel 類 * * 實(shí)現(xiàn)的接口: stings * * import java.awt.*; import javax.swing.*; import cn.elva.settings; import cn.elva.model.arraypoint; import cn.elva.model.map; public class mapui extends jpanel implements actionlistener private static final long serialversionuid = 1l; / 棋子

29、數(shù)組,用按鈕來表示 private chessbutton chesses = null; / 數(shù)據(jù)模型 private map map = new map(); / 判斷當(dāng)前點(diǎn)擊的棋子是否是第二次選中的 private boolean two = false; / 前面點(diǎn)的那個(gè)棋子 private arraypoint priviouspoint; / 第二次選中的棋子 private arraypoint currpoint; / 構(gòu)造函數(shù) public mapui() super(); initialize(); / 初始化函數(shù) private void initialize() ini

30、tchesses(); gridlayout gridlayout = new gridlayout(settings.rows + 2, settings.columns + 2); gridlayout.sethgap(2); gridlayout.setvgap(2); this.setlayout(gridlayout); this.setsize(300, 200); / 放置按鈕,按行 for (int row = 0; row settings.rows + 2; row+) for (int col = 0; col settings.columns + 2; col+) ad

31、d(chessesrow * (settings.columns + 2) + col); private void initchesses() int values = map.getmap(); / 初始化棋子,和數(shù)據(jù)模型里保持一樣 this.chesses = new chessbutton(settings.rows + 2) * (settings.columns + 2); for (int row = 0; row 10; row+) for (int col = 0; col 10; col+) / 通過二維的數(shù)據(jù)模型坐標(biāo)得到一維的棋子坐標(biāo) int index = row *

32、(settings.columns + 2) + col; / 對棋子的數(shù)據(jù)模型,即 arraypoint 對象進(jìn)行設(shè)置,指定此棋子 具體的位置和值 chessesindex = new chessbutton(row, col, valuesrowcol); / 添加監(jiān)聽器 chessesindex.addactionlistener(this); / 將外圍的一圈設(shè)為不可見,行,列為 0 和為最大值的情況 if (row = 0 | row = (settings.rows + 2 - 1) | col = 0 | col = (settings.columns + 2 - 1) ches

33、sesindex.setvisible(false); public void clearcheese(arraypoint priviouspoint, arraypoint currpoint) / 處理匹配,看兩點(diǎn)是否聯(lián)通 int values = map.getmap(); / 將模型中對應(yīng)的棋子設(shè)為 0 valuespriviouspoint.geti()priviouspoint.getj() = 0; valuescurrpoint.geti()currpoint.getj() = 0; / 使兩個(gè)已經(jīng)消除的按鈕不可見 int index1 = priviouspoint.get

34、i() * (settings.columns + 2) + priviouspoint.getj(); int index2 = currpoint.geti() * (settings.columns + 2) + currpoint.getj(); chessesindex1.setvisible(false); chessesindex2.setvisible(false); / 如果棋子總數(shù)已為 0,則程序結(jié)束 if (map.leftcount = 0) joptionpane.showmessagedialog(this, 恭喜您通過!); /* * 事件監(jiān)聽器處理函數(shù),也是處理

35、棋子消除的地方 */ public void actionperformed(actionevent e) / 獲得當(dāng)前的柜子 chessbutton button = (chessbutton) e.getsource(); / 獲得當(dāng)前棋子的數(shù)據(jù)結(jié)構(gòu) arraypoint p = button.getpoint(); / 如果已有兩個(gè)棋子選中, 則進(jìn)行判斷操作 if (two) currpoint = p; if( map.match(this.priviouspoint, this.currpoint) clearcheese(this.priviouspoint, this.currp

36、oint); / 設(shè)置為沒有兩個(gè)按鈕的選中的狀態(tài) two = false; else / 將當(dāng)前點(diǎn)擊的棋子賦給變量 priviouspoint this.priviouspoint = p; / 標(biāo)志位設(shè)為 true,用于點(diǎn)擊下個(gè)棋子的時(shí)候使用 two = true; /炸彈的功能 public void bomb() int values = map.getmap(); arraypoint p1 = null; arraypoint p2 = null; for (int row = 1; row settings.rows + 1; row+) for (int col = 1; col

37、 settings.columns + 1; col+) if (valuesrowcol != 0) p1 = new arraypoint(row, col, valuesrowcol); for (int i = 1; i settings.rows + 1; i+) for (int j = 1; j settings.columns + 1; j+) if (valuesij != 0) p2 = new arraypoint(i, j, valuesij); else continue; if (map.match(p1, p2) clearcheese(p1, p2); retu

38、rn; * * 類名: chessbutton * 作用: 初始化游戲中鼠標(biāo)點(diǎn)擊按鈕* * 繼承的父類: jbutton 類 * * 實(shí)現(xiàn)的接口: 沒有 * * import .*; import javax.swing.*; import cn.elva.settings; import cn.elva.model.arraypoint; public class chessbutton extends jbutton protected arraypoint point = null; public chessbutton(int row, int col, int value) this

39、(new arraypoint(row, col, value); public chessbutton(arraypoint point) this.point = point; string name =resource/+point.getvalue() + settings.relex; url url = chessbutton.class.getresource(name); imageicon icon = new imageicon( url ); this.seticon(icon); /構(gòu)造函數(shù),使用默認(rèn)值 public chessbutton() this(new arr

40、aypoint(0, 0, 0); /返回當(dāng)前按鈕代表的位置和值 public arraypoint getpoint() return point; public void setpoint(arraypoint point) this.point = point; * * 接口名:settings* * 作用: 聲明各個(gè)變量大小* * package cn.elva; public interface settings /行數(shù) public static final int rows = 8; /列數(shù) public static final int columns=8; /圖片后綴名 pu

41、blic static final string relex=.gif; /每局所花時(shí)間(秒) public static final int pertime = 600; /判斷的時(shí)間間隔 public static final int per = 1; /炸彈的使用次數(shù) public static final int bombcount = 3; * * 類名: map * 作用: 連入圖片并聲明游戲規(guī)則* * package cn.elva.model; import java.util.random; import cn.elva.settings; public class map

42、public static int leftcount = settings.rows * settings.columns; / 讓其最外層的數(shù)據(jù)不顯示,可以解決邊框消除不掉的情況 private int map = new intsettings.rows + 2settings.columns + 2; / 出現(xiàn)的不同圖片個(gè)數(shù) private int maxkinds = 4; public map() init(); public int getmap() return map; private void init() int temparr = new intsettings.row

43、s * settings.columns; int len = temparr.length; / 根據(jù)圖片的種類數(shù)來確定數(shù)組大小,如有 64 張圖片,每四個(gè)為一樣的, 則需要圖片數(shù)為 64/4=16 for (int i = 0; i len / maxkinds; i+) temparri * 4 = i + 1; temparri * 4 + 1 = i + 1; temparri * 4 + 2 = i + 1; temparri * 4 + 3 = i + 1; / 打亂一維數(shù)組內(nèi)數(shù)據(jù)的排列 random(temparr); / 填充到二維數(shù)組中 for (int i = 1; i

44、settings.rows + 1; i+) for (int j = 1; j 0; i-) int j = random.nextint(i); int temp = arrayi - 1; arrayi - 1 = arrayj; arrayj = temp; /* * 判斷是否在一條直線上,這里不去比較兩者值是否相等,主要用于后面 兩個(gè)拐點(diǎn)的情況 * p1 之前的點(diǎn) * p2 當(dāng)前所點(diǎn)的點(diǎn) * true 相通,false 不通 */ public boolean onelinewithoutvalue(arraypoint p1, arraypoint p2) if (horizonm

45、atch(p1, p2) return true; else if (verticalmatch(p1, p2) return true; return false; /* * 判斷是否在一條直線上,其中包括了垂直和水平兩種情況 * p1 之前的點(diǎn) * p2 當(dāng)前所點(diǎn)的點(diǎn) * true 相通,false 不通 */ public boolean oneline(arraypoint p1, arraypoint p2) if (p1.value != p2.value) return false; if (onelinewithoutvalue(p1, p2) return true; return false; /* * 豎線上的判斷 * p1 之前的點(diǎn) * p2 當(dāng)前所點(diǎn)的點(diǎn) * true 相通,false 不通 */ public boolean verticalmatch(arraypoint p1, arraypoint p2) if (p1.j != p2.j) return false; if (p1.i p2.i) arraypoint temp = null; temp = p1; p1 = p2; p2 = temp; / 之間的相隔的棋子數(shù) int spacecount = p2.i

溫馨提示

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

最新文檔

評論

0/150

提交評論