漢諾塔模擬程序-課程設(shè)計(jì)報(bào)告_第1頁(yè)
漢諾塔模擬程序-課程設(shè)計(jì)報(bào)告_第2頁(yè)
漢諾塔模擬程序-課程設(shè)計(jì)報(bào)告_第3頁(yè)
漢諾塔模擬程序-課程設(shè)計(jì)報(bào)告_第4頁(yè)
漢諾塔模擬程序-課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

合肥學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系課程設(shè)計(jì)任務(wù)書(shū)20112012學(xué)年第一學(xué)期課程JAVA語(yǔ)言課程設(shè)計(jì)課程設(shè)計(jì)名稱漢諾塔模擬程序?qū)I(yè)班級(jí)08網(wǎng)絡(luò)工程(1)班學(xué)號(hào)姓名Xx指導(dǎo)教師金瑩 郭昌建 2011年9月目 錄目 錄2摘要:3關(guān)鍵詞:31、需求分析31.1 課程設(shè)計(jì)目的31.2 課程設(shè)計(jì)名稱及內(nèi)容31.3 任務(wù)和要求31.4 設(shè)計(jì)方案提示41.5 相關(guān)背景41.5.1 來(lái)源41.5.2 傳說(shuō)42、設(shè)計(jì)部分52.1 設(shè)計(jì)思想52.1.1 漢諾塔的演示52.1.2 算法分析52.1.3 程序流程圖62.1.4 算法分析圖解72.2 功能內(nèi)容設(shè)計(jì)82.2.1 程序?qū)崿F(xiàn)總體功能82.2.2 具體功能設(shè)計(jì)92.3 詳細(xì)設(shè)計(jì)103、調(diào)試及測(cè)試143.1 調(diào)試過(guò)程中遇到的主要問(wèn)題集解決方法143.2 對(duì)設(shè)計(jì)和編碼的回顧討論和分析144、經(jīng)驗(yàn)和體會(huì)155、附錄:16主要源程序16摘要:本文對(duì)經(jīng)典的“ 漢諾塔”問(wèn)題進(jìn)行了詳細(xì)的分析,給出了實(shí)現(xiàn)的算法,并用JAVA實(shí)現(xiàn)。通過(guò)該問(wèn)題的JAVA實(shí)現(xiàn),可使清晰地觀測(cè)到解決問(wèn)題的全過(guò)程。關(guān)鍵詞:漢諾塔;算法;遞歸;JAVA1、需求分析1.1 課程設(shè)計(jì)目的通過(guò)課程設(shè)計(jì),學(xué)生在下述各方面的能力應(yīng)該得到鍛煉:(1)進(jìn)一步鞏固、加深學(xué)生所學(xué)專業(yè)課程JAVA語(yǔ)言教程的基本理論知識(shí),理論聯(lián)系實(shí)際,進(jìn)一步培養(yǎng)學(xué)生綜合分析問(wèn)題,解決問(wèn)題的能力。(2)全面考核學(xué)生所掌握的基本理論知識(shí)及其實(shí)際業(yè)務(wù)能力,從而達(dá)到提高學(xué)生素質(zhì)的最終目的。(3)利用所學(xué)知識(shí),開(kāi)發(fā)小型應(yīng)用系統(tǒng),掌握運(yùn)用JAVA語(yǔ)言編寫(xiě)調(diào)試應(yīng)用系統(tǒng)程序,訓(xùn)練獨(dú)立開(kāi)發(fā)應(yīng)用系統(tǒng),進(jìn)行數(shù)據(jù)處理的綜合能力。(4)對(duì)于給定的設(shè)計(jì)題目,如何進(jìn)行分析,理清思路,并給出相應(yīng)的數(shù)學(xué)模型。 (5)熟練掌握J(rèn)AVA語(yǔ)言的GUI設(shè)計(jì)、線程技術(shù),靈活運(yùn)用各種類(lèi)庫(kù)。1.2 課程設(shè)計(jì)名稱及內(nèi)容課程設(shè)計(jì)名稱:漢諾塔模擬程序課程設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個(gè)模擬程序,圖形化地展現(xiàn)漢諾塔的求解過(guò)程1.3 任務(wù)和要求1 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)課程中關(guān)于漢諾塔的知識(shí)和算法。2 設(shè)計(jì)圖形界面,畫(huà)出3個(gè)柱子和若干個(gè)大小不一的圓盤(pán),圓盤(pán)數(shù)量可人工設(shè)定。3 當(dāng)點(diǎn)擊“開(kāi)始”按鈕后,系統(tǒng)自動(dòng)展現(xiàn)圓盤(pán)的移動(dòng)過(guò)程,一秒移動(dòng)一次。1.4 設(shè)計(jì)方案提示利用線程控制每次移動(dòng)的時(shí)間間隔1.5 相關(guān)背景1.5.1 來(lái)源漢諾塔是源自印度神話里的玩具。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)。1.5.2 傳說(shuō)在印度,有這么一個(gè)古老的傳說(shuō):在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創(chuàng)造世界的時(shí)候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片,不管在哪根針上,小片必須在大片上面。僧侶們預(yù)言,當(dāng)所有的金片都從梵天穿好的那根針上移到另外一根針上時(shí),世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸于盡。 不管這個(gè)傳說(shuō)的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,并且始終保持上小下大的順序。這需要多少次移動(dòng)呢?這里需要遞歸的方法。假設(shè)有n片,移動(dòng)次數(shù)是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不難證明f(n)=2n-1。n=64時(shí), f(64)= 264-1= 假如每秒鐘一次,共需多長(zhǎng)時(shí)間呢?一個(gè)平年365天有 秒,閏年366天有秒,平均每年秒,計(jì)算一下, /=3.855年,這表明移完這些金片需要5845億年以上,而地球存在至今不過(guò)45億年,太陽(yáng)系的預(yù)期壽命據(jù)說(shuō)也就是數(shù)百億年。真的過(guò)了5845億年,不說(shuō)太陽(yáng)系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經(jīng)灰飛煙滅。2、設(shè)計(jì)部分2.1 設(shè)計(jì)思想本程序的主要思想是圖形與多線程處理,熟悉圖形、圖像的使用方法,理解計(jì)算機(jī)動(dòng)畫(huà)的原理和java的多線程處理機(jī)制,以及Java語(yǔ)言的GUI設(shè)計(jì)。2.1.1 漢諾塔的演示1、柱子和盤(pán)子可以用圖形界面里的直線和矩形模擬。2、矩形(即盤(pán)子)的大小可以通過(guò)循環(huán)控制,這樣可以讓盤(pán)子看上去有層次感。3、盤(pán)子移動(dòng)后構(gòu)造一個(gè)重繪方法來(lái)擦去舊的盤(pán)子4、盤(pán)子的移動(dòng)時(shí)間通過(guò)線程來(lái)控制2.1.2 算法分析如果n=1,則將圓盤(pán)從A直接移動(dòng)到C。如果n=2,則:(1)將A上的n-1(等于1)個(gè)圓盤(pán)移到B上;(2)再將A上的一個(gè)圓盤(pán)移到C上;(3)最后將B上的n-1(等于1)個(gè)圓盤(pán)移到C上。 如果n=3,則:A)將A上的n-1(等于2,令其為n)個(gè)圓盤(pán)移到B(借助于C),步驟如下:(1)將A上的n-1(等于1)個(gè)圓盤(pán)移到C上。(2)將A上的一個(gè)圓盤(pán)移到B。(3)將C上的n-1(等于1)個(gè)圓盤(pán)移到B。B)將A上的一個(gè)圓盤(pán)移到C。C)將B上的n-1(等于2,令其為n)個(gè)圓盤(pán)移到C(借助A),步驟如下:(1)將B上的n-1(等于1)個(gè)圓盤(pán)移到A。(2)將B上的一個(gè)盤(pán)子移到C。(3)將A上的n-1(等于1)個(gè)圓盤(pán)移到C。到此,完成了三個(gè)圓盤(pán)的移動(dòng)過(guò)程。 從上面分析可以看出,當(dāng)n大于等于2時(shí), 移動(dòng)的過(guò)程可分解為三個(gè)步驟:第一步 把A上的n-1個(gè)圓盤(pán)移到B上;第二步 把A上的一個(gè)圓盤(pán)移到C上;第三步 把B上的n-1個(gè)圓盤(pán)移到C上;其中第一步和第三步是類(lèi)同的。 當(dāng)n=3時(shí),第一步和第三步又分解為類(lèi)同的三步,即把n-1個(gè)圓盤(pán)從一個(gè)針移到另一個(gè)針上,這里的n=n-1。2.1.3 程序流程圖圖1-12.1.4 算法分析圖解2.2 功能內(nèi)容設(shè)計(jì)2.2.1 程序?qū)崿F(xiàn)總體功能(1) 設(shè)計(jì)Hannoi塔中有三個(gè)座,名字分別是1、2和3。初始狀態(tài)是1座上有n個(gè)大小不等的盤(pán)子,這些盤(pán)子從座底到座頂按著大小順序依次擺放在1座上。(2)程序要求在移動(dòng)盤(pán)子過(guò)程中,不允許把大盤(pán)放置在小盤(pán)的上面,用戶最終要完成的是把1座上的全部盤(pán)子移動(dòng)到3座上;(3)可以通過(guò)Hannoi塔界面提供的菜單來(lái)任意輸入盤(pán)子數(shù)目(程序初始化時(shí)可選擇1-8個(gè));(4)可以通過(guò)單擊Hannoi塔界面上提供的開(kāi)始按鈕按鈕,讓程序自動(dòng)完成把1座上的盤(pán)子全部移動(dòng)到3座上;(5)在移動(dòng)盤(pán)子的過(guò)程中,可以隨時(shí)單擊Hannoi塔界面上提供的按鈕,結(jié)束當(dāng)時(shí)程序;(6)有計(jì)時(shí)功能,每一步一秒鐘,界面右邊有步驟移動(dòng)顯示。(7)程序可以設(shè)置最大和最小盤(pán)子的大小;(8)更改程序可以設(shè)置盤(pán)子的顏色;(9)每移動(dòng)盤(pán)子的時(shí)候相鄰盤(pán)子的顏色不同;2.2.2 具體功能設(shè)計(jì)1、 設(shè)計(jì)漢諾塔層數(shù)選擇界面將布局管理器設(shè)置為空。然后添加開(kāi)始和退出按鈕以及漢諾塔層數(shù)選擇下拉選擇列表。層數(shù)選擇界面如下圖2-1所示:圖2-2 層數(shù)選擇界面2、 漢諾塔移動(dòng)演示界面也是通過(guò)布局管理器根據(jù)所選擇的盤(pán)子層數(shù)畫(huà)出相應(yīng)的盤(pán)子,setlocation()來(lái)根據(jù)需求來(lái)定位漢諾塔演示界面如下圖:圖2-3 漢諾塔演示界面圖2-4 運(yùn)行中演示界面2.3 詳細(xì)設(shè)計(jì)1、 層數(shù)選擇界面及布局的部分代碼contentPane = (JPanel) getContentPane(); contentPane.setLayout(null); this.setResizable(false); setSize(new Dimension(300, 150); setTitle(Hanoi); /選擇框 jComboBox1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jComboBox1.setBorder(BorderFactory.createEtchedBorder(); jComboBox1.setBounds(new Rectangle(157, 38, 70, 26); jComboBox1.addItem(1層); jComboBox1.addItem(2層); jComboBox1.addItem(3層); jComboBox1.addItem(4層); jComboBox1.addItem(5層); jComboBox1.addItem(6層); jComboBox1.addItem(7層); jComboBox1.addItem(8層); /開(kāi)始按鈕 jButton1.setBounds(new Rectangle(66, 81, 71, 27); jButton1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jButton1.setText(開(kāi)始); /開(kāi)始myDrawingFrame jButton1.addActionListener(new DefaultFrame_jButton1_actionAdapter(this); /退出按鈕 jButton2.setBounds(new Rectangle(156, 81, 71, 27); jButton2.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jButton2.setText(退出); /退出事件 jButton2.addActionListener(new DefaultFrame_jButton2_actionAdapter(this); /Hanoi 層數(shù):文字顯示 jLabel1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jLabel1.setToolTipText(); jLabel1.setText(Hanoi 層數(shù):); jLabel1.setBounds(new Rectangle(68, 39, 79, 25); /將上述按鈕添加到主界面 contentPane.add(jButton2); contentPane.add(jButton1); contentPane.add(jComboBox1); contentPane.add(jLabel1);2.漢諾塔程序演示界面部分代碼: Init(); setSize(new Dimension(400, 300); this.setTitle(Hanoi); getContentPane().setLayout(null); /開(kāi)始按鈕 jButton1.setBounds(new Rectangle(169, 220, 60, 27); jButton1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jButton1.setText(開(kāi)始); /開(kāi)始事件 jButton1.addActionListener(new DrawingFrame_jButton1_actionAdapter(this); this.getContentPane().add(myDrawPanel, null); this.getContentPane().add(jButton1); this.setResizable(false); myDrawPanel.setBounds(new Rectangle(0, 0, 400, 200); myDrawPanel.setLayout(null); /主界面定位 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); if (frameSize.height screenSize.height) frameSize.height = screenSize.height; if (frameSize.width screenSize.width) frameSize.width = screenSize.width; this.setLocation(screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); /初始化窗口的屏幕居中 this.setVisible(true);/通過(guò)傳入的布爾值顯示3.顏色漸變程序段:for (int i=1;i=refHanoi_pan.length;i+) if(color) /refHanoi_pani.z g.setColor(Color.green); color = false; else g.setColor(Color.blue); color = true; if(refHanoi_pan0.z = i) g.setColor(Color.red); g.fillRect(refHanoi_pani-1.x,refHanoi_pani-1.y,refHanoi_pani-1.width,refHanoi_pani-1.height); 3、調(diào)試及測(cè)試3.1 調(diào)試過(guò)程中遇到的主要問(wèn)題集解決方法在界面設(shè)置上,為了輪廓清晰,所以我們將開(kāi)始界面與運(yùn)行界面分開(kāi)了。并且,為了能夠很清楚的看到盤(pán)子移動(dòng)時(shí)的效果,而且為了美觀,每次盤(pán)子移動(dòng)的時(shí)候都會(huì)在紅、綠、藍(lán)三色中任選一色。并且相鄰兩個(gè)盤(pán)顏色不同。在程序運(yùn)行的過(guò)程中我在畫(huà)矩形的時(shí)候沒(méi)有考慮到被移走后,如何把原來(lái)的矩形擦掉,后來(lái)考慮到構(gòu)造一個(gè)重繪和容器布局的背景色相同的盤(pán)子的方法。這樣就能覆蓋掉原來(lái)的盤(pán)子。在線程的控制上一開(kāi)始也出了點(diǎn)小問(wèn)題,最后通過(guò)不斷地調(diào)試和改善,最后實(shí)現(xiàn)了預(yù)期要實(shí)現(xiàn)的功能。3.2 對(duì)設(shè)計(jì)和編碼的回顧討論和分析本程序的主要思想是圖形與多線程處理,熟悉圖形、圖像的使用方法,理解計(jì)算機(jī)動(dòng)畫(huà)的原理和Java的多線程處理機(jī)制,能夠編寫(xiě)在Application中使用動(dòng)畫(huà)。4、經(jīng)驗(yàn)和體會(huì)萬(wàn)事開(kāi)頭難,一個(gè)課程設(shè)計(jì)下來(lái),真的有所體會(huì)了,一開(kāi)始我對(duì)JAVA課程設(shè)計(jì)非常害怕,因?yàn)楦杏X(jué)自己平時(shí)上課時(shí)只掌握了java的基礎(chǔ)知識(shí),也沒(méi)有多么深入研究,而且,平時(shí)的上級(jí)實(shí)驗(yàn)也都是比較簡(jiǎn)單的。當(dāng)我拿到這個(gè)題目后,我迷茫了好長(zhǎng)時(shí)間,因?yàn)榫€程方面學(xué)得不理想。雖然對(duì)漢諾塔的背景傳說(shuō)比較了解,對(duì)其如何運(yùn)行也比較清楚,其算法我們?cè)诖蠖臄?shù)據(jù)結(jié)構(gòu)中也有介紹,但是,都不是很熟練掌握,所以,在拿到題目的第一件事就是了解其算法。通過(guò)上網(wǎng)查了一些資料,還有到類(lèi)庫(kù)中查詢函數(shù)。漸漸有了眉目,自己也有了信心,正是抱著這份自信我堅(jiān)持了整整兩周時(shí)間的不斷調(diào)試。現(xiàn)在程序已經(jīng)完成,雖然感覺(jué)里面的功能還不是很完備,但是總體還是能體現(xiàn)JAVA多線程并符合題目要求。在這次課程設(shè)計(jì)中,我學(xué)到了很多東西,多線程在java中的重要性是顯而易見(jiàn)的,也是很有實(shí)用價(jià)值的。Java的一大特點(diǎn)就是內(nèi)置多線程的支持。多線程是指同時(shí)存在幾個(gè)執(zhí)行體,按幾條不同的執(zhí)行線索共同工作的情況。2周的Java課程設(shè)計(jì)已經(jīng)結(jié)束了,從中學(xué)到了很多以前沒(méi)有的知識(shí),增強(qiáng)了動(dòng)手能力。以前總是眼高手低,覺(jué)得編程只要理解了思路,多看看就可以了。但是在課程設(shè)計(jì)過(guò)程中發(fā)現(xiàn)即使是很小的一段程序也會(huì)有很大的問(wèn)題,有時(shí)候僅僅是因?yàn)橐粋€(gè)括號(hào)的問(wèn)題而導(dǎo)致了程序的調(diào)試不通過(guò)。平時(shí)多動(dòng)手,才會(huì)熟能生巧。俗話說(shuō)的好,書(shū)到用時(shí)方恨少,只有平時(shí)的積累才能熟練的完成課程設(shè)計(jì)。感謝課程設(shè)計(jì)過(guò)程中指導(dǎo)老師的熱心幫助和嚴(yán)格要求,以及同學(xué)們的幫忙,正是由于大家的幫助才使我能夠完成本次課程設(shè)計(jì)。5、附錄:主要源程序DefaultFrame.txtimport java.awt.Dimension;import java.awt.Font;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class DefaultFrame extends JFrame JPanel contentPane;/整體布局 JComboBox jComboBox1 = new JComboBox();/下拉菜單 JButton jButton1 = new JButton();/開(kāi)始按鈕 JButton jButton2 = new JButton();/退出按鈕 JLabel jLabel1 = new JLabel();/層數(shù)標(biāo)簽 /* * 構(gòu)造函數(shù)初始化 */ /拋出異常 public DefaultFrame() try /設(shè)置主界面退出X按鈕 setDefaultCloseOperation(EXIT_ON_CLOSE); /初始化 jbInit(); catch (Exception exception) exception.printStackTrace(); /* * Component initialization. * 初始化界面 * throws java.lang.Exception */ private void jbInit() throws Exception /布局 contentPane = (JPanel) getContentPane(); contentPane.setLayout(null); this.setResizable(false); setSize(new Dimension(300, 150);/定義整體布局的框體大小 setTitle(Hanoi); /選擇框 jComboBox1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 15);/字體大小 jComboBox1.setBorder(BorderFactory.createEtchedBorder();/矩形框布局 jComboBox1.setBounds(new Rectangle(157, 38, 70, 26); jComboBox1.addItem(1層); jComboBox1.addItem(2層); jComboBox1.addItem(3層); jComboBox1.addItem(4層); jComboBox1.addItem(5層); jComboBox1.addItem(6層); jComboBox1.addItem(7層); jComboBox1.addItem(8層); /開(kāi)始按鈕 jButton1.setBounds(new Rectangle(66, 81, 71, 27); jButton1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jButton1.setText(開(kāi)始); /開(kāi)始myDrawingFrame jButton1.addActionListener(new DefaultFrame_jButton1_actionAdapter(this); /退出按鈕 jButton2.setBounds(new Rectangle(156, 81, 71, 27); jButton2.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jButton2.setText(退出); /退出事件 jButton2.addActionListener(new DefaultFrame_jButton2_actionAdapter(this); /Hanoi 層數(shù):文字顯示 jLabel1.setFont(new java.awt.Font(Dialog, Font.PLAIN, 12); jLabel1.setToolTipText(); jLabel1.setText(Hanoi 層數(shù):); jLabel1.setBounds(new Rectangle(68, 39, 79, 25); /將上述按鈕添加到主界面 contentPane.add(jButton2); contentPane.add(jButton1); contentPane.add(jComboBox1); contentPane.add(jLabel1); /button2退出事件 public void jButton2_actionPerformed(ActionEvent e) System.exit(0); /button1 new myDrawingFrame對(duì)象 public void jButton1_actionPerformed(ActionEvent e) DrawingFrame myDrawingFrame = new DrawingFrame(this,this.jComboBox1.getSelectedIndex()+1); myDrawingFrame.show(); this.setVisible(false); class DefaultFrame_jButton1_actionAdapter implements ActionListener private DefaultFrame adaptee; DefaultFrame_jButton1_actionAdapter(DefaultFrame adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jButton1_actionPerformed(e); class DefaultFrame_jButton2_actionAdapter implements ActionListener private DefaultFrame adaptee; DefaultFrame_jButton2_actionAdapter(DefaultFrame adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jButton2_actionPerformed(e); DrawingFrame.txtpackage hanoi;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.TextArea;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;/* * Title: Hanoi Pan * * Description: * * Copyright: Copyright (c) 2005 * * Company: * * author not attributable * version 1.0 */class Hanoi_pan public int x,y,z; public final int width,height; public Hanoi_pan(int arg_x,int arg_y,int z,int arg_width,int arg_height) x=arg_x; y=arg_y; width=arg_width; height=arg_height; class DrawPanel extends JPanel private Hanoi_pan refHanoi_pan; public DrawPanel(Hanoi_pan myHanoi_pan) refHanoi_pan=myHanoi_pan; /* * 生成塊狀漢諾塔 */ public void paintComponent(Graphics g) boolean color = false; super.paintComponent(g); g.setColor(Color.black); g.drawLine(35,150,125,150); g.drawLine(155,150,245,150); g.drawLine(275,150,365,150); g.drawLine(80,50,80,150); g.drawLine(200,50,200,150); g.drawLine(320,50,320,150); g.drawString(1, 80, 170); g.drawString(2, 200, 170); g.drawString(3, 320, 170); for (int i=1;i + z + n); SetLocation(x,n,z); try repaint(); Thread.sleep(1000); catch (InterruptedException e) if (Thread.currentThread().isAlive() JOptionPane.showMessageDialog(null,唉,太慢了,關(guān)掉吧!); myDefaultFrame.setVisible(true); this.dispose(); /System.out.println(move pan + n + from + x + to + z); /* * 定位漢諾塔 * param x * param n * param z */ private void SetLocation(int x,int n,int z) myHanoi_pan0.z = n ; switch (x) case 1: bench0-; break; case 2: bench1-; break; case 3: bench2-; break; switch (z) case 1: myHanoi_pann-1.x=80-myHanoi_pann-1.width/2; myHanoi_pann-1.y=140-bench0*10; bench0+; break; case 2: myHanoi_pann-1.x=200-myHanoi_pann-1.width/2; myHanoi_pann-1.y=140-bench1*10; bench1+; break; case 3: myHanoi_pann-1.x=320-myHanoi_pann-1.width/2; myHanoi_pann-1.y=140-bench2*10; bench2+; break; /* * 根據(jù)level初始化漢諾塔 */ private void Init() for (int i=1;i screenSize.height) frameSize.height = screenSize.height; if (frameSize.width screenSize.width) frameSize.width = screenSize.width; this.setLocation(screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); /初始化窗口的屏幕居中 this.setVisible(true);/通過(guò)傳入的布爾值顯示 public void jButton1_actionPerformed(ActionEvent e) if (PaintThread=null) PaintThread=new Thre

溫馨提示

  • 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論