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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、這里 謝謝老師的指導(dǎo),我會更加努力的學(xué)習(xí) 信息與計算科學(xué)0601 王丹平060701024 1 附件 a * * 類名: mainframe * 作用: 自定義主類,對鼠標拖拽的初始界面進行聲明* * 繼承的父類: jframe 類 * * 實現(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 seria

19、lversionuid = 1l; /炸彈的次數(shù) private 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 e

20、xititem = null; private mapui mapui = null; / 游戲開始時間 信息與計算科學(xué)0601 王丹平060701024 2 private long starttime; / 結(jié)束時間 private long endtime; private timer timer = null; / private jmenuitem ti private jmenubar initmenubar() if (menubar = null) menubar = new jmenubar(); filemenu = new jmenu(菜單); startitem = n

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

22、tem.addactionlistener(new actionlistener() public void actionperformed( actionevent e ) if( bombcount=0 ) 信息與計算科學(xué)0601 王丹平060701024 3 joptionpane.showmessagedialog(mainframe.this,三枚 炸彈已用完! ); bombitem.setenabled(false); return; mapui.bomb(); bombcount-; ); exititem = new jmenuitem(退出); exititem.addac

23、tionlistener(new actionlistener() public void actionperformed(actionevent e) system.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) / 自動生成方法存根 信息與計算科學(xué)0601 王丹平0

24、60701024 4 swingutilities.invokelater(new runnable() public void run() mainframe thisclass = new mainframe(); thisclass.setdefaultcloseoperation(jframe.exit_on_close); thisclass.setvisible(true); ); public mainframe() super(); initialize(); private void initialize() this.setsize(650, 650); this.sett

25、itle(llk); this.setjmenubar(initmenubar(); this.settitle(悠嘻猴連連看); private void reload() mapui = new mapui(); starttime = system.currenttimemillis() / 1000; endtime = starttime + settings.pertime; jcontentpane = new jpanel(); jcontentpane.setlayout(new borderlayout(); jcontentpane.add(mapui); this.se

26、tcontentpane(jcontentpane); 信息與計算科學(xué)0601 王丹平060701024 5 this.validate(); map.leftcount = settings.rows * settings.columns; inittimer(); bombitem.setenabled(true); bombcount=settings.bombcount; private void inittimer() actionlistener actionlistener = new actionlistener() public void actionperformed(ac

27、tionevent e) starttime = system.currenttimemillis() / 1000; if (starttime = endtime) joptionpane.showmessagedialog(mainframe.this, 笨蛋!時 間到! game over!); int result = joptionpane.showconfirmdialog(mainframe.this, 重玩一次?, again, joptionpane.yes_no_cancel_option); if (result = joptionpane.yes_option) re

28、load(); else jcontentpane.setvisible(false); validate(); 信息與計算科學(xué)0601 王丹平060701024 6 ; timer = new javax.swing.timer(1000, actionlistener); timer.start(); * * 類名: mapui * 作用: 定義按鈕和炸彈功能* * 繼承的父類: jpanel 類 * * 實現(xiàn)的接口: stings * * import java.awt.*; import javax.swing.*; import cn.elva.settings; import cn

29、.elva.model.arraypoint; import cn.elva.model.map; public class mapui extends jpanel implements actionlistener private static final long serialversionuid = 1l; / 棋子數(shù)組,用按鈕來表示 private chessbutton chesses = null; / 數(shù)據(jù)模型 private map map = new map(); / 判斷當(dāng)前點擊的棋子是否是第二次選中的 private boolean two = false; / 前面點

30、的那個棋子 private arraypoint priviouspoint; 信息與計算科學(xué)0601 王丹平060701024 7 / 第二次選中的棋子 private arraypoint currpoint; / 構(gòu)造函數(shù) public mapui() super(); initialize(); / 初始化函數(shù) private void initialize() initchesses(); gridlayout gridlayout = new gridlayout(settings.rows + 2, settings.columns + 2); gridlayout.sethga

31、p(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+) add(chessesrow * (settings.columns + 2) + col); private void initchesses() int values = map.getmap(); / 初始化棋子,和數(shù)

32、據(jù)模型里保持 一樣 信息與計算科學(xué)0601 王丹平060701024 8 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ù)模型坐標得到一維的棋子坐標 int index = row * (settings.columns + 2) + col; / 對棋子的數(shù)據(jù)模型,即 arraypoint 對象進行設(shè)置,指定此棋子 具體的位置和值 chesses

33、index = 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) chessesindex.setvisible(false); public void clearcheese(arraypoint priviouspoint, arra

34、ypoint currpoint) / 處理匹配,看兩點是否聯(lián)通 int values = map.getmap(); / 將模型中對應(yīng)的棋子設(shè)為 0 信息與計算科學(xué)0601 王丹平060701024 9 valuespriviouspoint.geti()priviouspoint.getj() = 0; valuescurrpoint.geti()currpoint.getj() = 0; / 使兩個已經(jīng)消除的按鈕不可見 int index1 = priviouspoint.geti() * (settings.columns + 2) + priviouspoint.getj(); in

35、t 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ù),也是處理棋子消除的地方 */ public void actionperformed(actionevent e) /

