版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> JAVA程序設(shè)計(jì) 課程設(shè)計(jì)報(bào)告</p><p> 課 題: 騎士游歷程序的開(kāi)發(fā) </p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 同組姓名:
2、 </p><p> 專業(yè)班級(jí): </p><p> 指導(dǎo)教師: </p><p> 設(shè)計(jì)時(shí)間: 2013.06.10 </p><p><b> 目 錄</b></p><p> 一
3、 系統(tǒng)描述2</p><p> 二 設(shè)計(jì)目的與意義2</p><p> 三 分析與設(shè)計(jì)3</p><p> 3.1 創(chuàng)建騎士游歷程序3</p><p> 3.2 功能模塊劃分3</p><p> 3.3 系統(tǒng)詳細(xì)設(shè)計(jì)文檔5</p><p>
4、3.3.1 類的劃分及相互關(guān)系5</p><p> 3.3.2 系統(tǒng)或模塊的流程圖5</p><p> 3.4 各個(gè)模塊的實(shí)現(xiàn)方法描述6</p><p> 3.4.1 AccessibleSquare算法實(shí)現(xiàn)6</p><p> 3.4.2 圖形化界面9</p><p> 3.4.3
5、主調(diào)用程序的設(shè)計(jì)和開(kāi)發(fā)10</p><p> 3.5 測(cè)試數(shù)據(jù)及期望結(jié)果11</p><p> 四 系統(tǒng)測(cè)試11</p><p> 五 總結(jié)或心得體會(huì)15</p><p> 六 參考文獻(xiàn)16</p><p><b> 七 附錄16</b></p>&
6、lt;p><b> 一 系統(tǒng)描述</b></p><p> 騎士游歷問(wèn)題是一個(gè)古老而著名的問(wèn)題,它最初是由大數(shù)學(xué)家Euler提出的.</p><p> 問(wèn)題是這樣的:國(guó)際象棋中的棋子(叫作騎士)在一個(gè)空棋盤內(nèi)移動(dòng),問(wèn)它能否經(jīng)過(guò)64格中的每一格且只經(jīng)過(guò)一次?(騎士按L行移動(dòng),即在某方向前進(jìn)兩格接著在與原方向垂直的方向上前進(jìn)一格) </p>
7、<p> 即:有一個(gè)n*m的棋盤(2≤n≤50,2≤m≤50),在棋盤(x1,y1)點(diǎn)即第x1行第y1列有一個(gè)中國(guó)象棋馬,馬走的規(guī)則為:</p><p><b> ?。?)馬走日字;</b></p><p><b> ?。?)馬只能向右走</b></p><p> 任務(wù):求出從起始點(diǎn)到棋盤最右邊的所有路徑。&
8、lt;/p><p> 本程序?qū)崿F(xiàn)了騎士游歷問(wèn)題的求解,并能夠演示起始位置在棋盤上任何位置的游歷問(wèn)題的實(shí)現(xiàn).程序采用動(dòng)態(tài)的圖形演示,使算法的描述更形象,更生動(dòng),使教學(xué)能產(chǎn)生良好的效果。</p><p> 本程序采用Applet來(lái)編制整個(gè)程序,這樣既可以使大家對(duì)算法的實(shí)現(xiàn)有了一定的了解,也可以熟悉一下Java圖形界面, Applet以及Java語(yǔ)言的命名規(guī)范,讓大家熟悉Java的基本語(yǔ)言結(jié)構(gòu)和
9、強(qiáng)大的開(kāi)發(fā)能力。</p><p> 在騎士游歷的課程設(shè)計(jì)中,嚴(yán)格按照面向?qū)ο蟮乃枷脒M(jìn)行開(kāi)發(fā),其中有AccessibleSquare 類,MyPanel類和KnightsTour類.我們應(yīng)注意各個(gè)類之間的關(guān)系,以便更深入地理解Java中類的思想。</p><p> 二 設(shè)計(jì)目的與意義</p><p> Java課程設(shè)計(jì)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生必做的
10、集中實(shí)踐性環(huán)節(jié)之一,是學(xué)習(xí)完《Java程序設(shè)計(jì)》課程后進(jìn)行的一次全面的綜合練習(xí)。其目的在于通過(guò)課程設(shè)計(jì),使學(xué)生能夠得到較系統(tǒng)的技能訓(xùn)練,從而鞏固和加深對(duì)Java 編程的基礎(chǔ)理論知識(shí)的理解,培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)理論解決實(shí)際問(wèn)題的能力,使學(xué)生成為具有扎實(shí)的計(jì)算機(jī)理論基礎(chǔ)和較強(qiáng)的獨(dú)立動(dòng)手能力的復(fù)合型、應(yīng)用型人才。</p><p><b> 三 分析與設(shè)計(jì)</b></p><
11、;p> 解決本程序的問(wèn)題的關(guān)鍵在于如何讓騎士按日字行走,如何計(jì)算騎士從開(kāi)始位置到結(jié)束位置所走的步數(shù)以及如何保證所得的步數(shù)為騎士從開(kāi)始位置到結(jié)束位置所需要的最小的步數(shù),并且可以輸入多組數(shù)據(jù)測(cè)試多組最小的步數(shù)。</p><p> 騎士行走路徑為“L”型,即下圖所示:</p><p> 圖3.1 馬走的規(guī)則</p><p> 當(dāng)n,m 給出之后,同時(shí)給出馬起
12、始的位置和終點(diǎn)的位置,試找出從起點(diǎn)到終點(diǎn)的所有路徑的數(shù)目。例如:(n=10,m=10),(1,5)(起點(diǎn)),(3,5)(終點(diǎn))。應(yīng)輸出2(即由(1,5)到(3,5)共有2條路徑,如下圖):</p><p> 圖3.2 馬走的所有路徑</p><p> 如此,騎士每走一步都按照此方式步進(jìn),直至整個(gè)棋盤都被“游走”一遍則完成。</p><p> 3.1 創(chuàng)建騎
13、士游歷程序</p><p> 在對(duì)eclipse的基本常識(shí)有了初步的了解后,就可以起步創(chuàng)建騎士游歷程序了。</p><p><b> 創(chuàng)建過(guò)程如下:</b></p><p> ?。?)單擊桌面圖標(biāo),啟動(dòng)eclipse開(kāi)發(fā)平臺(tái)進(jìn)入一個(gè)新的工程界面。</p><p> ?。?)命名新的工程并保存文件,方法是單擊菜單Fil
14、eNew Project,出現(xiàn)一個(gè)對(duì)話框窗口,將工程名為Knighttour,選擇保存工程文件目錄之后,單擊Finish按鈕完成騎士游歷工程的創(chuàng)建。</p><p> 3.2 功能模塊劃分</p><p> 整個(gè)程序界面由三部分組成,上方有兩個(gè)工具欄,一個(gè)是,一個(gè)是小程序應(yīng)用,其中可以執(zhí)行還原(R)、移動(dòng)(M)、大小(S)、最大化(N)、最小化(X)、關(guān)閉(C)的操作,小程序應(yīng)用則
15、可執(zhí)行重新啟動(dòng)、重新加載、停止、保存、啟動(dòng)、克隆、標(biāo)記、信息、編輯、字符編碼、打印、屬性、關(guān)閉、退出的相應(yīng)操作。中間是騎士游歷的效果顯示圖,動(dòng)態(tài)演示騎士游歷的過(guò)程;最下邊一排是NextTour和NextMoving兩個(gè)按鈕,單擊NextTour按鈕可以重新開(kāi)始一個(gè)新的游歷,單擊NextMoving按鈕,則顯示騎士要走的下一步。如圖 2.1.1所示(這是騎士在第一個(gè)格子起始位置進(jìn)行游歷的情況,如果想在其他的位置開(kāi)始游歷,直接單擊NextT
16、our按鈕就可以了,程序?qū)崿F(xiàn)的騎士的起始位置的方式是按照從第一列第一個(gè)開(kāi)始、直到最后一列、最后一行)。</p><p> 另外,可以由邊框的顏色的不同,判斷騎士的初始位置、上一步所走的位置和現(xiàn)在所處的位置。單擊NextMoving按鈕可以顯示騎士游歷的下一個(gè)位置。連續(xù)單擊直到64個(gè)格子全部都走完,可以清晰的顯示整個(gè)游歷的過(guò)程。圖3.2.1和3.2.2顯示的是騎士游歷起始位置在第一個(gè)格子和游歷到中間位置的一個(gè)中間
17、狀態(tài)。當(dāng)然,騎士可以在棋盤的任何位置開(kāi)始。</p><p> 圖3.2.1 騎士在第一個(gè)格子的情況</p><p> 圖3.2.2 騎士在第一個(gè)格子的游歷的中間狀態(tài)</p><p><b> 系統(tǒng)詳細(xì)設(shè)計(jì)文檔</b></p><p> 3.3.1 類的劃分及相互關(guān)系</p><p>
18、本程序由三個(gè)類組成一個(gè)工程文件。其中KinghtsTour 是主類,或者說(shuō)是控制類,AccessibleSquare類主要是算法的實(shí)現(xiàn),MyPanel類實(shí)現(xiàn)圖形化顯示結(jié)果。程序的運(yùn)行關(guān)系圖如圖3.3.1所示。</p><p><b> 系統(tǒng)或模塊的流程圖</b></p><p><b> 系統(tǒng)流程圖:</b></p><p
19、> 圖3.3.2 系統(tǒng)流程圖</p><p> 各個(gè)模塊的實(shí)現(xiàn)方法描述</p><p> 此程序主要分為三個(gè)部分:第一部分主要講解算法編程目的,讓大家熟悉Java的計(jì)算功能;第二部分是圖形化界面,主要講解Appelt的圖形化的界面以及如何利用圖形用戶界面的控件接受用戶信息,并用圖形或圖像顯示結(jié)果;第三部分是控制類通過(guò)響應(yīng)Button時(shí)間完成對(duì)算法類畫(huà)圖類的調(diào)用。</p&
20、gt;<p> AccessibleSquare算法實(shí)現(xiàn)</p><p> AccessibleSquare類主要是算法實(shí)現(xiàn),采用啟發(fā)式算法.</p><p> ?。?)先把8個(gè)可能走的方向用兩個(gè)數(shù)組(horizontal[ ]和vertical[ ])表示出來(lái),選擇走哪個(gè)方向就在原坐標(biāo)上進(jìn)行相應(yīng)的加法,表示騎士到了一個(gè)新的位置. horizontal[ ]和vertic
21、al[ ]表示騎士8個(gè)方向走L形狀所需的X坐標(biāo)和Y坐標(biāo)的變化量: horizontal[] = {2,1,-1,-2,-2,-1,1,2}, vertical [] = {-1,-2,-2,-1,1,2,2,1}. 坐標(biāo)圖如下:</p><p> 圖3.4.1 騎士游歷走向坐標(biāo)圖</p><p> ?。?)由于程序采用啟發(fā)式算法,應(yīng)考察每一方格的可到達(dá)性.使用數(shù)組accessi
22、bility []表示可達(dá)到數(shù),并當(dāng)騎士游歷時(shí),程序動(dòng)態(tài)修正剩余格子的可達(dá)到數(shù). accessibility [ arrayPos ] = 0 表明格子已經(jīng)被占據(jù).</p><p> ?。?)使用冒泡法來(lái)查詢最小數(shù). 冒泡排序的基本概念是:依次比較相鄰的兩個(gè)數(shù),將大數(shù)放在前面,小數(shù)放在后面。即首先比較第1個(gè)和第2個(gè)數(shù),將大數(shù)放前,小數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將大數(shù)放前,小數(shù)放后,如此繼續(xù),直至比較最后兩
23、個(gè)數(shù),將大數(shù)放前,小數(shù)放后,此時(shí)第一趟結(jié)束,在最后的數(shù)必是所有數(shù)中的最小數(shù)。重復(fù)以上過(guò)程,仍從第一對(duì)數(shù)開(kāi)始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再大于第2個(gè)數(shù)),將大數(shù)放前,小數(shù)放后,一直比較到最小數(shù)前的一對(duì)相鄰數(shù),將大數(shù)放前,小數(shù)放后,第二趟結(jié)束,在倒數(shù)第二個(gè)數(shù)中得到一個(gè)新的最小數(shù)。如此下去,直至最終完成排序。由于在排序過(guò)程中總是大數(shù)往前放,小數(shù)往后放,相當(dāng)于氣泡往上升,所以稱作冒泡排序。</p>&
24、lt;p> class AccessibleSquares {</p><p> //騎士8個(gè)方向走L形狀所需的X坐標(biāo)和Y坐標(biāo)的變化量</p><p> private static int horizontal[] = {2,1,-1,-2,-2,-1,1,2};</p><p> private static int vertical [] =
25、{-1,-2,-2,-1,1,2,2,1};</p><p> private int xpos[] ;//騎士所處X軸的坐標(biāo)</p><p> private int ypos[] ;//騎士所處y軸的坐標(biāo)</p><p> private int accessibility [];//表示可達(dá)到數(shù)</p><p> private
26、 int ownxpos ,ownypos ;</p><p> private int ownAccessibility ;</p><p> private int arrayPos ;</p><p> private int countAccessibility;</p><p> public AccessibleSquar
27、es(int x , int y ){//構(gòu)造函數(shù)</p><p> int testXPos; int testYPos;</p><p> xpos = new int [ 8 ];//騎士所處X軸的坐標(biāo)</p><p> ypos = new int [ 8 ];</p><p> accessibility = new
28、 int [ 8 ];</p><p> arrayPos = 0 ;</p><p> ownxpos = x ; ownypos = y ;</p><p> ownAccessibility = KnightsTour.access[ x ][ y ];</p><p> for (int i = 0 ; i < h
29、orizontal.length ; i++ ){//有八種到達(dá)的情況</p><p> testXPos = x + horizontal[ i ];//得出X,Y坐標(biāo)的測(cè)試位置</p><p> testYPos = y + vertical [ i ];</p><p> if ( (testXPos >= 0 ) & ( testXPo
30、s < 8 ) &</p><p> (testYPos >= 0 ) & ( testYPos < 8 ) ) {//判斷測(cè)試位置是否在棋盤內(nèi)</p><p> xpos [ arrayPos ] = testXPos ;//由測(cè)試位置給出正確X,Y坐標(biāo)</p><p> ypos [ arrayPos ] = testYP
31、os ;</p><p> accessibility [ arrayPos ] = KnightsTour.access [testXPos][testYPos];</p><p> //利用對(duì)應(yīng)的X,Y坐標(biāo)得出相應(yīng)的可到達(dá)的路徑總數(shù)</p><p> // accessibility [ arrayPos ] = 0 表明格子已經(jīng)被占據(jù)</p>
32、<p> if (accessibility [ arrayPos ] > 0 ) arrayPos ++ ;</p><p> }//尋找空格子結(jié)束</p><p> }// 結(jié)束for循環(huán),尋找結(jié)束</p><p> countAccessibility = arrayPos ;//統(tǒng)計(jì)可達(dá)到數(shù)</p><p
33、> if (countAccessibility > 0 ) {sortAll();}</p><p> arrayPos = -1 ;</p><p><b> }</b></p><p> public boolean hasMoreAccessible(){</p><p> // arr
34、ayPos + 1 指向下一個(gè)可行的</p><p> if ( (arrayPos + 1 ) < countAccessibility ){</p><p> return true; }</p><p> else { return false; }</p><p> }// hasMoreAccessible()方法結(jié)束
35、</p><p> public AccessibleSquares nextAccessible(){</p><p> arrayPos ++ ;</p><p> return this;</p><p><b> }</b></p><p> public AccessibleS
36、quares accessibleAt( int pos){</p><p> if ((pos >= 0) & (pos < countAccessibility ))</p><p> arrayPos = pos ;</p><p> return this;</p><p><b> }</
37、b></p><p> public int getXpos(){</p><p> return xpos[ arrayPos ]; }</p><p> public int getYpos(){</p><p> return ypos[ arrayPos ]; }</p>&
38、lt;p> public int getAccessibility(){</p><p> return accessibility[ arrayPos ]; }</p><p> public int getTotalAccessible(){</p><p> return countAccessibility; }</p&g
39、t;<p> //bubble sorting冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個(gè)數(shù),將大數(shù)放在前面,小數(shù)放在后面。</p><p> private void sortAll (){</p><p> for ( int begin = 0 ; begin < countAccessibility - 1 ; begin ++ ){</p&
40、gt;<p> for ( int i = begin + 1; i < countAccessibility ; i ++ ){</p><p> if ( accessibility [ begin ] > accessibility [ i ] ){</p><p> swapAll( begin, i ); }//end of if</p&g
41、t;<p> }// end of inner for</p><p> }// end of outer for</p><p> }// end of sortAll</p><p><b> //交換兩個(gè)數(shù)</b></p><p> private void swapAll ( int i
42、, int j ){</p><p> int temp ;</p><p> temp = xpos [ i ]; xpos [ i ] = xpos [ j ]; xpos [ j ] = temp;</p><p> temp = ypos [ i ]; ypos [ i ] = ypos [ j ]; ypos [ j ] = tem
43、p;</p><p> temp = accessibility [ i ];</p><p> accessibility [ i ] = accessibility [ j ]; accessibility [ j ] = temp;</p><p><b> }</b></p><p><b>
44、 //進(jìn)行移動(dòng)操作</b></p><p> public void domoving(){</p><p> for ( int i = 0 ; i < countAccessibility ; i ++ ){</p><p> KnightsTour.access[ xpos [i] ][ ypos[i] ] -- ; }</
45、p><p><b> //直到?jīng)]有路徑了</b></p><p> KnightsTour.access[ ownxpos ][ ownypos ] = 0 ;</p><p><b> }</b></p><p><b> //撤消移動(dòng)操作</b></p>
46、<p> public void undomoving(){</p><p> for ( int i = 0 ; i < countAccessibility ; i ++ ){</p><p> KnightsTour.access[ xpos [i] ][ ypos[i] ] ++ ; }</p><p> KnightsTour.
47、access[ ownxpos ][ ownypos ] = ownAccessibility ;</p><p><b> }</b></p><p><b> }</b></p><p><b> 圖形化界面</b></p><p> 圖形化界面是我的搭檔做的,我就
48、簡(jiǎn)單的說(shuō)一下吧!</p><p> 本程序是Applet的圖形界面以及如何利用圖形用戶界面的控件接受用戶信息,并用圖形或圖像顯示結(jié)果.</p><p> ?。?)MyPanel函數(shù)實(shí)現(xiàn)圖形化顯示結(jié)果, MyPanel類就是畫(huà)圖類.首先用</p><p> 兩種不同顏色的方塊(WHITE和BIACK)顯示出棋盤,還有其他兩種方塊(WKNIGHT和BKNIGHT),
49、這兩種方塊上都有騎士,但顏色不一樣.在騎士游歷過(guò)程中不斷用后來(lái)兩種有騎士的方塊代替前兩種方塊,其中需要注意的是保持棋盤的顏色一致性.如圖3.4.2所示.將其設(shè)置為靜態(tài)變量,方便使用,防止修改時(shí)出錯(cuò). </p><p> 圖3.4.2 騎士游歷游戲中的棋盤用圖</p><p> ?。?)其次就是要顯示騎士起始位置,剛走過(guò)的步的位置和現(xiàn)在的位置,用邊框的不同來(lái)加以區(qū)別,采用函數(shù)g.setC
50、olor(Color.green)(剛走過(guò)的步顯示為綠色)和g.setColor(Color.biue)( 當(dāng)前的步顯示為藍(lán)色)實(shí)現(xiàn).這個(gè)類的對(duì)象在主類KnightsTour中被實(shí)例化.</p><p> 3.4.3 主調(diào)用程序的設(shè)計(jì)和開(kāi)發(fā)</p><p> KnightsTour類是控制類,它完成對(duì)算法類和畫(huà)圖類的調(diào)用.由于JAVA的GUI編程是事件驅(qū)動(dòng)的,因此在KnightsTo
51、ur類中,通過(guò)監(jiān)聽(tīng)前面介紹的幾個(gè)Button的事件相應(yīng),完成程序的調(diào)用過(guò)程.</p><p> 采用二維數(shù)組表示初始位置位于某個(gè)位置的可達(dá)到數(shù), 即以棋盤任意一點(diǎn)為初試位置,騎士游歷完整個(gè)棋盤的路徑數(shù).利用access[][]數(shù)組來(lái)表示這個(gè)二維數(shù)組. </p><p> { 2, 3, 4, 4, 4, 4, 3, 2 },</p><p>
52、 { 3, 4, 6, 6, 6, 6, 4, 3 },</p><p> { 4, 6, 8, 8, 8, 8, 6, 4 },</p><p> { 4, 6, 8, 8, 8, 8, 6, 4 },</p><p> { 4, 6, 8, 8, 8, 8, 6, 4 },</p
53、><p> { 4, 6, 8, 8, 8, 8, 6, 4 },</p><p> { 3, 4, 6, 6, 6, 6, 4, 3 },</p><p> { 2, 3, 4, 4, 4, 4, 3, 2 }};</p><p> 本程序中在KnightsTour類中添加了兩個(gè)按鈕
54、</p><p> JButton nextMoving = new JButton( "NextMoving" );</p><p> JButton nextTour = new JButton( "NextTour" );</p><p> 用于用戶對(duì)游戲進(jìn)行操作,這兩個(gè)按鈕分別有事件響應(yīng).</p>
55、<p> nextMoving.addActionListener(</p><p> //匿名內(nèi)部類,定義了actionPerformed函數(shù),調(diào)用showNext函數(shù)響應(yīng)Next Moving Button事件</p><p> new ActionListener() {</p><p> public void actionPerforme
56、d ( ActionEvent e ) {</p><p> myPanel.showNext() ; }</p><p><b> }</b></p><p> );//end call to addActionListener</p><p> nextTour.addActionListener(<
57、;/p><p> //內(nèi)部類定義了actionPerformed函數(shù),響應(yīng)Next Tour Button事件</p><p> new ActionListener() {</p><p> public void actionPerformed ( ActionEvent e ) {</p><p> if ( recordCount
58、 < recordXpos.length - 1 ) {</p><p> recordCount ++ ;</p><p> } else { recordCount = 0 ; }</p><p> myPanel.initboard ( recordXpos [ recordCount ] , </p><p> re
59、cordYpos [ recordCount ] );</p><p> myPanel.repaint();</p><p><b> }</b></p><p><b> }</b></p><p> );//end call to addActionListener</p>
60、<p><b> 測(cè)試數(shù)據(jù)及期望結(jié)果</b></p><p> 程序能正常運(yùn)行,能經(jīng)過(guò)64格中的每一格而只經(jīng)過(guò)一次,并可以執(zhí)行相應(yīng)的操作。</p><p><b> 四 系統(tǒng)測(cè)試</b></p><p> 騎士游歷程序運(yùn)行結(jié)果如下:</p><p> 圖4.1 騎士游歷游戲
61、進(jìn)入界面</p><p> 圖4.2騎士游歷游戲以(1,1)為起點(diǎn)運(yùn)行圖</p><p> 圖4.3 騎士游歷游戲以(5,4)為起點(diǎn)</p><p> 圖4.4 騎士游歷游戲以(5,4)為起點(diǎn)運(yùn)行圖</p><p> 圖4.5 騎士游歷游戲全部運(yùn)行的運(yùn)行圖</p><p> 圖4.6 小應(yīng)用程序中的克隆操作&
62、lt;/p><p> 圖4.7 小應(yīng)用程序中的標(biāo)記操作</p><p> 圖4.8 小應(yīng)用程序中的字符編碼和屬性的操作</p><p> 五 總結(jié)或心得體會(huì)</p><p> 通過(guò)這次的java課程設(shè)計(jì),我收獲了很多,學(xué)到了很多知識(shí),同時(shí)也</p><p> 發(fā)現(xiàn)了自己許多的不足。</p>&
63、lt;p> 通過(guò)騎士游歷程序的設(shè)計(jì),我更加了解了eclipse的集成卡發(fā)環(huán)境的使用,</p><p> 雖然這個(gè)課題是所有的課題中最簡(jiǎn)單的,按照參考書(shū)上的程序可以得出正確結(jié)果。但是剛開(kāi)始導(dǎo)入程序的時(shí)候并沒(méi)有那么簡(jiǎn)單,剛開(kāi)始時(shí)只把程序?qū)нM(jìn)去了,沒(méi)導(dǎo)入圖片,運(yùn)行的結(jié)果就沒(méi)有圖片,只有幾個(gè)有顏色的矩形框,后來(lái)才發(fā)現(xiàn)是圖片沒(méi)導(dǎo)進(jìn)去,真是粗心!這讓我明白了寫(xiě)程序要細(xì)心。</p><p>
64、 還有如果遇到問(wèn)題,不找出問(wèn)題的根本,就無(wú)法理解自己獲得的是什么。做這個(gè)課程設(shè)計(jì)中,我將掌握的專業(yè)理論知識(shí)很好地運(yùn)用到對(duì)這個(gè)課題的理解中.做到了理論和實(shí)踐相結(jié)合,在實(shí)踐中加深了對(duì)專業(yè)理論知識(shí)的理解,并提升了對(duì)理論知識(shí)的運(yùn)用能力,獲得了許多寶貴的經(jīng)驗(yàn)。還學(xué)到了很多書(shū)本上沒(méi)有的知識(shí)。一個(gè)好的程序,應(yīng)該能讓別人容易讀懂,所以變量名盡量用英文單詞而不要用單個(gè)字母表示,還有代碼中應(yīng)該要有足夠多的注釋。當(dāng)遇到某個(gè)功能無(wú)法實(shí)現(xiàn)時(shí),我會(huì)上網(wǎng)先百度,看看
65、網(wǎng)上有沒(méi)有好的解決方案,實(shí)在找不到的話可以找老師或同學(xué),通過(guò)她們提供的接口、類之類的,然后查詢那個(gè)幫助文檔。</p><p> 我也理解了小組合作的重要性,真正理解了作為一個(gè)計(jì)算機(jī)學(xué)習(xí)者不僅要學(xué)好計(jì)算機(jī)知識(shí),同時(shí)也要與自己的搭檔配合,共同克服困難。騎士游歷課程設(shè)計(jì)是我和同學(xué)一起探討,一起慢慢理解,直至最后一起完成的,所以說(shuō)不管有什么樣的困難,團(tuán)隊(duì)的合作一定能將大問(wèn)題變小問(wèn)題,再講小問(wèn)題逐個(gè)擊破??傊?,這次的課程
66、設(shè)計(jì)讓我受益匪淺。</p><p> 這個(gè)課程設(shè)計(jì)的順利完成,讓我對(duì)騎士游歷程序的開(kāi)發(fā)的整個(gè)流程有了深刻地了解和系統(tǒng)地掌握。</p><p><b> 六 參考文獻(xiàn)</b></p><p> 1. 陳明.Java語(yǔ)言程序設(shè)計(jì)課程實(shí)踐.北京:清華大學(xué)出版社,2008.</p><p> 2. 楊樹(shù)林、胡潔萍.Ja
67、va語(yǔ)言最新實(shí)用案例教程.北京:清華大學(xué)出版社,2006.</p><p> 3.譚浩強(qiáng).Java程序設(shè)計(jì)(第二版).北京:清華大學(xué)出版社,2006.</p><p> 4.譚浩強(qiáng).Java程序設(shè)計(jì)(第二版)題解與上機(jī)指導(dǎo)(修訂版),2010.附錄</p><p> 5.黃曉東.《Java課程設(shè)計(jì)案例精編》.中國(guó)水利水電出版社,2007年</p>
68、<p> 6.袁然,鄭自國(guó),鄒豐義.《java案例開(kāi)發(fā)集錦》,電子工業(yè)出版社,2005年</p><p><b> 七 附錄</b></p><p><b> 程序源代碼:</b></p><p> package test;</p><p> import java.awt
69、.*;</p><p> import java.awt.event.*;</p><p> import javax.swing.*;</p><p> //import java.awt.image.*;</p><p> public class KnightsTour extends JApplet {</p>
70、<p><b> /**</b></p><p><b> * </b></p><p><b> */</b></p><p> private static final long serialVersionUID = 1L;</p><p> // 初始
71、位置位于某個(gè)位置的可達(dá)到數(shù)采用二維數(shù)組表示</p><p> //即以棋盤任意一點(diǎn)為初試位置,騎士游歷完整個(gè)棋盤的路徑數(shù)</p><p> public static int access[][] = {</p><p> {2,3,4,4,4,4,3,2},</p><p> {3,4,6,6,6,6,4,3},</p>
72、<p> {4,6,8,8,8,8,6,4},</p><p> {4,6,8,8,8,8,6,4},</p><p> {4,6,8,8,8,8,6,4},</p><p> {4,6,8,8,8,8,6,4},</p><p> {3,4,6,6,6,6,4,3},</p><p> {2
73、,3,4,4,4,4,3,2}};</p><p> public static int accessbak[][] = arrayCopy ( access ) ;</p><p> int countMoving = -1 ;</p><p> int tourXpos [] = new int [ 64 ];//游歷中,X,Y都有64個(gè)位置</p&
74、gt;<p> int tourYpos [] = new int [ 64 ];</p><p> private int recordXpos [][]; private int recordYpos [][];</p><p> private int recordCount = - 1 ;</p><p> private b
75、oolean success = false;</p><p> MyPanel myPanel ;//聲明 MyPanel的一個(gè)對(duì)象</p><p> public void tour ( int xpos ,int ypos ){//成員函數(shù)</p><p> // int x,y;</p><p> countMovi
76、ng ++ ;</p><p> //如果64個(gè)格子都被走過(guò),則返回</p><p> if (countMoving == 63 )</p><p> { tourXpos [ countMoving ] = xpos ;</p><p> tourYpos [ countMoving ] = ypos ;</p>
77、<p> success = true ;</p><p> countMoving -- ;</p><p><b> return ;</b></p><p><b> }</b></p><p> AccessibleSquares nextSquare = new Acc
78、essibleSquares( xpos, ypos );</p><p> //初試化 AccessibleSquares對(duì)象,給nextSquare分配內(nèi)存</p><p> while (nextSquare.hasMoreAccessible())</p><p> //利用AccessibleSquares()對(duì)象調(diào)用hasMoreAccessibl
79、e()成員函數(shù)</p><p> { // 開(kāi)始移動(dòng)</p><p> nextSquare.domoving();//調(diào)用 nextSquare.domoving()函數(shù)</p><p> //把這一步記錄下來(lái)</p><p> tourXpos [ countMoving ] = xpos ;</p><p&
80、gt; tourYpos [ countMoving ] = ypos ;</p><p> // 嘗試下一步的移動(dòng)</p><p> nextSquare.nextAccessible();</p><p> tour ( nextSquare.getXpos() , nextSquare.getYpos() );</p><p>
81、 //如果64個(gè)格子都被走過(guò),則返回</p><p> if ( success )</p><p> { countMoving -- ;</p><p> return ; }</p><p> //如果失敗,則從起始位置從新開(kāi)始</p><p> nextSquare.undomoving();&
82、lt;/p><p><b> }</b></p><p> countMoving -- ;</p><p><b> }//游歷方法結(jié)束</b></p><p><b> //定義棋盤行和列</b></p><p><b> //先定義
83、一行棋盤</b></p><p> public static int[] arrayCopy ( int array1[] )//定義一個(gè)整形數(shù)組arrayCopy</p><p> { int[]array2 = new int [array1.length];</p><p> for ( int row = 0 ; row < ar
84、ray1.length ; row ++ )</p><p> { array2 [ row ] = array1 [ row ] ; };</p><p> return array2;</p><p><b> }</b></p><p> //復(fù)制數(shù)組,即定義出棋盤列</p><
85、p> public static int[][] arrayCopy ( int array1[][] )</p><p> { int[][] array2 = new int [array1.length][array1[0].length];</p><p> for ( int row = 0 ; row < array1.length ; row ++ )&
86、lt;/p><p> { for ( int column = 0 ; column < array1[0].length ; column ++ )</p><p> { array2 [ row ][ column ] = array1 [ row ][ column ]; };</p><p><b> };</b><
87、/p><p> return array2;</p><p><b> }</b></p><p> //棋盤數(shù)組函數(shù)初始化</p><p> public void initialArray ( int chessBoard[][] )</p><p> { for ( int row
88、 = 0 ; row < 8 ; row ++ )</p><p> { for ( int column = 0 ; column < 8 ; column ++ )</p><p> { chessBoard [ row ][ column ] = 0 ; };</p><p><b> };</b></p&g
89、t;<p><b> }</b></p><p> public static void main( String args[] ) {</p><p> KnightsTour application = new KnightsTour();</p><p> application.tour( 0 , 0 );<
90、/p><p><b> }</b></p><p> public void init () {</p><p> recordCount = -1 ;</p><p> recordXpos = new int [ 64 ][ 64 ] ; recordYpos = new int [ 64 ][ 64 ]
91、;</p><p> for (int row = 0 ; row < 8 ;row ++){</p><p> for ( int column = 0 ; column < 8 ; column ++ ){</p><p> success = false ;</p><p> countMoving = -1;<
92、;/p><p> access = arrayCopy ( accessbak );</p><p> tour ( row ,column );</p><p> recordCount ++ ;</p><p> recordXpos [ recordCount ] = arrayCopy ( tourXpos ) ;</p&g
93、t;<p> recordYpos [ recordCount ] = arrayCopy ( tourYpos ) ;</p><p><b> }</b></p><p><b> }</b></p><p> recordCount = 0 ;</p><p> myP
94、anel = new MyPanel( recordXpos [ 0 ] ,recordYpos [ 0 ]) ;</p><p> JPanel buttonPanel = new JPanel();</p><p> JButton nextMoving = new JButton( "Next Moving" );</p><p>
95、JButton nextTour = new JButton( "Next Tour" );</p><p> buttonPanel.add( nextTour );</p><p> buttonPanel.add( nextMoving );</p><p> getContentPane().add( buttonPanel, Bo
96、rderLayout.SOUTH );</p><p> getContentPane().add( myPanel );</p><p> nextMoving.addActionListener(</p><p> //匿名內(nèi)部類,定義了actionPerformed函數(shù),調(diào)用showNext函數(shù)響應(yīng)Next Moving Button事件</p&g
97、t;<p> new ActionListener() {</p><p> public void actionPerformed ( ActionEvent e ) {</p><p> myPanel.showNext() ; }</p><p><b> }</b></p><p>
98、);//end call to addActionListener</p><p> nextTour.addActionListener(</p><p> //內(nèi)部類定義了actionPerformed函數(shù),響應(yīng)Next Tour Button事件</p><p> new ActionListener() {</p><p>
99、public void actionPerformed ( ActionEvent e ) {</p><p> if ( recordCount < recordXpos.length - 1 ) {</p><p> recordCount ++ ;</p><p> } else { recordCount = 0 ; }</p>
100、<p> myPanel.initboard ( recordXpos [ recordCount ] , </p><p> recordYpos [ recordCount ] );</p><p> myPanel.repaint();</p><p><b> }</b></p><p>&l
101、t;b> }</b></p><p> );//end call to addActionListener</p><p><b> }</b></p><p> public void paint (Graphics g )</p><p> { super.paint( g ); }
102、</p><p> }//end of class KnightsTour</p><p> class AccessibleSquares {</p><p> //騎士8個(gè)方向走L形狀所需的X坐標(biāo)和Y坐標(biāo)的變化量</p><p> private static int horizontal[] = {2,1,-1,-2,-2,-1
103、,1,2};</p><p> private static int vertical [] = {-1,-2,-2,-1,1,2,2,1};</p><p> private int xpos[] ;//騎士所處X軸的坐標(biāo)</p><p> private int ypos[] ;//騎士所處y軸的坐標(biāo)</p><p> priv
104、ate int accessibility [];//表示可達(dá)到數(shù)</p><p> private int ownxpos ,ownypos ;</p><p> private int ownAccessibility ;</p><p> private int arrayPos ;</p><p> private int c
105、ountAccessibility;</p><p> public AccessibleSquares(int x , int y ){//構(gòu)造函數(shù)</p><p> int testXPos; int testYPos;</p><p> xpos = new int [ 8 ];//騎士所處X軸的坐標(biāo)</p><p>
106、ypos = new int [ 8 ];</p><p> accessibility = new int [ 8 ];</p><p> arrayPos = 0 ;</p><p> ownxpos = x ; ownypos = y ;</p><p> ownAccessibility = KnightsTour.ac
107、cess[ x ][ y ];</p><p> for (int i = 0 ; i < horizontal.length ; i++ ){//有八種到達(dá)的情況</p><p> testXPos = x + horizontal[ i ];//得出X,Y坐標(biāo)的測(cè)試位置</p><p> testYPos = y + vertical [ i ];
108、</p><p> if ( (testXPos >= 0 ) & ( testXPos < 8 ) &</p><p> (testYPos >= 0 ) & ( testYPos < 8 ) ) {//判斷測(cè)試位置是否在棋盤內(nèi)</p><p> xpos [ arrayPos ] = testXPos ;//
109、由測(cè)試位置給出正確X,Y坐標(biāo)</p><p> ypos [ arrayPos ] = testYPos ;</p><p> accessibility [ arrayPos ] = KnightsTour.access [testXPos][testYPos];</p><p> //利用對(duì)應(yīng)的X,Y坐標(biāo)得出相應(yīng)的可到達(dá)的路徑總數(shù)</p>&
110、lt;p> // accessibility [ arrayPos ] = 0 表明格子已經(jīng)被占據(jù)</p><p> if (accessibility [ arrayPos ] > 0 ) arrayPos ++ ;</p><p> }//尋找空格子結(jié)束</p><p> }// 結(jié)束for循環(huán),尋找結(jié)束</p><
111、p> countAccessibility = arrayPos ;//統(tǒng)計(jì)可達(dá)到數(shù)</p><p> if (countAccessibility > 0 ) {sortAll();}</p><p> arrayPos = -1 ;</p><p><b> }</b></p><p> p
112、ublic boolean hasMoreAccessible(){</p><p> // arrayPos + 1 指向下一個(gè)可行的</p><p> if ( (arrayPos + 1 ) < countAccessibility ){</p><p> return true; }</p><p> else { re
113、turn false; }</p><p> }// hasMoreAccessible()方法結(jié)束</p><p> public AccessibleSquares nextAccessible(){</p><p> arrayPos ++ ;</p><p> return this;</p><p>
114、<b> }</b></p><p> public AccessibleSquares accessibleAt( int pos){</p><p> if ((pos >= 0) & (pos < countAccessibility ))</p><p> arrayPos = pos ;</p>
115、<p> return this;</p><p><b> }</b></p><p> public int getXpos(){</p><p> return xpos[ arrayPos ]; }</p><p> public int getYpos(){</p&
116、gt;<p> return ypos[ arrayPos ]; }</p><p> public int getAccessibility(){</p><p> return accessibility[ arrayPos ]; }</p><p> public int getTotalAccessible(){&l
117、t;/p><p> return countAccessibility; }</p><p> //冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個(gè)數(shù),將大數(shù)放在前面,小數(shù)放在后面。</p><p> private void sortAll (){</p><p> for ( int begin = 0 ; begin
118、 < countAccessibility - 1 ; begin ++ ){</p><p> for ( int i = begin + 1; i < countAccessibility ; i ++ ){</p><p> if ( accessibility [ begin ] > accessibility [ i ] ){</p><
119、p> swapAll( begin, i ); }//end of if</p><p> }// end of inner for</p><p> }// end of outer for</p><p> }// end of sortAll</p><p><b> //交換兩個(gè)數(shù)</b><
120、;/p><p> private void swapAll ( int i , int j ){</p><p> int temp ;</p><p> temp = xpos [ i ]; xpos [ i ] = xpos [ j ]; xpos [ j ] = temp;</p><p> temp = ypos [ i
121、 ]; ypos [ i ] = ypos [ j ]; ypos [ j ] = temp;</p><p> temp = accessibility [ i ];</p><p> accessibility [ i ] = accessibility [ j ]; accessibility [ j ] = temp;</p><p><
溫馨提示
- 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ù)結(jié)構(gòu)課程設(shè)計(jì)-- 騎士游歷
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)--騎士游歷
- java課程設(shè)計(jì)---java程序設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告--java桌面應(yīng)用程序設(shè)計(jì)開(kāi)發(fā)
- java課程設(shè)計(jì)--java程序設(shè)計(jì)
- java課程設(shè)計(jì)--java面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)
- java課程設(shè)計(jì)-聊天程序
- java程序設(shè)計(jì)與開(kāi)發(fā)技術(shù)課程設(shè)計(jì)
- java抽獎(jiǎng)程序課程設(shè)計(jì)
- java課程設(shè)計(jì)聊天小程序
- 超市收銀程序java課程設(shè)計(jì)
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- java課程設(shè)計(jì)報(bào)告--聊天小程序
- java語(yǔ)言程序課程設(shè)計(jì)-- 坦克大戰(zhàn)
- java課程設(shè)計(jì)敏感詞匯分析程序
- java校園導(dǎo)游程序課程設(shè)計(jì)
- 基于java的記事本程序課程設(shè)計(jì)
- 基于java的記事本程序課程設(shè)計(jì)
- java程序課程設(shè)計(jì)--計(jì)算器編輯
評(píng)論
0/150
提交評(píng)論