




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計(jì)任務(wù)書學(xué) 院信息學(xué)院專 業(yè)學(xué)生姓名班級(jí)學(xué)號(hào) 課程設(shè)計(jì)題目基于Java的Hannoi塔軟件設(shè)計(jì)實(shí)踐教學(xué)要求與任務(wù):采用java技術(shù)設(shè)計(jì)Hannoi塔軟件,設(shè)計(jì)要求如下:(1) 設(shè)計(jì)GUI界面的Hannoi塔。Hannoi塔中有三個(gè)座,名字分別是A、B和C.初始狀態(tài)是A座上有3個(gè)大小不等的盤子,這些盤子中從座底到座頂按著大小順序依次擺放在A座上。用戶可以用鼠標(biāo)選中盤子,然后通過拖動(dòng)鼠標(biāo)來移動(dòng)該盤子、釋放鼠標(biāo)來放置該盤子。(2) 程序要求用戶在移動(dòng)盤子的過程中,不允許把大盤放置在小盤的上面,用戶最終要完成的是把A座上的全部盤子移動(dòng)到B座或C座上。(3) 用戶可以通過Hannoi塔界面提供的菜
2、單來選擇初級(jí)、中級(jí)和高級(jí)三個(gè)級(jí)別。初級(jí)級(jí)別A座上有3個(gè)大小不等盤子、中級(jí)級(jí)別A座上有4個(gè)大小不等盤子、高級(jí)級(jí)別A座上有5個(gè)大小不等盤子。(4) 用戶可以通過單擊Hannoi塔界面上提供的按鈕,讓程序自動(dòng)完成把A座上的盤子全部移動(dòng)到C座上。(5) 用戶在移動(dòng)盤子的過程中,可以隨時(shí)單擊Hannoi塔界面上提供的按鈕,重新開始當(dāng)前的級(jí)別。工作計(jì)劃與進(jìn)度安排: 第18周:布置課程設(shè)計(jì)任務(wù),查閱資料,分組設(shè)計(jì),程序調(diào)試。 第19周:程序調(diào)試,編寫課程設(shè)計(jì)報(bào)告,驗(yàn)收,答辯。指導(dǎo)教師: 2012年 月 日專業(yè)負(fù)責(zé)人: 2012年 月 日學(xué)院教學(xué)副院長: 2012年 月 日目錄成績?cè)u(píng)定表.1課程設(shè)計(jì)任務(wù)書.2
3、緒論.3目錄41 相關(guān)技術(shù)介紹.51.1 開發(fā)工具.51.2 應(yīng)用環(huán)境.51.3 問題的提出.51.4 任務(wù)設(shè)計(jì)內(nèi)容.62 系統(tǒng)需求分析.72.1 界面及其布局設(shè)計(jì).72.2 A,B,C座的實(shí)現(xiàn)方法.72.2.1 成員變量.82.2.2 方法.82.3 圓盤的實(shí)現(xiàn)方法.92.3.1 Disc成員變量.102.3.2 Disc方法.103 系統(tǒng)總體設(shè)計(jì).113.1 總體類關(guān)系.113.2 總體功能圖.113.3 總體流程圖.124 系統(tǒng)主要功能設(shè)計(jì)流程圖.134.1 A,B,C座實(shí)現(xiàn)流程圖.134.2 圓盤畫法流程圖.135 系統(tǒng)詳細(xì)設(shè)計(jì).156 源代碼.207 系統(tǒng)測(cè)試.278 總結(jié).28 緒
4、 論漢諾塔(又稱河內(nèi)塔)問題是印度的一個(gè)古老的傳說。開天辟地的神勃拉瑪在一個(gè)廟里留下了三根金剛石的棒,第一根上面套著64個(gè)圓的金片,最大的一個(gè)在底下,其余一個(gè)比一個(gè)小,依次疊上去,廟里的眾僧不倦地把它們一個(gè)個(gè)地從這根棒搬到另一根棒上,規(guī)定可利用中間的一根棒作為幫助,但每次只能搬一個(gè),而且大的不能放在小的上面。解答結(jié)果請(qǐng)自己運(yùn)行計(jì)算,程序見尾部。面對(duì)龐大的數(shù)字(移動(dòng)圓片的次數(shù)),看來,眾僧們耗盡畢生精力也不可能完成金片的移動(dòng)。后來,這個(gè)傳說就演變?yōu)闈h諾塔游戲: (1) 有三根桿子A,B,C。A桿上有若干碟子 (2) 每次移動(dòng)一塊碟子,小的只能疊在大的上面 (3) 把所有碟子從A桿全部移到C桿上
5、經(jīng)過研究發(fā)現(xiàn),漢諾塔的破解很簡單,就是按照移動(dòng)規(guī)則向一個(gè)方向移動(dòng)金片:如3階漢諾塔的移動(dòng):AC,AB,CB,AC,BA,BC,AC。此外,漢諾塔問題也是程序設(shè)計(jì)中的經(jīng)典遞歸問題。和漢諾塔故事相似的,還有另外一個(gè)印度傳說:舍罕王打算獎(jiǎng)賞國際象棋的發(fā)明人宰相西薩·班·達(dá)依爾。國王問他想要什么,他對(duì)國王說:“陛下,請(qǐng)您在這張棋盤的第1個(gè)小格里賞給我一粒麥子,在第2個(gè)小格里給2粒,第3個(gè)小格給4粒,以后每一小格都比前一小格加一倍。請(qǐng)您把這樣擺滿棋盤上所有64格的麥粒,都賞給您的仆人吧!”國王覺得這個(gè)要求太容易滿足了,就命令給他這些麥粒。當(dāng)人們把一袋一袋的麥子搬來開始計(jì)數(shù)時(shí),國王才發(fā)
6、現(xiàn):就是把全印度甚至全世界的麥粒全拿來,也滿足不了那位宰相的要求。 那么,宰相要求得到的麥粒到底有多少呢?總數(shù)為1+2+22 + +263 =264-1和移完漢諾塔的次數(shù)一樣。我們已經(jīng)知道這個(gè)數(shù)字有多么大了。人們估計(jì),全世界兩千年也難以生產(chǎn)這么多麥子! 1 相關(guān)技術(shù)介紹1.1 開發(fā)工具Sun Microsystems公司在推出Java語言的同時(shí),推出了一套開發(fā)工具JDK。Sun提供的基于字符模式的Java開發(fā)工具包JDK: Java開發(fā)工具(JDK)是許多Java專家最初使用的開發(fā)環(huán)境。Java是平臺(tái)無關(guān)的語言是指用Java寫的應(yīng)用程序不用修改就可在不同的軟硬件平臺(tái)上運(yùn)行。 Java源程序編寫
7、借助于記事本,Editpuls,UltraEdit等第三方編輯工具。所有的Java文件編輯、編譯、調(diào)試、解釋運(yùn)行都是通過使用字符命令來執(zhí)行操作。JDK由一個(gè)標(biāo)準(zhǔn)類庫和一組建立,測(cè)試及建立文檔的Java實(shí)用程序組成。其核心JavaAPI是一些預(yù)定義的類庫,開發(fā)人員需要用這些類來訪問Java語言的功能。JDK 是整個(gè)Java的核心,包括了Java運(yùn)行環(huán)境(Java RuntimeEnvirnment),一堆Java工具和Java基礎(chǔ)的類庫(rt.jar)。不論什么Java應(yīng)用服務(wù)器實(shí)質(zhì)都是內(nèi)置了某個(gè)版本的JDK,因此掌握J(rèn)DK是學(xué)好Java的第一步。 JDK里面是java類庫和java的語言規(guī)范,
8、它提供的是無論你用何種開發(fā)軟件寫java程序都必須用到的類庫和java語言規(guī)范.沒有jdk,你的java程序根本就不能用。最主流的JDK是Sun公司發(fā)布的JDK,除了Sun之外,還有很多公司和組織都開發(fā)了自己的JDK,例如IBM公司開發(fā)的JDK,BEA公司的Jrocket,還有GNU組織開發(fā)的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)運(yùn)行效率要比SunJDK包含的JVM高出許多。而專門運(yùn)行在x86平臺(tái)的Jrocket在服務(wù)端運(yùn)行效率也要比SunJDK好很多。但不管怎么說,我們還是需要先把Sun JDK掌握好。1.2 應(yīng)用環(huán)境(1) 操作系統(tǒng):Wind
9、ows XP及以上版本(2) 應(yīng)用軟件:JDK2.0 Eclipse6.01.3 問題的提出隨著計(jì)算機(jī)得普及,人們?cè)絹碓蕉嗟媒佑|到計(jì)算機(jī),人們得生活工作中無處不有計(jì)算機(jī)得身影,人們面對(duì)長時(shí)間的難免會(huì)有倦怠的情緒,而人們大多得緩解情緒得網(wǎng)絡(luò)活動(dòng)其實(shí)并不能起到放松心情得作用?,F(xiàn)代人得生活節(jié)奏越來越快,有沒有一種快速緩解疲倦得游戲呢?我們提出設(shè)計(jì)一款益智得小游戲,這種游戲不會(huì)花太多時(shí)間,同時(shí)把玩家得思維帶動(dòng)起來,達(dá)到一舉多得得效果。1.4 任務(wù)設(shè)計(jì)內(nèi)容(1) 設(shè)計(jì)Hannoi塔中有三個(gè)座,名字分別是A、B和C。初始狀態(tài)是A座上有3個(gè)大小不等的盤子,這些盤子從座底到座頂按著大小順序依次擺放在A座上。用
10、戶可以用鼠標(biāo)選中盤子,然后通過拖動(dòng)鼠標(biāo)來移動(dòng)該盤子、釋放鼠標(biāo)來放置該盤子;(2) 程序要求用戶在移動(dòng)盤子過程中,不允許把大盤放置在小盤的上面,用戶最終要完成的是把A座上的全部盤子移動(dòng)到B座或C座上;(3) 用戶可以通過Hannoi塔界面提供的菜單來選擇初級(jí)、中級(jí)、高級(jí)三個(gè)級(jí)別。初級(jí)級(jí)別A座上有3個(gè)大小不等盤子、中級(jí)級(jí)別A座上有4個(gè)大小不等盤子、高級(jí)級(jí)別A座上有5個(gè)大小不等盤子。(4) 用戶可以通過單擊Hannoi塔界面上提供的按鈕,讓程序自動(dòng)完成把A座上的盤子全部移動(dòng)到C座上;(5) 用戶在移動(dòng)盤子的過程中,可以隨時(shí)單擊Hannoi塔界面上提供的按鈕,重新開始當(dāng)前的級(jí)別;(6) 有移動(dòng)記錄功能
11、,即顯示用戶完成移動(dòng)盤子所移動(dòng)的步驟;(7) 在自動(dòng)移動(dòng)過程中可以隨時(shí)暫停、繼續(xù)。2 系統(tǒng)需求分析2.1 界面及其布局設(shè)計(jì) 系統(tǒng)的整體布局為:BorderLayout布局, 采用了菜單、按鈕、面板等組件,菜單主要包括選擇級(jí)別盤子個(gè)數(shù),,按鈕的功能包括重新開始,自動(dòng)演示,演示,暫停,繼續(xù),關(guān)閉。2.2 A、B、C座的實(shí)現(xiàn)方法 Tower類是javax.swing包中JPanel容器的一個(gè)子類,創(chuàng)建的對(duì)象tower是HannoiWindow窗口的成員之一,被添加到HannoiWindow窗口的中心位置。標(biāo)明Tower類的主要成員變量和方法以及和HannoiWindow類之間組合關(guān)系的UML圖如圖2
12、-1所示。圖2-1 Tower 類的UML圖2.2.1 成員變量(1) amountOfDisc是int型數(shù)據(jù)。amountOfDisc值用來確定tower對(duì)象中盤子的數(shù)目,tower對(duì)象中Disc類型數(shù)組disc的長度。(2) disc是Disc型數(shù)組,該數(shù)組的長度由amountOfDisc值來確定。Disc數(shù)組的每個(gè)單元中存放一個(gè)Disc對(duì)象,依次表明tower對(duì)象中有怎樣多的盤子。(3) towerName是char型數(shù)組,長度為3,其三個(gè)單元的默認(rèn)取值依次是A、B和C。towerName是數(shù)組的單元的值用來確定tower中三個(gè)座的名字。(4) maxDiscWidth和minDiscW
13、idth的值分別用來確定最大盤子的寬度和最小盤子的寬度,discHeight的值確定每個(gè)盤子的高度。(5) pointA、pointB和pointC都是TowerPoint型數(shù)組,三個(gè)數(shù)組的長度與盤子數(shù)目相同,即都是amountOfDisc。pointA、pointB和pointC單元都是TowerPoint創(chuàng)建對(duì)象,分別用來表示Hannoi塔中三個(gè)座上的塔點(diǎn)。A座、B座和C座上的三個(gè)塔點(diǎn)分別由pointA、pointB和pointC中的單元來確定。每個(gè)座上的三個(gè)塔點(diǎn)都是從座頂依次對(duì)應(yīng)數(shù)組的相應(yīng)單元中的TowerPoint對(duì)象。(6) handleMouse是HandleMouse類創(chuàng)建的鼠標(biāo)
14、事件監(jiān)視器,用來監(jiān)視disc數(shù)組的Disc對(duì)象上觸發(fā)的鼠標(biāo)事件。(7) autoMoveDisc是AutoMoveDisc創(chuàng)建的對(duì)話框。通過該對(duì)話框可以實(shí)現(xiàn)程序自動(dòng)移動(dòng)盤子。2.2.2 方法(1) Tower(char)是構(gòu)造方法,負(fù)責(zé)完成tower容器的初始化。(2) tower容器調(diào)用setAmountOfDisc(int)方法可以設(shè)置amountOfDisc的值。(3) tower容器調(diào)用setMaxDiscWidth(int)方法可以設(shè)置最大的盤子的大小。(4) tower容器調(diào)用setMinDiscWidth(int)方法可以設(shè)置最小的盤子的大小。(5) tower容器調(diào)用setDi
15、scHeight(int)方法可以設(shè)置盤子的高度。(6) tower容器調(diào)用putDiscOnTower ()方法可以將盤子放置在Hannoi塔的A座上,即在pointA指定的塔點(diǎn)上放置disc數(shù)組的成員。(7) tower容器調(diào)用getAutoMoveDisc ()方法返回其中的AutoMoveDisc對(duì)象:autoMoveDisc。tower是HannoiWindow窗口中的成員,當(dāng)用戶單擊HannoiWindow窗口中的autoButton按鈕時(shí),窗口中的actionPerformed(ActionEvent)方法將被執(zhí)行,該方法所進(jìn)行的操作是讓tower對(duì)象返回其中的AutoMoveD
16、isc對(duì)象,該對(duì)象是一個(gè)對(duì)話框,用戶可以通過該對(duì)話框讓程序自動(dòng)地移動(dòng)盤子。(8) tower容器調(diào)用removeDisk ()方法可以移調(diào)tower容器中的盤子。(9) tower容器調(diào)用paintComponent (Graphics)方法繪制出塔點(diǎn)的位置和必要的視圖。 因此Tower類創(chuàng)建的按鈕的效果如圖2-2所示。圖2-2 Tower創(chuàng)建容器視圖2.3 圓盤的實(shí)現(xiàn)方法Disc類是javax.swing包中Jbutton類的子類,所創(chuàng)建的對(duì)象稱作Hannoi塔中的“盤子”。Tower類有Disc類型的數(shù)組disc。Disc數(shù)組的單元是用Disc創(chuàng)建的對(duì)象,被放置在Tower所創(chuàng)建的容器to
17、wer中,用來表示tower中的“盤子”。標(biāo)明Disc類的主要成員變量、方法以及和Tower類之間組合關(guān)系的UML如圖2-3所示。 圖2-3 Disc類的UML圖2.3.1 Disc成員變量(1) number的值確定所創(chuàng)建的“盤子”上的數(shù)字號(hào)碼,通過該號(hào)碼的大小來確定盤子的大小關(guān)系,即號(hào)碼大的盤子大于號(hào)碼小的盤子。(2) point是TowerPoint對(duì)象,是Disc所創(chuàng)建的“盤子”的一個(gè)重要成員?!氨P子”被放置在tower容器的塔點(diǎn)上(TowerPoint對(duì)象稱作塔點(diǎn)),“盤子”通過使用point對(duì)象表明自己所在的塔點(diǎn)。2.3.2 Disc方法(1) Disc()構(gòu)造方法。創(chuàng)建盤子對(duì)象時(shí)
18、需要使用該構(gòu)造方法。(2) setNumber(int)。盤子調(diào)用該方法設(shè)置其上的數(shù)字號(hào)碼。(3) getNumber()方法。盤子調(diào)用該方法返回其上的數(shù)字號(hào)碼。(4) setPoint(TowerPoint)方法。盤子調(diào)用該方法設(shè)置其所在的塔點(diǎn)。(5) getPoint()方法。盤子調(diào)用該方法返回其所在的塔點(diǎn)。因此Disc創(chuàng)建的按鈕的效果如圖2-4所示。圖2-4 Disc創(chuàng)建的三個(gè)按鈕3 系統(tǒng)總體設(shè)計(jì)3.1 總體類關(guān)系在設(shè)計(jì)Hannoi塔時(shí),需編寫6個(gè)JAVA源文件:HannoiWindow.Java 、TowerPoint.java、Disc.java、HandleMous.java和Au
19、toMoveDisc.java。Hannoi塔除了要編寫的6個(gè)Java源文件所給出的類外,還需要Java系統(tǒng)提供的一些重要的類,如JMenubar,JMenu,JMenuItem和JButton。Hannoi塔所用到得一些重要的類以及類之間的組合關(guān)系如圖3-1所示:圖3-1 類之間的組合關(guān)系3.2 總體功能圖 根據(jù)游戲需求分析,游戲主界面有“選擇級(jí)別”、“重新開始”、“自動(dòng)演示”三個(gè)按鈕,每個(gè)按鈕分別實(shí)現(xiàn)“初級(jí),中級(jí),高級(jí)”、“運(yùn)行游戲”、“自動(dòng)演示”效果,因此做出總體功能圖如圖3-2所示: 圖3-2 總體功能圖3.3 總體流程圖 根據(jù)游戲相關(guān)功能設(shè)計(jì),得出總體流程圖如圖3-3所示: 圖3-3
20、 總體流程圖4 系統(tǒng)主要功能設(shè)計(jì)流程圖4.1 A、B、C座實(shí)現(xiàn)流程圖為了整體布局的美觀,首先要畫出A、B、C座,主要經(jīng)過“畫三條豎線”,“畫三個(gè)點(diǎn)”、“畫矩形區(qū)域”、“畫座名”幾個(gè)步驟,得出制作流程圖如圖4-1所示:圖4-1 A、B、C座實(shí)現(xiàn)流程圖4.2 圓盤畫法流程圖與此同時(shí),圓盤的制作要經(jīng)過“設(shè)置盤子編號(hào)”、“設(shè)置盤子塔點(diǎn)”、“將盤子放在指定位置”三個(gè)步驟,得出圓盤的制作流程圖如圖4-2所示:圖4-2 圓盤畫法流程圖5 系統(tǒng)詳細(xì)設(shè)計(jì)5.1 HannoiWindow.java(主類) HannoiWindow類負(fù)責(zé)創(chuàng)建Hannoi塔的主窗口,該類含有main方法,Hannoi塔從該類開始執(zhí)行
21、。HannoiWindow類的成員變量中有五種重要類型的對(duì)象,一個(gè)int基本型數(shù)據(jù)和一個(gè)char行數(shù)組。五種類型的對(duì)象分別是JMenubar ,JMenu,JMenuItem和JButton對(duì)象。 HannoiWindow創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-1所示:圖5-1 HannoiWindow窗口及主要的成員對(duì)象5.2 Tower.javaTower類是javax.swing報(bào)中的JPanel容器的子類,創(chuàng)建的容器被添加到HannoiWindow窗口的中心。Tower類的成員變量中有四種重要的類型對(duì)象、一個(gè)int基本型數(shù)據(jù)和一個(gè)char型數(shù)組。Tower創(chuàng)建的窗口以及其中的主要成員對(duì)
22、象如圖5-2所示: 圖5-2 Tower創(chuàng)建的tower容器5.3 Disc.java Disc類是JButton的一個(gè)子類,創(chuàng)建的對(duì)象是Tower容器中的一個(gè)按鈕,用來表示Tower中的“盤子”。 Disc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-3所示:圖5-3 Disc創(chuàng)建的三個(gè)按鈕5.4 TowerPoint.java TowerPint.Java類負(fù)責(zé)在Tower中創(chuàng)建表示位置的塔的對(duì)象。 Disc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖5-4所示: 圖5-4 TowerPoint繪制出的塔頂 TowerPoint所創(chuàng)建的對(duì)象將作為HannoiTower類中TowerPoint型數(shù)組poi
23、ntA、pointB和pointC中的元素。標(biāo)明TowerPoint類的主要成員變量、方法以及Tower類之間組合關(guān)系的UML 圖如圖5-5所示。 TowerPointTower PointA:TowerPointPointB: TowerPointPointC: TowerPointx,y:int有盤子:boolean盤子:Disk Equals(TowerPoint):BooleanputDisc(Component,Container):voidgetDiscOnPoint(): DiscremoveDisc(Component,Container):voidTowerPoint(int
24、,int):無類型是否有盤子():Booleanset有盤子(boolean):voidgetX(): intgetY(): int放置盤子():void獲取盤子():Disk 圖5-5 TowerPoint類的UML圖以下是UML圖中有關(guān)數(shù)據(jù)和方法的詳細(xì)說明。 成員變量 x和y是TowerPoint對(duì)象中的兩個(gè)int型數(shù)據(jù),用來表示塔點(diǎn)在容器tower中的坐標(biāo)。tower容器的坐標(biāo)原點(diǎn)是容器的左上角,向右是x軸的正方向,向下是y軸的正方向。有盤子是boolean數(shù)據(jù),如果當(dāng)前塔點(diǎn)上有盤子時(shí),該數(shù)據(jù)為true;否則為false。盤子是Disk聲明的對(duì)象,用來存放當(dāng)前塔點(diǎn)上的盤子對(duì)象的引用,如果
25、當(dāng)前塔點(diǎn)上有盤子,盤子存放的引用是null,即盤子是空對(duì)象。 方法TowerPoint(int,int)是構(gòu)造方法,用來創(chuàng)建塔點(diǎn)對(duì)象。塔點(diǎn)對(duì)象調(diào)用是否有盤子()方法可以返回一個(gè)boolean數(shù)據(jù),如果調(diào)用該方法的塔點(diǎn)上有盤子,是否有盤子()方法返回true;否則返回false。塔點(diǎn)對(duì)象調(diào)用set有盤子(boolean)方法可以根據(jù)參數(shù)的值設(shè)置當(dāng)前塔點(diǎn)上是否有盤子。塔點(diǎn)對(duì)象調(diào)用getX()和getY()方法可以返回塔點(diǎn)的坐標(biāo)中的x軸坐標(biāo)和y軸坐標(biāo)。塔點(diǎn)對(duì)象調(diào)用Equals(TowerPoint)方法可以判斷當(dāng)前塔點(diǎn)是否和參數(shù)指定的塔點(diǎn)相同。塔點(diǎn)對(duì)象調(diào)用Equals(TowerPoint)方法pu
26、tDisc(Component com,Container con)方法,將參數(shù)com指定的盤子放置在參數(shù)con指定的容器中,盤子所在位置由當(dāng)前的塔點(diǎn)坐標(biāo)所確定,即將盤子放置在當(dāng)前塔點(diǎn)上。塔點(diǎn)對(duì)象調(diào)用getDiscOnPoint()方法可以返回當(dāng)前塔點(diǎn)上的盤子。塔點(diǎn)對(duì)象調(diào)用removeDisc(Component com,Container con)方法可以移掉當(dāng)前塔點(diǎn)上的盤子。5.5 HandleMouse.java HandleMouse類創(chuàng)建的對(duì)象負(fù)責(zé)處理鼠標(biāo)事件。 HandleMouse類實(shí)現(xiàn)了MouseListener和MouseMotionListener接口,創(chuàng)建的對(duì)象handl
27、eMouse是tower容器的成員之一,負(fù)責(zé)監(jiān)視tower容器中Disc盤子對(duì)象上的鼠標(biāo)事件。當(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所示。MouseMotionListenerMouseListenerTower HandleMousehandleMouse:handleMousepointA,pointB,pointC:TowerPointstartPoint,endPoint:TowerPointcon;ContainerHa
28、ndleMouse(Container con):無類型SetPointA(TowerPoint):voidSetPointB(TowerPoint):voidSetPointC(TowerPoint):voidmousePressed(MouseEvent):voidmouseDragged(MouseEvent):voidmouseReleased(MouseEvent):void圖5-6 Tower類的UML圖 5.6 AutoMoveDisc.java AutoMoveDisc類創(chuàng)建的對(duì)象負(fù)責(zé)走動(dòng)移動(dòng)盤子從一個(gè)座到另一個(gè)座。 AutoMoveDisc創(chuàng)建的窗口以及其中的主要成員對(duì)象如圖
29、5-7所示: (a)自動(dòng)移動(dòng)盤子從A到C (b)對(duì)話框顯示文字信息圖5-7 AutoMoveDisc類創(chuàng)建的對(duì)話框AutoMoveDisc類實(shí)現(xiàn)了ActionListener接口,創(chuàng)建的對(duì)象autoMoveDisc是Tower的成員之一。標(biāo)明AutoMoveDisc類的主要成員變量、方法、以及和Tower類之間組合關(guān)系的UML圖如圖5-8所示。ActionListener AutoMoveDiscAmountOfDisc: int ShowStep:JTextAreapointA,pointB,pointC, TowerPoint bStart,bStop,bContinue,bCldse:t
30、owerName: char JButtoncon: Container time: TimermoveStep:StringBufferTowerautoMoveDisc:AutoMoveDiscAutoMoveDisc(Container con):無類型SetPointA(TowerPoint):voidSetPointB(TowerPoint):voidSetPointC(TowerPoint):voidactionPerformed(ActionEvent):voidsetTowerName(char):voidsetAmountOfDisc(int):voidsetMoveStep
31、(int,char,char,char):voidAutoMoveDisc(char,char):void 圖5-7 AutoMoveDisc類的UML圖圖5-8 AutoMoveDisc類的UML圖6 源代碼import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiWindow extends JFrame implements ActionListener Tower tower=null; int amountOfDisc=3; char towerName='A',
32、'B','C' JMenuBar bar; JMenu menuGrade; JMenuItem oneGradeItem,twoGradeItem,threeGradeItem; JButton renew=null; JButton autoButton=null; JPanel center=new JPanel(); HannoiWindow() tower=new Tower(towerName); tower.setAmountOfDisc(amountOfDisc); tower.setMaxDiscWidth(120); tower.setMin
33、DiscWidth(50); tower.setDiscHeight(16); tower.putDiscOnTower(); add(tower,BorderLayout.CENTER); bar=new JMenuBar(); menuGrade=new JMenu("選擇級(jí)別"); oneGradeItem=new JMenuItem("初級(jí)"); twoGradeItem=new JMenuItem("中級(jí)"); threeGradeItem=new JMenuItem("高級(jí)"); menuGrade.a
34、dd(oneGradeItem); menuGrade.add(twoGradeItem); menuGrade.add(threeGradeItem); bar.add(menuGrade); setJMenuBar(bar); oneGradeItem.addActionListener(this); twoGradeItem.addActionListener(this); threeGradeItem.addActionListener(this); renew=new JButton("重新開始"); renew.addActionListener(this);
35、autoButton=new JButton("自動(dòng)演示"); autoButton.addActionListener(this); JPanel north=new JPanel(); north.add(renew); north.add(autoButton); String mess="將全部盤子從"+towerName0+"座搬運(yùn)到"+towerName1+ "座或"+towerName2+"座" JLabel hintMess=new JLabel(mess,JLabel.CENT
36、ER); north.add(hintMess); add(north,BorderLayout.NORTH); setResizable(false); setVisible(true); setBounds(60,60,460,410); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void actionPerformed(ActionEvent e) if(e.getSource()=oneGradeItem) amountOfDisc=3; tower.setAmountOfDisc(amount
37、OfDisc); tower.putDiscOnTower(); else if(e.getSource()=twoGradeItem) amountOfDisc=4; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=threeGradeItem) amountOfDisc=5; tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=renew) tower.setA
38、mountOfDisc(amountOfDisc); tower.putDiscOnTower(); else if(e.getSource()=autoButton) tower.setAmountOfDisc(amountOfDisc); tower.putDiscOnTower(); int x=this.getBounds().x+this.getBounds().width; int y=this.getBounds().y; tower.getAutoMoveDisc().setLocation(x,y); tower.getAutoMoveDisc().setSize(280,t
39、his.getBounds().height); tower.getAutoMoveDisc().setVisible(true); validate(); public static void main(String args) new HannoiWindow(); Tower類import javax.swing.*;import java.awt.*;public class Tower extends JPanel int amountOfDisc=3; Disc disc; int maxDiscWidth,minDiscWidth,discHeight; char towerNa
40、me; TowerPoint pointA,pointB,pointC; HandleMouse handleMouse; AutoMoveDisc autoMoveDisc; Tower(char towerName) handleMouse=new HandleMouse(this); this.towerName=towerName; setLayout(null); setBackground(new Color(200,226,226); public void setAmountOfDisc(int number) if(number<=1) amountOfDisc=1;
41、else amountOfDisc=number; public void setMaxDiscWidth(int m) maxDiscWidth=m; public void setMinDiscWidth(int m) minDiscWidth=m; public void setDiscHeight(int h) discHeight=h; public AutoMoveDisc getAutoMoveDisc() return autoMoveDisc; public void putDiscOnTower() removeDisk(); int n=(maxDiscWidth-min
42、DiscWidth)/amountOfDisc; disc=new DiscamountOfDisc; for(int i=0;i<disc.length;i+) disci=new Disc(); disci.setNumber(i); int diskwidth=minDiscWidth+i*n; disci.setSize(diskwidth,discHeight); disci.addMouseListener(handleMouse); disci.addMouseMotionListener(handleMouse); pointA=new TowerPointamountO
43、fDisc; pointB=new TowerPointamountOfDisc; pointC=new TowerPointamountOfDisc; int vertialDistance=discHeight; for(int i=0;i<pointA.length;i+) pointAi=new TowerPoint(maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; vertialDistance=discHeight; for(int i=0;i<pointB.le
44、ngth;i+) pointBi=new TowerPoint(2*maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; vertialDistance=discHeight; for(int i=0;i<pointC.length;i+) pointCi=new TowerPoint(3*maxDiscWidth,100+vertialDistance); vertialDistance=vertialDistance+discHeight; for(int i=0;i<poi
45、ntA.length;i+) pointAi.putDisc(disci,this); handleMouse.setPointA(pointA); handleMouse.setPointB(pointB); handleMouse.setPointC(pointC); autoMoveDisc=new AutoMoveDisc(this); autoMoveDisc.setTowerName(towerName); autoMoveDisc.setAmountOfDisc(amountOfDisc); autoMoveDisc.setPointA(pointA); autoMoveDisc
46、.setPointB(pointB); autoMoveDisc.setPointC(pointC); validate(); repaint(); public void removeDisk() if(pointA!=null) for(int i=0;i<pointA.length;i+) pointAi.removeDisc(pointAi.getDiscOnPoint(),this); pointBi.removeDisc(pointBi.getDiscOnPoint(),this); pointCi.removeDisc(pointCi.getDiscOnPoint(),th
47、is); public void paintComponent(Graphics g) super.paintComponent(g); int x1,y1,x2,y2; x1=pointA0.getX(); y1=pointA0.getY()-discHeight/2; x2=pointAamountOfDisc-1.getX(); y2=pointAamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); x1=pointB0.getX(); y1=pointB0.getY()-discHeight/2; x2=pointBamountOfDisc-1.getX(); y2=pointBamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); x1=pointC0.getX(); y1=pointC0.getY()-discHeight/2; x2=pointCamountOfDisc-1.getX(); y2=pointCamountOfDisc-1.getY()+discHeight/2; g.drawLine(x1,y1,x2,y2); g.setColor(Color.blue); x1=pointAamountOfDisc-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 俯臥位學(xué)習(xí)法在職業(yè)教育中的實(shí)踐與思考
- 探索學(xué)習(xí)者的情感與動(dòng)機(jī)在課堂中的運(yùn)用
- 廣西制造工程職業(yè)技術(shù)學(xué)院《設(shè)計(jì)初步》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年度河南省護(hù)師類之社區(qū)護(hù)理主管護(hù)師能力檢測(cè)試卷B卷附答案
- 教育技術(shù)推廣中的跨領(lǐng)域合作模式
- 技術(shù)革新對(duì)醫(yī)療領(lǐng)域教育培訓(xùn)的促進(jìn)
- 重慶理工大學(xué)《土木工程地質(zhì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國勞動(dòng)關(guān)系學(xué)院《音樂美學(xué)與評(píng)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 信陽航空職業(yè)學(xué)院《生理衛(wèi)生與兒童健康》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟(jì)源職業(yè)技術(shù)學(xué)院《合唱Ⅳ》2023-2024學(xué)年第二學(xué)期期末試卷
- 杭州市西湖區(qū)部分校教科版六年級(jí)下冊(cè)期末考試科學(xué)試卷(原卷版)
- 雙液注漿施工方案
- 民兵訓(xùn)練管理規(guī)定
- 2025年國家公務(wù)員考試行測(cè)常識(shí)題庫及答案(共300題)
- 2024冀少版七年級(jí)下冊(cè)生物期末復(fù)習(xí)知識(shí)點(diǎn)提綱(詳細(xì)版)
- 2025年《義務(wù)教育小學(xué)體育課程標(biāo)準(zhǔn)測(cè)試卷2022版》測(cè)試題庫及答案
- 全國衛(wèi)生健康系統(tǒng)職業(yè)技能競賽(傳染病防治監(jiān)督)參考試題(附答案)
- 人工智能算法與市場營銷的融合研究
- DBJ50-T-157-2022房屋建筑和市政基礎(chǔ)設(shè)施工程施工現(xiàn)場從業(yè)人員配備標(biāo)準(zhǔn)
- 國家開放大學(xué)專本科《經(jīng)濟(jì)法學(xué)》期末紙質(zhì)考試總題庫2025春期版
- 顯示屏幕抗反光技術(shù)研究-洞察分析
評(píng)論
0/150
提交評(píng)論