版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 前言1</b></p><p><b> 正文1</b></p><p> 1設(shè)計(jì)的目的和意義1</p><p><b> 1.1設(shè)計(jì)目的1</b></p>
2、<p><b> 1.2設(shè)計(jì)意義1</b></p><p> 2設(shè)計(jì)目標(biāo)與總體方案2</p><p><b> 2.1設(shè)計(jì)目標(biāo)2</b></p><p><b> 2.2總體方案2</b></p><p> 2.2.1 界面及其布局設(shè)計(jì)2<
3、;/p><p> 2.2.2 A、B、C座的實(shí)現(xiàn)方法2</p><p> 2.2.3 成員變量2</p><p> 2.2.4 方法3</p><p> 2.2.5 圓盤的實(shí)現(xiàn)方法4</p><p> 2.2.6 Disc成員變量4</p><p> 2.2.7 D
4、isc方法4</p><p> 3設(shè)計(jì)方法和內(nèi)容5</p><p> 3.1總體類關(guān)系5</p><p> 3.2總體功能圖5</p><p> 3.3 總體流程圖6</p><p><b> 4詳細(xì)設(shè)計(jì)內(nèi)容6</b></p><p> 4.1
5、 A、B、C座實(shí)現(xiàn)流程圖6</p><p> 4.2 圓盤畫法流程圖7</p><p> 5 系統(tǒng)詳細(xì)設(shè)計(jì)8</p><p> 5.1 HannoiWindow.java8</p><p> 5.2 Tower.java9</p><p> 5.3 Disc.java9</p>
6、;<p> 5.4 TowerPoint.java10</p><p> 5.5 HandleMouse.java10</p><p> 5.6 AutoMoveDisc.java10</p><p> 6設(shè)計(jì)創(chuàng)新與關(guān)鍵技術(shù)11</p><p> 6.1系統(tǒng)測(cè)試11</p><p&g
7、t; 6.2代碼調(diào)試問(wèn)題13</p><p> 6.3程序運(yùn)行效果14</p><p><b> 總結(jié)15</b></p><p><b> 致謝16</b></p><p><b> 附錄17</b></p><p><b&g
8、t; 參考文獻(xiàn)16</b></p><p><b> 前言</b></p><p> 漢諾塔(又稱河內(nèi)塔)問(wèn)題是印度的一個(gè)古老的傳說(shuō)。開(kāi)天辟地的神勃拉瑪在一個(gè)廟里留下了三根金剛石的棒,第一根上面套著64個(gè)圓的金片,最大的一個(gè)在底下,其余一個(gè)比一個(gè)小,依次疊上去,廟里的眾僧不倦地把它們一個(gè)個(gè)地從這根棒搬到另一根棒上,規(guī)定可利用中間的一根棒作為幫助,但
9、每次只能搬一個(gè),而且大的不能放在小的上面。解答結(jié)果請(qǐng)自己運(yùn)行計(jì)算,程序見(jiàn)尾部。面對(duì)龐大的數(shù)字(移動(dòng)圓片的次數(shù))18446744073709551615,看來(lái),眾僧們耗盡畢生精力也不可能完成金片的移動(dòng)。后來(lái),這個(gè)傳說(shuō)就演變?yōu)闈h諾塔游戲: </p><p> (1) 有三根桿子A,B,C。A桿上有若干碟子 </p><p> (2) 每次移動(dòng)一塊碟子,小的只能疊在大的上面 <
10、/p><p> (3) 把所有碟子從A桿全部移到C桿上</p><p> 經(jīng)過(guò)研究發(fā)現(xiàn),漢諾塔的破解很簡(jiǎn)單,就是按照移動(dòng)規(guī)則向一個(gè)方向移動(dòng)金片:如3階漢諾塔的移動(dòng):A→C,A→B,C→B,A→C,B→A,B→C,A→C。此外,漢諾塔問(wèn)題也是程序設(shè)計(jì)中的經(jīng)典遞歸問(wèn)題。</p><p><b> 正文</b></p><p&
11、gt;<b> 1設(shè)計(jì)的目的和意義</b></p><p><b> 1.1設(shè)計(jì)目的</b></p><p> 通過(guò)學(xué)習(xí)和查閱相關(guān)資料,了解并熟悉掌握漢諾塔的基本原理和功能、熟悉數(shù)據(jù)流程與游戲規(guī)則;學(xué)習(xí)漢諾塔的有關(guān)遞歸算法和棧的算法和Java的編程技術(shù);通過(guò)實(shí)際的編程練習(xí),加深對(duì)基礎(chǔ)知識(shí)的理解,提高實(shí)踐能力;學(xué)習(xí)開(kāi)發(fā)資料的收集與整理,學(xué)會(huì)撰
12、寫課程設(shè)計(jì)報(bào)告。并通過(guò)本次課程設(shè)計(jì),提高自己的編程能力,掌握課程設(shè)計(jì)說(shuō)明書的要求,為以后學(xué)習(xí),和工作打下良好的功底。</p><p><b> 1.2設(shè)計(jì)意義</b></p><p> 通過(guò)這次的課程設(shè)計(jì),可以培養(yǎng)我們的學(xué)習(xí)能力,讓我們實(shí)事求是的學(xué)習(xí),通過(guò)努力,建立系統(tǒng)設(shè)計(jì)的整體思想,鍛煉我們編寫程序和調(diào)試程序的能力,學(xué)習(xí)文檔編寫規(guī)范,學(xué)習(xí)書寫說(shuō)明書的規(guī)范,學(xué)習(xí)書
13、寫論文的規(guī)范,吸取他人學(xué)習(xí)的寶貴經(jīng)驗(yàn)、勇于探索前言知識(shí)的習(xí)慣。同時(shí)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)還可以彌補(bǔ)我們自身在實(shí)踐中所缺少的經(jīng)驗(yàn)。這次對(duì)于漢諾塔這個(gè)問(wèn)題的研究是我在Java課程學(xué)習(xí)中遞歸函數(shù)的一次實(shí)際運(yùn)用,對(duì)我的遞歸函數(shù)的理解會(huì)有更多的幫助。同時(shí)還能根據(jù)算法對(duì)遞歸思想與所學(xué)的數(shù)據(jù)結(jié)構(gòu)中棧的方法進(jìn)行比較。</p><p> 2設(shè)計(jì)目標(biāo)與總體方案</p><p><b> 2.1設(shè)計(jì)目標(biāo)
14、</b></p><p> 1) 設(shè)計(jì)GUI界面的Hannoi塔。漢諾塔中有三個(gè)座,名字分別為A,B,C。初始狀態(tài)時(shí)A塔上有3個(gè)大小不等的盤子,這些盤子從座底到座頂按著大小順序依次擺放在A座上。用戶可以用鼠標(biāo)選中盤子,然后通過(guò)拖動(dòng)鼠標(biāo)來(lái)移動(dòng)盤子。釋放鼠標(biāo)來(lái)放置該盤子。</p><p> 2) 程序要求用戶在移動(dòng)盤子的過(guò)程中,不允許吧大盤子放置在小盤子的上面,用戶最終要完成的
15、是把A座上的全部盤子移動(dòng)到B座或C座上。</p><p> 3) 用戶可以通過(guò)Hannoi塔界面提供的菜單來(lái)選擇初級(jí)、中級(jí)和高級(jí)三個(gè)級(jí)別。初級(jí)級(jí)別A座上有3個(gè)大小不等盤子、中級(jí)級(jí)別A座上有4個(gè)大小不等盤子、高級(jí)級(jí)別A座上有5個(gè)大小不等盤子。</p><p> 4) 用戶可以通過(guò)單擊Hannoi塔界面上提供的按鈕,讓程序自動(dòng)完成把A座上的盤子全部移動(dòng)到C座上。</p>&l
16、t;p> 5) 用戶在移動(dòng)盤子的過(guò)程中,可以隨時(shí)單擊Hannoi塔界面上提供的按鈕,重新開(kāi)始當(dāng)前的級(jí)別。</p><p><b> 2.2總體方案</b></p><p> 2.2.1 界面及其布局設(shè)計(jì)</p><p> 系統(tǒng)的整體布局為:BorderLayout布局, 采用了菜單、按鈕、面板…等組件,菜單主要包括選擇級(jí)別盤子個(gè)
17、數(shù),,按鈕的功能包括重新開(kāi)始,自動(dòng)演示,演示,暫停,繼續(xù),關(guān)閉。</p><p> 2.2.2 A、B、C座的實(shí)現(xiàn)方法</p><p> Tower類是javax.swing包中JPanel容器的一個(gè)子類,創(chuàng)建的對(duì)象tower是HannoiWindow窗口的成員之一,被添加到HannoiWindow窗口的中心位置。</p><p> 2.2.3 成員變量&
18、lt;/p><p> (1) amountOfDisc是int型數(shù)據(jù)。amountOfDisc值用來(lái)確定tower對(duì)象中盤子的數(shù)目,tower對(duì)象中Disc類型數(shù)組disc的長(zhǎng)度。</p><p> (2) disc是Disc型數(shù)組,該數(shù)組的長(zhǎng)度由amountOfDisc值來(lái)確定。Disc數(shù)組的每個(gè)單元中存放一個(gè)Disc對(duì)象,依次表明tower對(duì)象中有怎樣多的盤子。</p>
19、<p> (3) towerName是char型數(shù)組,長(zhǎng)度為3,其三個(gè)單元的默認(rèn)取值依次是A、B和C。towerName是數(shù)組的單元的值用來(lái)確定tower中三個(gè)座的名字。</p><p> (4) maxDiscWidth和minDiscWidth的值分別用來(lái)確定最大盤子的寬度和最小盤子的寬度,discHeight的值確定每個(gè)盤子的高度。</p><p> (5)
20、 pointA、pointB和pointC都是TowerPoint型數(shù)組,三個(gè)數(shù)組的長(zhǎng)度與盤子數(shù)目相同,即都是amountOfDisc。pointA、pointB和pointC單元都是TowerPoint創(chuàng)建對(duì)象,分別用來(lái)表示Hannoi塔中三個(gè)座上的塔點(diǎn)。A座、B座和C座上的三個(gè)塔點(diǎn)分別由pointA、pointB和pointC中的單元來(lái)確定。每個(gè)座上的三個(gè)塔點(diǎn)都是從座頂依次對(duì)應(yīng)數(shù)組的相應(yīng)單元中的TowerPoint對(duì)象。</p
21、><p> (6) handleMouse是HandleMouse類創(chuàng)建的鼠標(biāo)事件監(jiān)視器,用來(lái)監(jiān)視disc數(shù)組的Disc對(duì)象上觸發(fā)的鼠標(biāo)事件。</p><p> (7) autoMoveDisc是AutoMoveDisc創(chuàng)建的對(duì)話框。通過(guò)該對(duì)話框可以實(shí)現(xiàn)程序自動(dòng)移動(dòng)盤子。</p><p><b> 2.2.4 方法</b></p&
22、gt;<p> (1) Tower(char[])是構(gòu)造方法,負(fù)責(zé)完成tower容器的初始化。</p><p> (2) tower容器調(diào)用setAmountOfDisc(int)方法可以設(shè)置amountOfDisc的值。</p><p> (3) tower容器調(diào)用setMaxDiscWidth(int)方法可以設(shè)置最大的盤子的大小。</p>&l
23、t;p> (4) tower容器調(diào)用setMinDiscWidth(int)方法可以設(shè)置最小的盤子的大小。</p><p> (5) tower容器調(diào)用setDiscHeight(int)方法可以設(shè)置盤子的高度。</p><p> (6) tower容器調(diào)用putDiscOnTower ()方法可以將盤子放置在Hannoi塔的A座上,即在pointA指定的塔點(diǎn)上放置dis
24、c數(shù)組的成員。</p><p> (7) tower容器調(diào)用getAutoMoveDisc ()方法返回其中的AutoMoveDisc對(duì)象:autoMoveDisc。tower是HannoiWindow窗口中的成員,當(dāng)用戶單擊HannoiWindow窗口中的autoButton按鈕時(shí),窗口中的actionPerformed(ActionEvent)方法將被執(zhí)行,該方法所進(jìn)行的操作是讓tower對(duì)象返回其中的A
25、utoMoveDisc對(duì)象,該對(duì)象是一個(gè)對(duì)話框,用戶可以通過(guò)該對(duì)話框讓程序自動(dòng)地移動(dòng)盤子。</p><p> (8) tower容器調(diào)用removeDisk ()方法可以移調(diào)tower容器中的盤子。</p><p> (9) tower容器調(diào)用paintComponent (Graphics)方法繪制出塔點(diǎn)的位置和必要的視圖。</p><p> 因此Tow
26、er類創(chuàng)建的按鈕的效果如圖2-2所示。</p><p><b> 如圖2-2</b></p><p> 2.2.5 圓盤的實(shí)現(xiàn)方法</p><p> Disc類是javax.swing包中Jbutton類的子類,所創(chuàng)建的對(duì)象稱作Hannoi塔中的“盤子”。Tower類有Disc類型的數(shù)組disc。Disc數(shù)組的單元是用Disc創(chuàng)建的對(duì)象
27、,被放置在Tower所創(chuàng)建的容器tower中,用來(lái)表示tower中的“盤子”。</p><p> 2.2.6 Disc成員變量</p><p> (1) number的值確定所創(chuàng)建的“盤子”上的數(shù)字號(hào)碼,通過(guò)該號(hào)碼的大小來(lái)確定盤子的大小關(guān)系,即號(hào)碼大的盤子大于號(hào)碼小的盤子。</p><p> (2) point是TowerPoint對(duì)象,是Disc所創(chuàng)建
28、的“盤子”的一個(gè)重要成員。“盤子”被放置在tower容器的塔點(diǎn)上(TowerPoint對(duì)象稱作塔點(diǎn)),“盤子”通過(guò)使用point對(duì)象表明自己所在的塔點(diǎn)。</p><p> 2.2.7 Disc方法</p><p> (1) Disc()構(gòu)造方法。創(chuàng)建盤子對(duì)象時(shí)需要使用該構(gòu)造方法。</p><p> (2) setNumber(int)。盤子調(diào)用該方法設(shè)置
29、其上的數(shù)字號(hào)碼。</p><p> (3) getNumber()方法。盤子調(diào)用該方法返回其上的數(shù)字號(hào)碼。</p><p> (4) setPoint(TowerPoint)方法。盤子調(diào)用該方法設(shè)置其所在的塔點(diǎn)。</p><p> (5) getPoint()方法。盤子調(diào)用該方法返回其所在的塔點(diǎn)。</p><p> 因此Disc
30、創(chuàng)建的按鈕的效果如圖2-3所示。</p><p><b> 如圖2-3</b></p><p><b> 3設(shè)計(jì)方法和內(nèi)容</b></p><p><b> 3.1總體類關(guān)系</b></p><p> 在設(shè)計(jì)Hannoi塔時(shí),需編寫6個(gè)JAVA源文件:HannoiWin
31、dow.Java 、TowerPoint.java、Disc.java、HandleMous.java和AutoMoveDisc.java。</p><p> Hannoi塔除了要編寫的6個(gè)Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如JMenubar,JMenu,JMenuItem和JButton。Hannoi塔所用到得一些重要的類以及類之間的組合關(guān)系如圖3-1所示</p>
32、<p><b> 3.2總體功能圖</b></p><p> 根據(jù)游戲需求分析,游戲主界面有“選擇級(jí)別”、“重新開(kāi)始”、“自動(dòng)演示”三個(gè)按鈕,每個(gè)按鈕分別實(shí)現(xiàn)“初級(jí),中級(jí),高級(jí)”、“運(yùn)行游戲”、“自動(dòng)演示”效果,因此做出總體功能圖如圖3-2所示:</p><p><b> 圖3-2</b></p><p&g
33、t; 3.3 總體流程圖</p><p> 根據(jù)游戲相關(guān)功能設(shè)計(jì),得出總體流程圖如圖3-3</p><p> 圖3-3 總體流程圖</p><p><b> 4詳細(xì)設(shè)計(jì)內(nèi)容</b></p><p> 4.1 A、B、C座實(shí)現(xiàn)流程圖</p><p> 為了整體布局的美觀,首先要畫出
34、A、B、C座,主要經(jīng)過(guò)“畫三條豎線”,“畫三個(gè)點(diǎn)”、“畫矩形區(qū)域”、“畫座名”幾個(gè)步驟,得出制作流程圖如圖3.4.1-1所示:</p><p> 圖4.1-1 A、B、C座實(shí)現(xiàn)流程圖</p><p> 4.2 圓盤畫法流程圖</p><p> 與此同時(shí),圓盤的制作要經(jīng)過(guò)“設(shè)置盤子編號(hào)”、“設(shè)置盤子塔點(diǎn)”、“將盤子放在指定位置”三個(gè)步驟,得出圓盤的制作流程圖
35、如圖4.2-2所示:</p><p> 圖4.2-2 圓盤畫法流程圖</p><p><b> 5 系統(tǒng)詳細(xì)設(shè)計(jì)</b></p><p> 5.1 HannoiWindow.java</p><p> HannoiWindow類負(fù)責(zé)創(chuàng)建Hannoi塔的主窗口,該類含有main方法,Hannoi塔從該類開(kāi)始執(zhí)
36、行。HannoiWindow類的成員變量中有五種重要類型的對(duì)象,一個(gè)int基本型數(shù)據(jù)和一個(gè)char行數(shù)組。五種類型的對(duì)象分別是JMenubar ,JMenu,JMenuItem和JButton對(duì)象。</p><p> HannoiWindow創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-1所示:</p><p><b> 圖5-1</b></p><
37、;p> 5.2 Tower.java</p><p> Tower類是javax.swing報(bào)中的JPanel容器的子類,創(chuàng)建的容器被添加到HannoiWindow窗口的中心。Tower類的成員變量中有四種重要的類型對(duì)象、一個(gè)int基本型數(shù)據(jù)和一個(gè)char型數(shù)組。</p><p> Tower創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-2所示:</p><p&
38、gt;<b> 圖5-2</b></p><p> 5.3 Disc.java</p><p> Disc類是JButton的一個(gè)子類,創(chuàng)建的對(duì)象是Tower容器中的一個(gè)按鈕,用來(lái)表示Tower中的“盤子”。</p><p> Disc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-3所示:</p><p><b
39、> 圖5-3</b></p><p> 5.4 TowerPoint.java</p><p> TowerPint.Java類負(fù)責(zé)在Tower中創(chuàng)建表示位置的塔的對(duì)象。</p><p> Disc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-4所示:</p><p><b> 圖5-4</b>&
40、lt;/p><p> 5.5 HandleMouse.java</p><p> HandleMouse類創(chuàng)建的對(duì)象負(fù)責(zé)處理鼠標(biāo)事件。</p><p> HandleMouse類實(shí)現(xiàn)了MouseListener和MouseMotionListener接口,創(chuàng)建的對(duì)象handleMouse是tower容器的成員之一,負(fù)責(zé)監(jiān)視tower容器中Disc盤子對(duì)象上的鼠標(biāo)
41、事件。當(dāng)用戶用鼠標(biāo)點(diǎn)擊tower中的盤子,并拖動(dòng)鼠標(biāo)時(shí),handleMouse對(duì)象負(fù)責(zé)給出移動(dòng)盤子的有關(guān)算法。標(biāo)明HandleMouse類的主要成員變量、方法以及和Tower類之間的組合關(guān)系的UML圖如圖5-6所示。</p><p> 5.6 AutoMoveDisc.java</p><p> AutoMoveDisc類創(chuàng)建的對(duì)象負(fù)責(zé)走動(dòng)移動(dòng)盤子從一個(gè)座到另一個(gè)座。</p&g
42、t;<p> AutoMoveDisc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-7所示:</p><p><b> 圖5-7</b></p><p> AutoMoveDisc類實(shí)現(xiàn)了ActionListener接口,創(chuàng)建的對(duì)象autoMoveDisc是Tower的成員之一。標(biāo)明AutoMoveDisc類的主要成員變量、方法、以及和Tower類之間組
43、合關(guān)系的UML圖如圖5-8所示。</p><p> 圖5-7 AutoMoveDisc類的UML圖</p><p><b> 圖5-8</b></p><p> 6設(shè)計(jì)創(chuàng)新與關(guān)鍵技術(shù)</p><p><b> 6.1系統(tǒng)測(cè)試</b></p><p> (1) 程
44、序運(yùn)行后,界面上有三個(gè)按鈕,分別是“選擇級(jí)別”、“重新開(kāi)始”、“自動(dòng)演示”;可以選擇“低中高”三個(gè)級(jí)別,當(dāng)玩家遇到困難時(shí)可以選擇重新開(kāi)始或自動(dòng)演示,初始界面如圖6.1-1所示:</p><p><b> 圖6.1-1</b></p><p> 2) 當(dāng)玩家選擇“自動(dòng)演示"功能后,會(huì)出現(xiàn)一個(gè)自動(dòng)演示過(guò)程的對(duì)話框,對(duì)話框可以清楚的顯示每步移動(dòng)的步驟,玩家可
45、以選擇“暫?!保袄^續(xù)”按鈕,非常人性化,自動(dòng)演示界面如圖6.1-2所示:</p><p><b> 圖6.1-2</b></p><p> (3) 級(jí)別分為“低級(jí)”、“中級(jí)”、“高級(jí)”三個(gè)級(jí)別,難度依次增大,盤子數(shù)目依次增多,分別為“三個(gè)”、“四個(gè)”、“五個(gè)”玩家可以隨意更改,選擇難度級(jí)別界面如圖6.1-3所示:</p><p><
46、;b> 圖6.1-3</b></p><p><b> 6.2代碼調(diào)試問(wèn)題</b></p><p> 將前面6個(gè)Java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java保存同一目錄中。分別編譯這6個(gè)Java源
47、文件,或運(yùn)行“javac *.java”命令,編譯全部源文件,然后運(yùn)行主類,即運(yùn)行HannoiWindow類。</p><p><b> 6.3程序運(yùn)行效果</b></p><p><b> 總結(jié)</b></p><p> 一個(gè)編程語(yǔ)言最強(qiáng)大的地方不是它是容易學(xué),或者難學(xué),而是它擁有一個(gè)強(qiáng)大的庫(kù)。JAVA是一個(gè)完全面
48、向?qū)ο蟮恼Z(yǔ)言,JAVA的命名規(guī)則是很容易讓人接受的。而且容易被編程人員記住。經(jīng)過(guò)實(shí)踐訓(xùn)練,對(duì)JAVA的綜合應(yīng)用能力有了較大的提高,另外對(duì)JAVA的特點(diǎn)有了更深層次的認(rèn)識(shí)。這次實(shí)踐中使用的代碼雖然不長(zhǎng),但類與類之間也有很強(qiáng)的邏輯關(guān)系,這就是面向?qū)ο笳Z(yǔ)言的最大優(yōu)勢(shì),這樣可使我們更輕松的運(yùn)用JAVA。</p><p> 這個(gè)Hannoi塔游戲就是在原有的程序基礎(chǔ)上增加了改變盤子數(shù)目功能、自動(dòng)演示功能。由于是在原有的基
49、礎(chǔ)上修改的,雖然理論上那個(gè)來(lái)講這應(yīng)該很簡(jiǎn)單,不會(huì)太難,但當(dāng)我真正著手做起來(lái)得時(shí)候才發(fā)現(xiàn),原來(lái)自己還是太嫩,剛開(kāi)始什么都不懂,于是我就去圖書館參閱了大量的資料,也不停的向同學(xué)們請(qǐng)教,終于漸漸的讓我從剛開(kāi)始連如何運(yùn)行程序,甚至類的作用等一些罪基本的東西都不清楚到最后通過(guò)努力終于把這個(gè)程序成功搞定。自然這期間除了辛苦也讓我明白了很多,有些小問(wèn)題也是不容忽視的,就如公共類只能有一個(gè),而且必須要有及類名必須要同公共類名相同,否則程序就無(wú)法運(yùn)行。&
50、lt;/p><p> 經(jīng)過(guò)努力,查閱相關(guān)資料,終于完成該課題,雖然效果不是很好,但親手做過(guò)之后還是很有成就感的。</p><p> 實(shí)踐的時(shí)間雖短,但是從中我確實(shí)獲益匪淺,期待以后能有更多這樣的機(jī)會(huì)。通過(guò)這次課程設(shè)計(jì)發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固。在設(shè)計(jì)中也遇到了很多編程問(wèn)題,但最后經(jīng)過(guò)自己的努力和大家的幫助完成了這次課程設(shè)計(jì)。這讓我明白了只要有恒心
51、,有耐心,就可以達(dá)到自己的目標(biāo),完成任務(wù)!</p><p><b> 致謝</b></p><p> 感謝這次關(guān)于Java做課設(shè)的課程!在這里我學(xué)到了許多有關(guān)Java方面的知識(shí)點(diǎn)!在程序完善的過(guò)程中,遇到了這樣或那樣的問(wèn)題但是經(jīng)過(guò)自己的不懈努力及查閱大量的資料,最終都得到了滿意的答案。感謝這次的課程設(shè)計(jì),我們不僅開(kāi)闊了視野,增加了學(xué)識(shí),而且為我們今后的工作和學(xué)習(xí)打
52、下了牢固的基礎(chǔ),也增加了對(duì)計(jì)算機(jī)的興趣。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 趙生慧.Java面向?qū)ο蟪绦蛟O(shè)計(jì).北京:高等教育出版社,2007.</p><p> [2] 甘仞初.信息系統(tǒng)開(kāi)發(fā).北京:北京經(jīng)濟(jì)科學(xué)出版社,2005.</p><p> [3] 李宣東,李存珠.軟件工
53、程概論.北京:南京大學(xué)計(jì)算機(jī)系出版,2008.</p><p> [4] 袁然,鄭自國(guó),鄒豐義.JAVA案例開(kāi)發(fā)集錦.北京:電子工業(yè)出版社,2005.</p><p> [5] 埃克爾.Java編程思想.陳昊鵬譯.第4版.北京:機(jī)械工業(yè)出版社,2007.</p><p> [6] 李存珠,李宣東.軟件工程概論.南京:南京大學(xué)計(jì)算機(jī)系出版,2005.</p
54、><p> [7] 張廣彬,孟紅蕊,張永寶.Java課程設(shè)計(jì)案例精編.北京:清華大學(xué)出版社,2006.</p><p> [8] Walter Seavith.Java 完美編程.第三版.北京:清華大學(xué)出版社,2008.</p><p> [9] 張蓓.JAVA通用模塊及典型系統(tǒng)開(kāi)發(fā)實(shí)例導(dǎo)航.北京:人民郵電出版社,2006.</p><p>
55、; [10] BruceEckel.Java編程思想.北京:機(jī)械工業(yè)出版社,2006.</p><p> [11] FLANAGAN.Java技術(shù)手冊(cè).北京:中國(guó)電力出版社,2007.</p><p> [12] 孫一林,彭波.Java數(shù)據(jù)庫(kù)編程實(shí)例.北京:清華大學(xué)出版社,2008.</p><p> [13] 吳其慶.Java程序設(shè)計(jì)實(shí)例教程.北京:冶金工
56、業(yè)出版社,2007.</p><p> [14] 柳西玲.Java語(yǔ)言應(yīng)用開(kāi)發(fā)基礎(chǔ).北京:清華大學(xué)出版社,2008.</p><p> [15] 朱戰(zhàn)立.Java程序設(shè)計(jì)實(shí)用教程.北京:人民郵電出版,2010.</p><p> [16] 宛延闿.實(shí)用Java程序設(shè)計(jì)教程.北京:機(jī)械工業(yè)出版社,2008.</p><p><b&g
57、t; 附錄</b></p><p> import javax.swing.*;</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p><p> public class HannoiWindow extends JFrame implemen
58、ts ActionListener{</p><p> Tower tower=null;</p><p> int amountOfDisc=3;</p><p> char []towerName={'A','B','C'};</p><p> JMenuBar bar;</p
59、><p> JMenu menuGrade;</p><p> JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;</p><p> JButton renew=null;</p><p> JButton autoButton=null; </p><p>
60、JPanel center=new JPanel(); </p><p> HannoiWindow(){</p><p> tower=new Tower(towerName);</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p> tower.setMaxDiscWidth(
61、120);</p><p> tower.setMinDiscWidth(50);</p><p> tower.setDiscHeight(16);</p><p> tower.putDiscOnTower();</p><p> add(tower,BorderLayout.CENTER);</p><p&g
62、t; bar=new JMenuBar();</p><p> menuGrade=new JMenu("選擇級(jí)別");</p><p> oneGradeItem=new JMenuItem("初級(jí)");</p><p> twoGradeItem=new JMenuItem("中級(jí)");<
63、/p><p> threeGradeItem=new JMenuItem("高級(jí)");</p><p> menuGrade.add(oneGradeItem);</p><p> menuGrade.add(twoGradeItem);</p><p> menuGrade.add(threeGradeItem);&
64、lt;/p><p> bar.add(menuGrade);</p><p> setJMenuBar(bar);</p><p> oneGradeItem.addActionListener(this);</p><p> twoGradeItem.addActionListener(this);</p><p&g
65、t; threeGradeItem.addActionListener(this); </p><p> renew=new JButton("重新開(kāi)始");</p><p> renew.addActionListener(this);</p><p> autoButton=new JButton("自動(dòng)演示");
66、</p><p> autoButton.addActionListener(this);</p><p> JPanel north=new JPanel();</p><p> north.add(renew);</p><p> north.add(autoButton); </p><p> Stri
67、ng mess="將全部盤子從"+towerName[0]+"座搬運(yùn)到"+towerName[1]+</p><p> "座或"+towerName[2]+"座";</p><p> JLabel hintMess=new JLabel(mess,JLabel.CENTER);</p><
68、;p> north.add(hintMess); </p><p> add(north,BorderLayout.NORTH);</p><p> setResizable(false); </p><p> setVisible(true);</p><p> setBounds(60,60,460,410);<
69、;/p><p> validate();</p><p> setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); </p><p><b> }</b></p><p> public void actionPerformed(ActionEvent e){</p>
70、;<p> if(e.getSource()==oneGradeItem){</p><p> amountOfDisc=3;</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p> tower.putDiscOnTower();</p><p><b>
71、 }</b></p><p> else if(e.getSource()==twoGradeItem){</p><p> amountOfDisc=4;</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p> tower.putDiscOnTower();</
72、p><p><b> }</b></p><p> else if(e.getSource()==threeGradeItem){</p><p> amountOfDisc=5;</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p>
73、tower.putDiscOnTower();</p><p><b> }</b></p><p> else if(e.getSource()==renew){</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p> tower.putDiscOnTowe
74、r();</p><p><b> }</b></p><p> else if(e.getSource()==autoButton){</p><p> tower.setAmountOfDisc(amountOfDisc);</p><p> tower.putDiscOnTower();</p>
75、<p> int x=this.getBounds().x+this.getBounds().width;</p><p> int y=this.getBounds().y;</p><p> tower.getAutoMoveDisc().setLocation(x,y);</p><p> tower.getAutoMoveDisc().
76、setSize(280,this.getBounds().height); </p><p> tower.getAutoMoveDisc().setVisible(true);</p><p><b> }</b></p><p> validate();</p><p><b> }</b&
77、gt;</p><p> public static void main(String args[]){</p><p> new HannoiWindow();</p><p><b> }</b></p><p><b> }</b></p><p> impo
78、rt javax.swing.*;</p><p> import java.awt.*;</p><p> public class Tower extends JPanel{ </p><p> int amountOfDisc=3;</p><p> Disc [] disc;</p><p> in
79、t maxDiscWidth,minDiscWidth,discHeight; </p><p> char [] towerName;</p><p> TowerPoint [] pointA,pointB,pointC;</p><p> HandleMouse handleMouse;</p><p> AutoMoveDi
80、sc autoMoveDisc;</p><p> Tower(char [] towerName){</p><p> handleMouse=new HandleMouse(this); </p><p> this.towerName=towerName;</p><p> setLayout(null);<
81、/p><p> setBackground(new Color(200,226,226));</p><p><b> } </b></p><p> public void setAmountOfDisc(int number){</p><p> if(number<=1)</p><p
82、> amountOfDisc=1;</p><p><b> else</b></p><p> amountOfDisc=number;</p><p><b> }</b></p><p> public void setMaxDiscWidth(int m){</p>
83、;<p> maxDiscWidth=m;</p><p><b> } </b></p><p> public void setMinDiscWidth(int m){</p><p> minDiscWidth=m;</p><p><b> }</b></
84、p><p> public void setDiscHeight(int h){</p><p> discHeight=h;</p><p><b> }</b></p><p> public AutoMoveDisc getAutoMoveDisc(){</p><p> return
85、 autoMoveDisc;</p><p><b> }</b></p><p> public void putDiscOnTower(){</p><p> removeDisk();</p><p> int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;</
86、p><p> disc=new Disc[amountOfDisc];</p><p> for(int i=0;i<disc.length;i++){</p><p> disc[i]=new Disc();</p><p> disc[i].setNumber(i);</p><p> int disk
87、width=minDiscWidth+i*n;</p><p> disc[i].setSize(diskwidth,discHeight);</p><p> disc[i].addMouseListener(handleMouse);</p><p> disc[i].addMouseMotionListener(handleMouse);</p&g
88、t;<p><b> }</b></p><p> pointA=new TowerPoint[amountOfDisc];</p><p> pointB=new TowerPoint[amountOfDisc]; </p><p> pointC=new TowerPoint[amountOfDisc];</p&
89、gt;<p> int vertialDistance=discHeight;</p><p> for(int i=0;i<pointA.length;i++){</p><p> pointA[i]=new TowerPoint(maxDiscWidth,100+vertialDistance);</p><p> vertialDi
90、stance=vertialDistance+discHeight;</p><p><b> }</b></p><p> vertialDistance=discHeight;</p><p> for(int i=0;i<pointB.length;i++){</p><p> pointB[i]=n
91、ew TowerPoint(2*maxDiscWidth,100+vertialDistance);</p><p> vertialDistance=vertialDistance+discHeight;</p><p><b> }</b></p><p> vertialDistance=discHeight;</p>
92、<p> for(int i=0;i<pointC.length;i++){</p><p> pointC[i]=new TowerPoint(3*maxDiscWidth,100+vertialDistance);</p><p> vertialDistance=vertialDistance+discHeight;</p><p>&
93、lt;b> }</b></p><p> for(int i=0;i<pointA.length;i++){</p><p> pointA[i].putDisc(disc[i],this);</p><p><b> }</b></p><p> handleMouse.setPoin
94、tA(pointA); </p><p> handleMouse.setPointB(pointB);</p><p> handleMouse.setPointC(pointC);</p><p> autoMoveDisc=new AutoMoveDisc(this);</p><p> autoMoveDisc.setTowe
95、rName(towerName);</p><p> autoMoveDisc.setAmountOfDisc(amountOfDisc);</p><p> autoMoveDisc.setPointA(pointA);</p><p> autoMoveDisc.setPointB(pointB);</p><p> autoMo
96、veDisc.setPointC(pointC); </p><p> validate();</p><p> repaint(); </p><p><b> }</b></p><p> public void removeDisk(){</p><p> if(pointA!=n
97、ull){</p><p> for(int i=0;i<pointA.length;i++){</p><p> pointA[i].removeDisc(pointA[i].getDiscOnPoint(),this);</p><p> pointB[i].removeDisc(pointB[i].getDiscOnPoint(),this);&l
98、t;/p><p> pointC[i].removeDisc(pointC[i].getDiscOnPoint(),this);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
99、p> public void paintComponent(Graphics g){ </p><p> super.paintComponent(g);</p><p> int x1,y1,x2,y2;</p><p> x1=pointA[0].getX();</p><p> y
100、1=pointA[0].getY()-discHeight/2;</p><p> x2=pointA[amountOfDisc-1].getX();</p><p> y2=pointA[amountOfDisc-1].getY()+discHeight/2; </p><p> g.drawLine(x1,y1,x2,y2); </p>
101、;<p> x1=pointB[0].getX();</p><p> y1=pointB[0].getY()-discHeight/2;</p><p> x2=pointB[amountOfDisc-1].getX();</p><p> y2=pointB[amountOfDisc-1].getY()+discHeight/2; <
102、;/p><p> g.drawLine(x1,y1,x2,y2); </p><p> x1=pointC[0].getX();</p><p> y1=pointC[0].getY()-discHeight/2;</p><p> x2=pointC[amountOfDisc-1].getX();</p><p>
103、; y2=pointC[amountOfDisc-1].getY()+discHeight/2; </p><p> g.drawLine(x1,y1,x2,y2); </p><p> g.setColor(Color.blue);</p><p> x1=pointA[amountOfDisc-1].getX()-maxDiscWidth/2;&
104、lt;/p><p> y1=pointA[amountOfDisc-1].getY()+discHeight/2;</p><p> x2=pointC[amountOfDisc-1].getX()+maxDiscWidth/2;</p><p> y2=pointC[amountOfDisc-1].getY()+discHeight/2; </p>
105、<p> int length=x2-x1,height=6; </p><p> g.fillRect(x1,y1,length,height);</p><p> int size=5;</p><p> for(int i=0;i<pointA.length;i++){
106、 </p><p> g.fillOval(pointA[i].getX()-size/2,pointA[i].getY()-size/2,size,size);</p><p> g.fillOval(pointB[i].getX()-size/2,pointB[i].getY()-size/2,size,size);</p><p> g.fillOva
107、l(pointC[i].getX()-size/2,pointC[i].getY()-size/2,size,size);</p><p><b> }</b></p><p> g.drawString(towerName[0]+"座",</p><p> pointA[amountOfDisc-1].getX(),
108、pointA[amountOfDisc-1].getY()+50);</p><p> g.drawString(towerName[1]+"座",</p><p> pointB[amountOfDisc-1].getX(),pointB[amountOfDisc-1].getY()+50);</p><p> g.drawString(
109、towerName[2]+"座",</p><p> pointC[amountOfDisc-1].getX(),pointC[amountOfDisc-1].getY()+50);</p><p><b> } </b></p><p><b> }</b></p><p&g
110、t; import javax.swing.*;</p><p> import java.awt.*;</p><p> public class Disc extends JButton{</p><p> int number;</p><p> TowerPoint point;</p><p>&l
111、t;b> Disc(){</b></p><p> setBackground(Color.cyan);</p><p> } </p><p> public void setNumber(int n){</p><p><b> number=n;</b>&
112、lt;/p><p><b> }</b></p><p> public int getNumber(){</p><p> return number;</p><p><b> }</b></p><p> public void setPoint(TowerPoi
113、nt p){</p><p><b> point=p;</b></p><p><b> }</b></p><p> public TowerPoint getPoint(){</p><p> return point;</p><p><b> }
114、</b></p><p><b> }</b></p><p> import java.awt.*;</p><p> public class TowerPoint{</p><p> int x,y; </p><p> boolean
115、 haveDisc; </p><p> Disc disc=null;</p><p> public TowerPoint(int x,int y){</p><p><b> this.x=x;</b></p><p><b> this.y=y;</b></
116、p><p><b> }</b></p><p> public boolean isHaveDisc(){</p><p> return haveDisc;</p><p><b> }</b></p><p> public void setHaveDisc(bo
117、olean boo){</p><p> haveDisc=boo;</p><p><b> }</b></p><p> public int getX(){</p><p><b> return x;</b></p><p><b> }</
118、b></p><p> public int getY(){</p><p><b> return y;</b></p><p><b> }</b></p><p> public boolean equals(TowerPoint p){</p><p>
119、 if(p.getX()==this.getX()&&p.getY()==this.getY())</p><p> return true;</p><p><b> else</b></p><p> return false; </p><p><b> }</b>&
120、lt;/p><p> public void putDisc(Component com,Container con){</p><p> disc=(Disc)com;</p><p> con.setLayout(null);</p><p> con.add(disc);</p><p> int w=di
121、sc.getBounds().width;</p><p> int h=disc.getBounds().height;</p><p> disc.setBounds(x-w/2,y-h/2,w,h);</p><p> haveDisc=true;</p><p> disc.setPoint(this);</p>
122、<p> con.validate(); </p><p><b> }</b></p><p> public Disc getDiscOnPoint(){</p><p> return disc;</p><p><b> }</b></p><p&g
123、t; public void removeDisc(Component com,Container con){</p><p> if(com!=null) </p><p> con.remove(com);</p><p> con.validate(); </p><p><b> }</b></p
124、><p><b> }</b></p><p> import java.awt.event.*;</p><p> import java.awt.*;</p><p> public class HandleMouse implements MouseListener,MouseMotionListener {&
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢諾塔課程設(shè)計(jì)--漢諾塔演示程序設(shè)計(jì)
- 漢諾塔問(wèn)題課程設(shè)計(jì)
- 《新漢諾塔》課程設(shè)計(jì)
- 漢諾塔課程設(shè)計(jì)--基于vc++的漢諾塔游戲設(shè)計(jì)
- java課程設(shè)計(jì)說(shuō)明書---連連看
- 填料吸收塔課程設(shè)計(jì)說(shuō)明書
- 填料吸收塔課程設(shè)計(jì)說(shuō)明書
- mfc課程設(shè)計(jì)報(bào)告—漢諾塔演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--漢諾塔游戲
- 人事管理系統(tǒng)_java課程設(shè)計(jì)說(shuō)明書
- 圖書銷售管理系統(tǒng)-java課程設(shè)計(jì)說(shuō)明書
- java餐廳點(diǎn)餐系統(tǒng)課程設(shè)計(jì)說(shuō)明書
- 板式塔中的浮閥塔課程設(shè)計(jì)說(shuō)明書
- 化工原理課程設(shè)計(jì)說(shuō)明書---精餾塔設(shè)計(jì)
- 基于java漢諾塔游戲設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)說(shuō)明書
- 課程設(shè)計(jì)說(shuō)明書
- 萬(wàn)年歷java課程設(shè)計(jì)說(shuō)明書
- 化工原理課程設(shè)計(jì)說(shuō)明書---填料吸收塔設(shè)計(jì)
- 精餾塔控制方案設(shè)計(jì)課程設(shè)計(jì)說(shuō)明書
評(píng)論
0/150
提交評(píng)論