36、 獲得當(dāng)前的柜子 chessbutton button = (chessbutton) e.getsource(); / 獲得當(dāng)前棋子的數(shù)據(jù)結(jié)構(gòu) arraypoint p = button.getpoint(); / 如果已有兩個棋子選中, 則進行判斷操作 if (two) currpoint = p; 信息與計算科學(xué)0601 王丹平060701024 10 if( map.match(this.priviouspoint, this.currpoint) clearcheese(this.priviouspoint, this.currpoint); / 設(shè)置為沒有兩個按鈕的選中的狀態(tài) tw

37、o = false; else / 將當(dāng)前點擊的棋子賦給變量 priviouspoint this.priviouspoint = p; / 標志位設(shè)為 true,用于點擊下個棋子的時候使用 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 settings.columns + 1; col+

38、) 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) 信息與計算科學(xué)0601 王丹平060701024 11 p2 = new arraypoint(i, j, valuesij); else continue; if (map.match(p1, p2) clearcheese(p1, p2); ret

39、urn; * * 類名: chessbutton * 作用: 初始化游戲中鼠標點擊按鈕* * 繼承的父類: jbutton 類 * * 實現(xiàn)的接口: 沒有 * * import .*; import javax.swing.*; import cn.elva.settings; 信息與計算科學(xué)0601 王丹平060701024 12 import cn.elva.model.arraypoint; public class chessbutton extends jbutton protected arraypoint point = null; public chessbutton(int

40、row, int col, int value) this(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ù),使用默認值 publ

41、ic chessbutton() this(new arraypoint(0, 0, 0); /返回當(dāng)前按鈕代表的位置和值 public arraypoint getpoint() return point; public void setpoint(arraypoint point) this.point = point; 信息與計算科學(xué)0601 王丹平060701024 13 * * 接口名:settings* * 作用: 聲明各個變量大小* * package cn.elva; public interface settings /行數(shù) public static final int r

42、ows = 8; /列數(shù) public static final int columns=8; /圖片后綴名 public static final string relex=.gif; /每局所花時間(秒) public static final int pertime = 600; /判斷的時間間隔 public static final int per = 1; /炸彈的使用次數(shù) public static final int bombcount = 3; * * 類名: map * 作用: 連入圖片并聲明游戲規(guī)則* * package cn.elva.model; import jav

43、a.util.random; 信息與計算科學(xué)0601 王丹平060701024 14 import cn.elva.settings; public class map public static int leftcount = settings.rows * settings.columns; / 讓其最外層的數(shù)據(jù)不顯示,可以解決邊框消除不掉的情況 private int map = new intsettings.rows + 2settings.columns + 2; / 出現(xiàn)的不同圖片個數(shù) private int maxkinds = 4; public map() init();

44、public int getmap() return map; private void init() int temparr = new intsettings.rows * settings.columns; int len = temparr.length; / 根據(jù)圖片的種類數(shù)來確定數(shù)組大小,如有 64 張圖片,每四個為一樣的, 則需要圖片數(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; te

45、mparri * 4 + 3 = i + 1; / 打亂一維數(shù)組內(nèi)數(shù)據(jù)的排列 信息與計算科學(xué)0601 王丹平060701024 15 random(temparr); / 填充到二維數(shù)組中 for (int i = 1; i 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; /* * 判斷是否在一條直線上,這里不去比較兩者值是否相等,主要用于后面 兩個拐點的情況 * p1 之前的

46、點 * p2 當(dāng)前所點的點 * true 相通,false 不通 */ 信息與計算科學(xué)0601 王丹平060701024 16 public boolean onelinewithoutvalue(arraypoint p1, arraypoint p2) if (horizonmatch(p1, p2) return true; else if (verticalmatch(p1, p2) return true; return false; /* * 判斷是否在一條直線上,其中包括了垂直和水平兩種情況 * p1 之前的點 * p2 當(dāng)前所點的點 * true 相通,false 不通 */

47、public boolean oneline(arraypoint p1, arraypoint p2) if (p1.value != p2.value) return false; if (onelinewithoutvalue(p1, p2) return true; return false; /* * 豎線上的判斷 信息與計算科學(xué)0601 王丹平060701024 17 * p1 之前的點 * p2 當(dāng)前所點的點 * 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 - p1.i; / 如果相鄰,直接消除 if (spacecount = 1 for (int i = p1.i + 1; i p2.j) arraypoin

溫馨提示

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

評論

0/150

提交評論