版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 前言1</b></p><p><b> 正文1</b></p><p> 1設(shè)計的目的和意義1</p><p><b> 1.1設(shè)計目的1</b></p>
2、<p><b> 1.2設(shè)計意義1</b></p><p> 2設(shè)計目標(biāo)與總體方案2</p><p><b> 2.1設(shè)計目標(biāo)2</b></p><p><b> 2.2總體方案2</b></p><p> 2.2.1 界面及其布局設(shè)計2<
3、;/p><p> 2.2.2 A、B、C座的實現(xiàn)方法2</p><p> 2.2.3 成員變量2</p><p> 2.2.4 方法3</p><p> 2.2.5 圓盤的實現(xiàn)方法4</p><p> 2.2.6 Disc成員變量4</p><p> 2.2.7 D
4、isc方法4</p><p> 3設(shè)計方法和內(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è)計內(nèi)容6</b></p><p> 4.1
5、 A、B、C座實現(xiàn)流程圖6</p><p> 4.2 圓盤畫法流程圖7</p><p> 5 系統(tǒng)詳細(xì)設(shè)計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è)計創(chuàng)新與關(guān)鍵技術(shù)11</p><p> 6.1系統(tǒng)測試11</p><p&g
7、t; 6.2代碼調(diào)試問題13</p><p> 6.3程序運行效果14</p><p><b> 總結(jié)15</b></p><p><b> 致謝16</b></p><p><b> 附錄17</b></p><p><b&g
8、t; 參考文獻16</b></p><p><b> 前言</b></p><p> 漢諾塔(又稱河內(nèi)塔)問題是印度的一個古老的傳說。開天辟地的神勃拉瑪在一個廟里留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的一個在底下,其余一個比一個小,依次疊上去,廟里的眾僧不倦地把它們一個個地從這根棒搬到另一根棒上,規(guī)定可利用中間的一根棒作為幫助,但
9、每次只能搬一個,而且大的不能放在小的上面。解答結(jié)果請自己運行計算,程序見尾部。面對龐大的數(shù)字(移動圓片的次數(shù))18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。后來,這個傳說就演變?yōu)闈h諾塔游戲: </p><p> (1) 有三根桿子A,B,C。A桿上有若干碟子 </p><p> (2) 每次移動一塊碟子,小的只能疊在大的上面 <
10、/p><p> (3) 把所有碟子從A桿全部移到C桿上</p><p> 經(jīng)過研究發(fā)現(xiàn),漢諾塔的破解很簡單,就是按照移動規(guī)則向一個方向移動金片:如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C。此外,漢諾塔問題也是程序設(shè)計中的經(jīng)典遞歸問題。</p><p><b> 正文</b></p><p&
11、gt;<b> 1設(shè)計的目的和意義</b></p><p><b> 1.1設(shè)計目的</b></p><p> 通過學(xué)習(xí)和查閱相關(guān)資料,了解并熟悉掌握漢諾塔的基本原理和功能、熟悉數(shù)據(jù)流程與游戲規(guī)則;學(xué)習(xí)漢諾塔的有關(guān)遞歸算法和棧的算法和Java的編程技術(shù);通過實際的編程練習(xí),加深對基礎(chǔ)知識的理解,提高實踐能力;學(xué)習(xí)開發(fā)資料的收集與整理,學(xué)會撰
12、寫課程設(shè)計報告。并通過本次課程設(shè)計,提高自己的編程能力,掌握課程設(shè)計說明書的要求,為以后學(xué)習(xí),和工作打下良好的功底。</p><p><b> 1.2設(shè)計意義</b></p><p> 通過這次的課程設(shè)計,可以培養(yǎng)我們的學(xué)習(xí)能力,讓我們實事求是的學(xué)習(xí),通過努力,建立系統(tǒng)設(shè)計的整體思想,鍛煉我們編寫程序和調(diào)試程序的能力,學(xué)習(xí)文檔編寫規(guī)范,學(xué)習(xí)書寫說明書的規(guī)范,學(xué)習(xí)書
13、寫論文的規(guī)范,吸取他人學(xué)習(xí)的寶貴經(jīng)驗、勇于探索前言知識的習(xí)慣。同時數(shù)據(jù)結(jié)構(gòu)課程設(shè)計還可以彌補我們自身在實踐中所缺少的經(jīng)驗。這次對于漢諾塔這個問題的研究是我在Java課程學(xué)習(xí)中遞歸函數(shù)的一次實際運用,對我的遞歸函數(shù)的理解會有更多的幫助。同時還能根據(jù)算法對遞歸思想與所學(xué)的數(shù)據(jù)結(jié)構(gòu)中棧的方法進行比較。</p><p> 2設(shè)計目標(biāo)與總體方案</p><p><b> 2.1設(shè)計目標(biāo)
14、</b></p><p> 1) 設(shè)計GUI界面的Hannoi塔。漢諾塔中有三個座,名字分別為A,B,C。初始狀態(tài)時A塔上有3個大小不等的盤子,這些盤子從座底到座頂按著大小順序依次擺放在A座上。用戶可以用鼠標(biāo)選中盤子,然后通過拖動鼠標(biāo)來移動盤子。釋放鼠標(biāo)來放置該盤子。</p><p> 2) 程序要求用戶在移動盤子的過程中,不允許吧大盤子放置在小盤子的上面,用戶最終要完成的
15、是把A座上的全部盤子移動到B座或C座上。</p><p> 3) 用戶可以通過Hannoi塔界面提供的菜單來選擇初級、中級和高級三個級別。初級級別A座上有3個大小不等盤子、中級級別A座上有4個大小不等盤子、高級級別A座上有5個大小不等盤子。</p><p> 4) 用戶可以通過單擊Hannoi塔界面上提供的按鈕,讓程序自動完成把A座上的盤子全部移動到C座上。</p>&l
16、t;p> 5) 用戶在移動盤子的過程中,可以隨時單擊Hannoi塔界面上提供的按鈕,重新開始當(dāng)前的級別。</p><p><b> 2.2總體方案</b></p><p> 2.2.1 界面及其布局設(shè)計</p><p> 系統(tǒng)的整體布局為:BorderLayout布局, 采用了菜單、按鈕、面板…等組件,菜單主要包括選擇級別盤子個
17、數(shù),,按鈕的功能包括重新開始,自動演示,演示,暫停,繼續(xù),關(guān)閉。</p><p> 2.2.2 A、B、C座的實現(xiàn)方法</p><p> Tower類是javax.swing包中JPanel容器的一個子類,創(chuàng)建的對象tower是HannoiWindow窗口的成員之一,被添加到HannoiWindow窗口的中心位置。</p><p> 2.2.3 成員變量&
18、lt;/p><p> (1) amountOfDisc是int型數(shù)據(jù)。amountOfDisc值用來確定tower對象中盤子的數(shù)目,tower對象中Disc類型數(shù)組disc的長度。</p><p> (2) disc是Disc型數(shù)組,該數(shù)組的長度由amountOfDisc值來確定。Disc數(shù)組的每個單元中存放一個Disc對象,依次表明tower對象中有怎樣多的盤子。</p>
19、<p> (3) towerName是char型數(shù)組,長度為3,其三個單元的默認(rèn)取值依次是A、B和C。towerName是數(shù)組的單元的值用來確定tower中三個座的名字。</p><p> (4) maxDiscWidth和minDiscWidth的值分別用來確定最大盤子的寬度和最小盤子的寬度,discHeight的值確定每個盤子的高度。</p><p> (5)
20、 pointA、pointB和pointC都是TowerPoint型數(shù)組,三個數(shù)組的長度與盤子數(shù)目相同,即都是amountOfDisc。pointA、pointB和pointC單元都是TowerPoint創(chuàng)建對象,分別用來表示Hannoi塔中三個座上的塔點。A座、B座和C座上的三個塔點分別由pointA、pointB和pointC中的單元來確定。每個座上的三個塔點都是從座頂依次對應(yīng)數(shù)組的相應(yīng)單元中的TowerPoint對象。</p
21、><p> (6) handleMouse是HandleMouse類創(chuàng)建的鼠標(biāo)事件監(jiān)視器,用來監(jiān)視disc數(shù)組的Disc對象上觸發(fā)的鼠標(biāo)事件。</p><p> (7) autoMoveDisc是AutoMoveDisc創(chuàng)建的對話框。通過該對話框可以實現(xiàn)程序自動移動盤子。</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指定的塔點上放置dis
24、c數(shù)組的成員。</p><p> (7) tower容器調(diào)用getAutoMoveDisc ()方法返回其中的AutoMoveDisc對象:autoMoveDisc。tower是HannoiWindow窗口中的成員,當(dāng)用戶單擊HannoiWindow窗口中的autoButton按鈕時,窗口中的actionPerformed(ActionEvent)方法將被執(zhí)行,該方法所進行的操作是讓tower對象返回其中的A
25、utoMoveDisc對象,該對象是一個對話框,用戶可以通過該對話框讓程序自動地移動盤子。</p><p> (8) tower容器調(diào)用removeDisk ()方法可以移調(diào)tower容器中的盤子。</p><p> (9) tower容器調(diào)用paintComponent (Graphics)方法繪制出塔點的位置和必要的視圖。</p><p> 因此Tow
26、er類創(chuàng)建的按鈕的效果如圖2-2所示。</p><p><b> 如圖2-2</b></p><p> 2.2.5 圓盤的實現(xiàn)方法</p><p> Disc類是javax.swing包中Jbutton類的子類,所創(chuàng)建的對象稱作Hannoi塔中的“盤子”。Tower類有Disc類型的數(shù)組disc。Disc數(shù)組的單元是用Disc創(chuàng)建的對象
27、,被放置在Tower所創(chuàng)建的容器tower中,用來表示tower中的“盤子”。</p><p> 2.2.6 Disc成員變量</p><p> (1) number的值確定所創(chuàng)建的“盤子”上的數(shù)字號碼,通過該號碼的大小來確定盤子的大小關(guān)系,即號碼大的盤子大于號碼小的盤子。</p><p> (2) point是TowerPoint對象,是Disc所創(chuàng)建
28、的“盤子”的一個重要成員?!氨P子”被放置在tower容器的塔點上(TowerPoint對象稱作塔點),“盤子”通過使用point對象表明自己所在的塔點。</p><p> 2.2.7 Disc方法</p><p> (1) Disc()構(gòu)造方法。創(chuàng)建盤子對象時需要使用該構(gòu)造方法。</p><p> (2) setNumber(int)。盤子調(diào)用該方法設(shè)置
29、其上的數(shù)字號碼。</p><p> (3) getNumber()方法。盤子調(diào)用該方法返回其上的數(shù)字號碼。</p><p> (4) setPoint(TowerPoint)方法。盤子調(diào)用該方法設(shè)置其所在的塔點。</p><p> (5) getPoint()方法。盤子調(diào)用該方法返回其所在的塔點。</p><p> 因此Disc
30、創(chuàng)建的按鈕的效果如圖2-3所示。</p><p><b> 如圖2-3</b></p><p><b> 3設(shè)計方法和內(nèi)容</b></p><p><b> 3.1總體類關(guān)系</b></p><p> 在設(shè)計Hannoi塔時,需編寫6個JAVA源文件:HannoiWin
31、dow.Java 、TowerPoint.java、Disc.java、HandleMous.java和AutoMoveDisc.java。</p><p> Hannoi塔除了要編寫的6個Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如JMenubar,JMenu,JMenuItem和JButton。Hannoi塔所用到得一些重要的類以及類之間的組合關(guān)系如圖3-1所示</p>
32、<p><b> 3.2總體功能圖</b></p><p> 根據(jù)游戲需求分析,游戲主界面有“選擇級別”、“重新開始”、“自動演示”三個按鈕,每個按鈕分別實現(xiàn)“初級,中級,高級”、“運行游戲”、“自動演示”效果,因此做出總體功能圖如圖3-2所示:</p><p><b> 圖3-2</b></p><p&g
33、t; 3.3 總體流程圖</p><p> 根據(jù)游戲相關(guān)功能設(shè)計,得出總體流程圖如圖3-3</p><p> 圖3-3 總體流程圖</p><p><b> 4詳細(xì)設(shè)計內(nèi)容</b></p><p> 4.1 A、B、C座實現(xiàn)流程圖</p><p> 為了整體布局的美觀,首先要畫出
34、A、B、C座,主要經(jīng)過“畫三條豎線”,“畫三個點”、“畫矩形區(qū)域”、“畫座名”幾個步驟,得出制作流程圖如圖3.4.1-1所示:</p><p> 圖4.1-1 A、B、C座實現(xiàn)流程圖</p><p> 4.2 圓盤畫法流程圖</p><p> 與此同時,圓盤的制作要經(jīng)過“設(shè)置盤子編號”、“設(shè)置盤子塔點”、“將盤子放在指定位置”三個步驟,得出圓盤的制作流程圖
35、如圖4.2-2所示:</p><p> 圖4.2-2 圓盤畫法流程圖</p><p><b> 5 系統(tǒng)詳細(xì)設(shè)計</b></p><p> 5.1 HannoiWindow.java</p><p> HannoiWindow類負(fù)責(zé)創(chuàng)建Hannoi塔的主窗口,該類含有main方法,Hannoi塔從該類開始執(zhí)
36、行。HannoiWindow類的成員變量中有五種重要類型的對象,一個int基本型數(shù)據(jù)和一個char行數(shù)組。五種類型的對象分別是JMenubar ,JMenu,JMenuItem和JButton對象。</p><p> HannoiWindow創(chuàng)建的窗口以及其中的主要成員對象如圖5-1所示:</p><p><b> 圖5-1</b></p><
37、;p> 5.2 Tower.java</p><p> Tower類是javax.swing報中的JPanel容器的子類,創(chuàng)建的容器被添加到HannoiWindow窗口的中心。Tower類的成員變量中有四種重要的類型對象、一個int基本型數(shù)據(jù)和一個char型數(shù)組。</p><p> Tower創(chuàng)建的窗口以及其中的主要成員對象如圖5-2所示:</p><p&
38、gt;<b> 圖5-2</b></p><p> 5.3 Disc.java</p><p> Disc類是JButton的一個子類,創(chuàng)建的對象是Tower容器中的一個按鈕,用來表示Tower中的“盤子”。</p><p> Disc創(chuàng)建的窗口以及其中的主要成員對象如圖5-3所示:</p><p><b
39、> 圖5-3</b></p><p> 5.4 TowerPoint.java</p><p> TowerPint.Java類負(fù)責(zé)在Tower中創(chuàng)建表示位置的塔的對象。</p><p> Disc創(chuàng)建的窗口以及其中的主要成員對象如圖5-4所示:</p><p><b> 圖5-4</b>&
40、lt;/p><p> 5.5 HandleMouse.java</p><p> HandleMouse類創(chuàng)建的對象負(fù)責(zé)處理鼠標(biāo)事件。</p><p> HandleMouse類實現(xiàn)了MouseListener和MouseMotionListener接口,創(chuàng)建的對象handleMouse是tower容器的成員之一,負(fù)責(zé)監(jiān)視tower容器中Disc盤子對象上的鼠標(biāo)
41、事件。當(dāng)用戶用鼠標(biāo)點擊tower中的盤子,并拖動鼠標(biāo)時,handleMouse對象負(fù)責(zé)給出移動盤子的有關(guān)算法。標(biāo)明HandleMouse類的主要成員變量、方法以及和Tower類之間的組合關(guān)系的UML圖如圖5-6所示。</p><p> 5.6 AutoMoveDisc.java</p><p> AutoMoveDisc類創(chuàng)建的對象負(fù)責(zé)走動移動盤子從一個座到另一個座。</p&g
42、t;<p> AutoMoveDisc創(chuàng)建的窗口以及其中的主要成員對象如圖5-7所示:</p><p><b> 圖5-7</b></p><p> AutoMoveDisc類實現(xiàn)了ActionListener接口,創(chuàng)建的對象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è)計創(chuàng)新與關(guān)鍵技術(shù)</p><p><b> 6.1系統(tǒng)測試</b></p><p> (1) 程
44、序運行后,界面上有三個按鈕,分別是“選擇級別”、“重新開始”、“自動演示”;可以選擇“低中高”三個級別,當(dāng)玩家遇到困難時可以選擇重新開始或自動演示,初始界面如圖6.1-1所示:</p><p><b> 圖6.1-1</b></p><p> 2) 當(dāng)玩家選擇“自動演示"功能后,會出現(xiàn)一個自動演示過程的對話框,對話框可以清楚的顯示每步移動的步驟,玩家可
45、以選擇“暫停”,“繼續(xù)”按鈕,非常人性化,自動演示界面如圖6.1-2所示:</p><p><b> 圖6.1-2</b></p><p> (3) 級別分為“低級”、“中級”、“高級”三個級別,難度依次增大,盤子數(shù)目依次增多,分別為“三個”、“四個”、“五個”玩家可以隨意更改,選擇難度級別界面如圖6.1-3所示:</p><p><
46、;b> 圖6.1-3</b></p><p><b> 6.2代碼調(diào)試問題</b></p><p> 將前面6個Java源文件:HannoiWindow.java、Tower.java、TowerPoint.java、Disc.java、HandleMouse.java和AutoMoveDisc.java保存同一目錄中。分別編譯這6個Java源
47、文件,或運行“javac *.java”命令,編譯全部源文件,然后運行主類,即運行HannoiWindow類。</p><p><b> 6.3程序運行效果</b></p><p><b> 總結(jié)</b></p><p> 一個編程語言最強大的地方不是它是容易學(xué),或者難學(xué),而是它擁有一個強大的庫。JAVA是一個完全面
48、向?qū)ο蟮恼Z言,JAVA的命名規(guī)則是很容易讓人接受的。而且容易被編程人員記住。經(jīng)過實踐訓(xùn)練,對JAVA的綜合應(yīng)用能力有了較大的提高,另外對JAVA的特點有了更深層次的認(rèn)識。這次實踐中使用的代碼雖然不長,但類與類之間也有很強的邏輯關(guān)系,這就是面向?qū)ο笳Z言的最大優(yōu)勢,這樣可使我們更輕松的運用JAVA。</p><p> 這個Hannoi塔游戲就是在原有的程序基礎(chǔ)上增加了改變盤子數(shù)目功能、自動演示功能。由于是在原有的基
49、礎(chǔ)上修改的,雖然理論上那個來講這應(yīng)該很簡單,不會太難,但當(dāng)我真正著手做起來得時候才發(fā)現(xiàn),原來自己還是太嫩,剛開始什么都不懂,于是我就去圖書館參閱了大量的資料,也不停的向同學(xué)們請教,終于漸漸的讓我從剛開始連如何運行程序,甚至類的作用等一些罪基本的東西都不清楚到最后通過努力終于把這個程序成功搞定。自然這期間除了辛苦也讓我明白了很多,有些小問題也是不容忽視的,就如公共類只能有一個,而且必須要有及類名必須要同公共類名相同,否則程序就無法運行。&
50、lt;/p><p> 經(jīng)過努力,查閱相關(guān)資料,終于完成該課題,雖然效果不是很好,但親手做過之后還是很有成就感的。</p><p> 實踐的時間雖短,但是從中我確實獲益匪淺,期待以后能有更多這樣的機會。通過這次課程設(shè)計發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。在設(shè)計中也遇到了很多編程問題,但最后經(jīng)過自己的努力和大家的幫助完成了這次課程設(shè)計。這讓我明白了只要有恒心
51、,有耐心,就可以達(dá)到自己的目標(biāo),完成任務(wù)!</p><p><b> 致謝</b></p><p> 感謝這次關(guān)于Java做課設(shè)的課程!在這里我學(xué)到了許多有關(guān)Java方面的知識點!在程序完善的過程中,遇到了這樣或那樣的問題但是經(jīng)過自己的不懈努力及查閱大量的資料,最終都得到了滿意的答案。感謝這次的課程設(shè)計,我們不僅開闊了視野,增加了學(xué)識,而且為我們今后的工作和學(xué)習(xí)打
52、下了牢固的基礎(chǔ),也增加了對計算機的興趣。</p><p><b> 參考文獻</b></p><p> [1] 趙生慧.Java面向?qū)ο蟪绦蛟O(shè)計.北京:高等教育出版社,2007.</p><p> [2] 甘仞初.信息系統(tǒng)開發(fā).北京:北京經(jīng)濟科學(xué)出版社,2005.</p><p> [3] 李宣東,李存珠.軟件工
53、程概論.北京:南京大學(xué)計算機系出版,2008.</p><p> [4] 袁然,鄭自國,鄒豐義.JAVA案例開發(fā)集錦.北京:電子工業(yè)出版社,2005.</p><p> [5] ??藸?Java編程思想.陳昊鵬譯.第4版.北京:機械工業(yè)出版社,2007.</p><p> [6] 李存珠,李宣東.軟件工程概論.南京:南京大學(xué)計算機系出版,2005.</p
54、><p> [7] 張廣彬,孟紅蕊,張永寶.Java課程設(shè)計案例精編.北京:清華大學(xué)出版社,2006.</p><p> [8] Walter Seavith.Java 完美編程.第三版.北京:清華大學(xué)出版社,2008.</p><p> [9] 張蓓.JAVA通用模塊及典型系統(tǒng)開發(fā)實例導(dǎo)航.北京:人民郵電出版社,2006.</p><p>
55、; [10] BruceEckel.Java編程思想.北京:機械工業(yè)出版社,2006.</p><p> [11] FLANAGAN.Java技術(shù)手冊.北京:中國電力出版社,2007.</p><p> [12] 孫一林,彭波.Java數(shù)據(jù)庫編程實例.北京:清華大學(xué)出版社,2008.</p><p> [13] 吳其慶.Java程序設(shè)計實例教程.北京:冶金工
56、業(yè)出版社,2007.</p><p> [14] 柳西玲.Java語言應(yīng)用開發(fā)基礎(chǔ).北京:清華大學(xué)出版社,2008.</p><p> [15] 朱戰(zhàn)立.Java程序設(shè)計實用教程.北京:人民郵電出版,2010.</p><p> [16] 宛延闿.實用Java程序設(shè)計教程.北京:機械工業(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("選擇級別");</p><p> oneGradeItem=new JMenuItem("初級");</p><p> twoGradeItem=new JMenuItem("中級");<
63、/p><p> threeGradeItem=new JMenuItem("高級");</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("重新開始");</p><p> renew.addActionListener(this);</p><p> autoButton=new JButton("自動演示");
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]+"座搬運到"+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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢諾塔課程設(shè)計--漢諾塔演示程序設(shè)計
- 漢諾塔問題課程設(shè)計
- 《新漢諾塔》課程設(shè)計
- 漢諾塔課程設(shè)計--基于vc++的漢諾塔游戲設(shè)計
- java課程設(shè)計說明書---連連看
- 填料吸收塔課程設(shè)計說明書
- 填料吸收塔課程設(shè)計說明書
- mfc課程設(shè)計報告—漢諾塔演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--漢諾塔游戲
- 人事管理系統(tǒng)_java課程設(shè)計說明書
- 圖書銷售管理系統(tǒng)-java課程設(shè)計說明書
- java餐廳點餐系統(tǒng)課程設(shè)計說明書
- 板式塔中的浮閥塔課程設(shè)計說明書
- 化工原理課程設(shè)計說明書---精餾塔設(shè)計
- 基于java漢諾塔游戲設(shè)計與實現(xiàn)
- 課程設(shè)計說明書
- 課程設(shè)計說明書
- 萬年歷java課程設(shè)計說明書
- 化工原理課程設(shè)計說明書---填料吸收塔設(shè)計
- 精餾塔控制方案設(shè)計課程設(shè)計說明書
評論
0/150
提交評論