![java課程設(shè)計(jì)-騎士游歷程序的開發(fā)_第1頁](http://file4.renrendoc.com/view/142e6e12c78174b38d486995bea10a90/142e6e12c78174b38d486995bea10a901.gif)
![java課程設(shè)計(jì)-騎士游歷程序的開發(fā)_第2頁](http://file4.renrendoc.com/view/142e6e12c78174b38d486995bea10a90/142e6e12c78174b38d486995bea10a902.gif)
![java課程設(shè)計(jì)-騎士游歷程序的開發(fā)_第3頁](http://file4.renrendoc.com/view/142e6e12c78174b38d486995bea10a90/142e6e12c78174b38d486995bea10a903.gif)
![java課程設(shè)計(jì)-騎士游歷程序的開發(fā)_第4頁](http://file4.renrendoc.com/view/142e6e12c78174b38d486995bea10a90/142e6e12c78174b38d486995bea10a904.gif)
![java課程設(shè)計(jì)-騎士游歷程序的開發(fā)_第5頁](http://file4.renrendoc.com/view/142e6e12c78174b38d486995bea10a90/142e6e12c78174b38d486995bea10a905.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 JAVA程序設(shè)計(jì) 課程設(shè)計(jì)報(bào)告課 題: 騎士游歷程序的開發(fā) 姓 名: 學(xué) 號: 同組姓名: 專業(yè)班級: 指導(dǎo)教師: 設(shè)計(jì)時(shí)間: 評閱意見:評定成績: 指導(dǎo)老師簽名: 年 月 日目 錄 TOC o 1-3 h z u HYPERLINK l _Toc287784865 一 系統(tǒng)描述2 HYPERLINK l _Toc287784866 二 設(shè)計(jì)目的與意義2 HYPERLINK l _Toc287784869 三 分析與設(shè)計(jì)3 HYPERLINK l _Toc287784870 3.1 創(chuàng)建騎士游歷程序3 HYPERLINK l _Toc287784871 3.2 功能模塊劃分33 HYPERL
2、INK l _Toc287784871 .3 系統(tǒng)詳細(xì)設(shè)計(jì)文檔5 HYPERLINK l _Toc287784872 3.3.1 類的劃分及相互關(guān)系5 HYPERLINK l _Toc287784873 3. 系統(tǒng)或模塊的流程圖5 HYPERLINK l _Toc287784871 3.4 各個(gè)模塊的實(shí)現(xiàn)方法描述6 HYPERLINK l _Toc287784871 3. AccessibleSquare算法實(shí)現(xiàn)6 HYPERLINK l _Toc287784871 3. 圖形化界面9 HYPERLINK l _Toc287784875 3. 主調(diào)用程序的設(shè)計(jì)和開發(fā)10 HYPERLINK l
3、 _Toc287784871 3.5 測試數(shù)據(jù)及期望結(jié)果11 HYPERLINK l _Toc287784877 四 系統(tǒng)測試11 HYPERLINK l _Toc287784877 五 總結(jié)或心得體會15 HYPERLINK l _Toc287784878 六 參考文獻(xiàn) PAGEREF _Toc287784878 h 16 HYPERLINK l _Toc287784879 七 附錄16一 系統(tǒng)描述騎士游歷問題是一個(gè)古老而著名的問題,它最初是由大數(shù)學(xué)家Euler提出的.問題是這樣的:國際象棋中的棋子(叫作騎士)在一個(gè)空棋盤內(nèi)移動,問它能否經(jīng)過64格中的每一格且只經(jīng)過一次?(騎士按L行移動,即
4、在某方向前進(jìn)兩格接著在與原方向垂直的方向上前進(jìn)一格) 即:有一個(gè)n*m的棋盤(2n50,2m50),在棋盤(x1,y1)點(diǎn)即第x1行第y1列有一個(gè)中國象棋馬,馬走的規(guī)則為:(1)馬走日字;(2)馬只能向右走任務(wù):求出從起始點(diǎn)到棋盤最右邊的所有路徑。本程序?qū)崿F(xiàn)了騎士游歷問題的求解,并能夠演示起始位置在棋盤上任何位置的游歷問題的實(shí)現(xiàn).程序采用動態(tài)的圖形演示,使算法的描述更形象,更生動,使教學(xué)能產(chǎn)生良好的效果。本程序采用Applet來編制整個(gè)程序,這樣既可以使大家對算法的實(shí)現(xiàn)有了一定的了解,也可以熟悉一下Java圖形界面, Applet以及Java語言的命名規(guī)范,讓大家熟悉Java的基本語言結(jié)構(gòu)和強(qiáng)
5、大的開發(fā)能力。在騎士游歷的課程設(shè)計(jì)中,嚴(yán)格按照面向?qū)ο蟮乃枷脒M(jìn)行開發(fā),其中有AccessibleSquare 類,MyPanel類和KnightsTour類.我們應(yīng)注意各個(gè)類之間的關(guān)系,以便更深入地理解Java中類的思想。二 設(shè)計(jì)目的與意義Java課程設(shè)計(jì)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生必做的集中實(shí)踐性環(huán)節(jié)之一,是學(xué)習(xí)完Java程序設(shè)計(jì)課程后進(jìn)行的一次全面的綜合練習(xí)。其目的在于通過課程設(shè)計(jì),使學(xué)生能夠得到較系統(tǒng)的技能訓(xùn)練,從而鞏固和加深對Java 編程的基礎(chǔ)理論知識的理解,培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)理論解決實(shí)際問題的能力,使學(xué)生成為具有扎實(shí)的計(jì)算機(jī)理論基礎(chǔ)和較強(qiáng)的獨(dú)立動手能力的復(fù)合型、應(yīng)用型人才。三 分析
6、與設(shè)計(jì)解決本程序的問題的關(guān)鍵在于如何讓騎士按日字行走,如何計(jì)算騎士從開始位置到結(jié)束位置所走的步數(shù)以及如何保證所得的步數(shù)為騎士從開始位置到結(jié)束位置所需要的最小的步數(shù),并且可以輸入多組數(shù)據(jù)測試多組最小的步數(shù)。騎士行走路徑為“L”型,即下圖所示: 圖3.1 馬走的規(guī)則當(dāng)n,m 給出之后,同時(shí)給出馬起始的位置和終點(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條路徑,如下圖): 圖3.2 馬走的所有路徑如此,騎士每走一步都按照此方式步進(jìn),直至整個(gè)棋盤都被“游走”一遍則完成。3.1 創(chuàng)建騎士游歷
7、程序在對eclipse的基本常識有了初步的了解后,就可以起步創(chuàng)建騎士游歷程序了。創(chuàng)建過程如下:(1)單擊桌面圖標(biāo),啟動eclipse開發(fā)平臺進(jìn)入一個(gè)新的工程界面。(2)命名新的工程并保存文件,方法是單擊菜單FileNew Project,出現(xiàn)一個(gè)對話框窗口,將工程名為Knighttour,選擇保存工程文件目錄之后,單擊Finish按鈕完成騎士游歷工程的創(chuàng)建。3.2 功能模塊劃分整個(gè)程序界面由三部分組成,上方有兩個(gè)工具欄,一個(gè)是,一個(gè)是小程序應(yīng)用,其中可以執(zhí)行還原(R)、移動(M)、大小(S)、最大化(N)、最小化(X)、關(guān)閉(C)的操作,小程序應(yīng)用則可執(zhí)行重新啟動、重新加載、停止、保存、啟動、
8、克隆、標(biāo)記、信息、編輯、字符編碼、打印、屬性、關(guān)閉、退出的相應(yīng)操作。中間是騎士游歷的效果顯示圖,動態(tài)演示騎士游歷的過程;最下邊一排是NextTour和NextMoving兩個(gè)按鈕,單擊NextTour按鈕可以重新開始一個(gè)新的游歷,單擊NextMoving按鈕,則顯示騎士要走的下一步。如圖 2.1.1所示(這是騎士在第一個(gè)格子起始位置進(jìn)行游歷的情況,如果想在其他的位置開始游歷,直接單擊NextTour按鈕就可以了,程序?qū)崿F(xiàn)的騎士的起始位置的方式是按照從第一列第一個(gè)開始、直到最后一列、最后一行)。另外,可以由邊框的顏色的不同,判斷騎士的初始位置、上一步所走的位置和現(xiàn)在所處的位置。單擊NextMov
9、ing按鈕可以顯示騎士游歷的下一個(gè)位置。連續(xù)單擊直到64個(gè)格子全部都走完,可以清晰的顯示整個(gè)游歷的過程。圖顯示的是騎士游歷起始位置在第一個(gè)格子和游歷到中間位置的一個(gè)中間狀態(tài)。當(dāng)然,騎士可以在棋盤的任何位置開始。圖3.2.1 騎士在第一個(gè)格子的情況圖3.2.2 騎士在第一個(gè)格子的游歷的中間狀態(tài)系統(tǒng)詳細(xì)設(shè)計(jì)文檔3.3.1 類的劃分及相互關(guān)系本程序由三個(gè)類組成一個(gè)工程文件。其中KinghtsTour 是主類,或者說是控制類,AccessibleSquare類主要是算法的實(shí)現(xiàn),MyPanel類實(shí)現(xiàn)圖形化顯示結(jié)果。程序的運(yùn)行關(guān)系圖如圖3.3.1所示。Accessible Square類KinghtsTo
10、ur主類MyPanel類圖3.3.1 程序運(yùn)行關(guān)系圖系統(tǒng)或模塊的流程圖系統(tǒng)流程圖:圖3.3.2 系統(tǒng)流程圖各個(gè)模塊的實(shí)現(xiàn)方法描述此程序主要分為三個(gè)部分:第一部分主要講解算法編程目的,讓大家熟悉Java的計(jì)算功能;第二部分是圖形化界面,主要講解Appelt的圖形化的界面以及如何利用圖形用戶界面的控件接受用戶信息,并用圖形或圖像顯示結(jié)果;第三部分是控制類通過響應(yīng)Button時(shí)間完成對算法類畫圖類的調(diào)用。AccessibleSquare算法實(shí)現(xiàn)AccessibleSquare類主要是算法實(shí)現(xiàn),采用啟發(fā)式算法. (1)先把8個(gè)可能走的方向用兩個(gè)數(shù)組(horizontal 和vertical )表示出來
11、,選擇走哪個(gè)方向就在原坐標(biāo)上進(jìn)行相應(yīng)的加法,表示騎士到了一個(gè)新的位置. horizontal 和vertical 表示騎士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)圖如下:65432187 圖 騎士游歷走向坐標(biāo)圖 (2)由于程序采用啟發(fā)式算法,應(yīng)考察每一方格的可到達(dá)性.使用數(shù)組accessibility 表示可達(dá)到數(shù),并當(dāng)騎士游歷時(shí),程序動態(tài)修正剩余格子的可達(dá)到數(shù). accessibility arrayPos = 0 表明格子已經(jīng)被占據(jù).(3)使用冒泡
12、法來查詢最小數(shù). 冒泡排序的基本概念是:依次比較相鄰的兩個(gè)數(shù),將大數(shù)放在前面,小數(shù)放在后面。即首先比較第1個(gè)和第2個(gè)數(shù),將大數(shù)放前,小數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將大數(shù)放前,小數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將大數(shù)放前,小數(shù)放后,此時(shí)第一趟結(jié)束,在最后的數(shù)必是所有數(shù)中的最小數(shù)。重復(fù)以上過程,仍從第一對數(shù)開始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再大于第2個(gè)數(shù)),將大數(shù)放前,小數(shù)放后,一直比較到最小數(shù)前的一對相鄰數(shù),將大數(shù)放前,小數(shù)放后,第二趟結(jié)束,在倒數(shù)第二個(gè)數(shù)中得到一個(gè)新的最小數(shù)。如此下去,直至最終完成排序。由于在排序過程中總是大數(shù)往前放,小數(shù)往后放,相當(dāng)于
13、氣泡往上升,所以稱作冒泡排序。class AccessibleSquares /騎士8個(gè)方向走L形狀所需的X坐標(biāo)和Y坐標(biāo)的變化量 private static int horizontal = 2,1,-1,-2,-2,-1,1,2; private static int vertical = -1,-2,-2,-1,1,2,2,1; private int xpos ;/騎士所處X軸的坐標(biāo) private int ypos ;/騎士所處y軸的坐標(biāo) private int accessibility ;/表示可達(dá)到數(shù) private int ownxpos ,ownypos ; private
14、 int ownAccessibility ; private int arrayPos ; private int countAccessibility; public AccessibleSquares(int x , int y )/構(gòu)造函數(shù) int testXPos; int testYPos; xpos = new int 8 ;/騎士所處X軸的坐標(biāo) ypos = new int 8 ; accessibility = new int 8 ; arrayPos = 0 ; ownxpos = x ; ownypos = y ; ownAccessibility = KnightsTo
15、ur.access x y ; for (int i = 0 ; i = 0 ) & ( testXPos = 0 ) & ( testYPos 0 ) arrayPos + ; /尋找空格子結(jié)束 / 結(jié)束for循環(huán),尋找結(jié)束 countAccessibility = arrayPos ;/統(tǒng)計(jì)可達(dá)到數(shù) if (countAccessibility 0 ) sortAll(); arrayPos = -1 ; public boolean hasMoreAccessible() / arrayPos + 1 指向下一個(gè)可行的 if ( (arrayPos + 1 ) = 0) & (pos c
16、ountAccessibility ) arrayPos = pos ; return this; public int getXpos() return xpos arrayPos ; public int getYpos() return ypos arrayPos ; public int getAccessibility() return accessibility arrayPos ; public int getTotalAccessible() return countAccessibility; /bubble sorting冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個(gè)
17、數(shù),將大數(shù)放在前面,小數(shù)放在后面。 private void sortAll () for ( int begin = 0 ; begin countAccessibility - 1 ; begin + ) for ( int i = begin + 1; i accessibility i ) swapAll( begin, i ); /end of if / end of inner for / end of outer for / end of sortAll /交換兩個(gè)數(shù) private void swapAll ( int i , int j ) int temp ; temp =
18、 xpos i ; xpos i = xpos j ; xpos j = temp; temp = ypos i ; ypos i = ypos j ; ypos j = temp; temp = accessibility i ; accessibility i = accessibility j ; accessibility j = temp; /進(jìn)行移動操作 public void domoving() for ( int i = 0 ; i countAccessibility ; i + ) KnightsTour.access xpos i yposi - ; /直到?jīng)]有路徑了
19、KnightsTour.access ownxpos ownypos = 0 ; /撤消移動操作 public void undomoving() for ( int i = 0 ; i countAccessibility ; i + ) KnightsTour.access xpos i yposi + ; KnightsTour.access ownxpos ownypos = ownAccessibility ; 圖形化界面圖形化界面是我的搭檔做的,我就簡單的說一下吧!本程序是Applet的圖形界面以及如何利用圖形用戶界面的控件接受用戶信息,并用圖形或圖像顯示結(jié)果.(1)MyPanel
20、函數(shù)實(shí)現(xiàn)圖形化顯示結(jié)果, MyPanel類就是畫圖類.首先用兩種不同顏色的方塊(WHITE和BIACK)顯示出棋盤,還有其他兩種方塊(WKNIGHT和BKNIGHT),這兩種方塊上都有騎士,但顏色不一樣.在騎士游歷過程中不斷用所示.將其設(shè)置為靜態(tài)變量,方便使用,防止修改時(shí)出錯(cuò). 騎士游歷游戲中的棋盤用圖(2)其次就是要顯示騎士起始位置,剛走過的步的位置和現(xiàn)在的位置,用邊框的不同來加以區(qū)別,采用函數(shù)g.setColor(Color.green)(剛走過的步顯示為綠色)和g.setColor(Color.biue)( 當(dāng)前的步KnightsTour中被實(shí)例化.3. 主調(diào)用程序的設(shè)計(jì)和開發(fā)Knigh
21、tsTour類是控制類,它完成對算法類和畫圖類的調(diào)用.由于JAVA的GUI編程是事件驅(qū)動的,因此在KnightsTour類中,通過監(jiān)聽前面介紹的幾個(gè)Button的事件相應(yīng),完成程序的調(diào)用過程.access數(shù)組來表示這個(gè)二維數(shù)組. 2, 3, 4, 4, 4, 4, 3, 2 , 3, 4, 6, 6, 6, 6, 4, 3 , 4, 6, 8, 8, 8, 8, 6, 4 , 4, 6, 8, 8, 8, 8, 6, 4 , 4, 6, 8, 8, 8, 8, 6, 4 , 4, 6, 8, 8, 8, 8, 6, 4 , 3, 4, 6, 6, 6, 6, 4, 3 , 2, 3, 4, 4
22、, 4, 4, 3, 2 ;本程序中在KnightsTour類中添加了兩個(gè)按鈕JButton nextMoving = new JButton( NextMoving ); JButton nextTour = new JButton( NextTour );用于用戶對游戲進(jìn)行操作,這兩個(gè)按鈕分別有事件響應(yīng).nextMoving.addActionListener(/匿名內(nèi)部類,定義了actionPerformed函數(shù),調(diào)用showNext函數(shù)響應(yīng)Next Moving Button事件 new ActionListener() public void actionPerformed ( Ac
23、tionEvent e ) myPanel.showNext() ; );/end call to addActionListener nextTour.addActionListener(/內(nèi)部類定義了actionPerformed函數(shù),響應(yīng)Next Tour Button事件 new ActionListener() public void actionPerformed ( ActionEvent e ) if ( recordCount recordXpos.length - 1 ) recordCount + ; else recordCount = 0 ; myPanel.init
24、board ( recordXpos recordCount , recordYpos recordCount ); myPanel.repaint(); );/end call to addActionListener測試數(shù)據(jù)及期望結(jié)果程序能正常運(yùn)行,能經(jīng)過64格中的每一格而只經(jīng)過一次,并可以執(zhí)行相應(yīng)的操作。四 系統(tǒng)測試騎士游歷程序運(yùn)行結(jié)果如下:圖4.1 騎士游歷游戲進(jìn)入界面圖4.2騎士游歷游戲以(1,1)為起點(diǎn)運(yùn)行圖圖4.3 騎士游歷游戲以(5,4)為起點(diǎn) 圖4.4 騎士游歷游戲以(5,4)為起點(diǎn)運(yùn)行圖 圖4.5 騎士游歷游戲全部運(yùn)行的運(yùn)行圖圖4.6 小應(yīng)用程序中的克隆操作圖4.7 小應(yīng)用
25、程序中的標(biāo)記操作 圖4.8 小應(yīng)用程序中的字符編碼和屬性的操作 五 總結(jié)或心得體會通過這次的java課程設(shè)計(jì),我收獲了很多,學(xué)到了很多知識,同時(shí)也發(fā)現(xiàn)了自己許多的不足。通過騎士游歷程序的設(shè)計(jì),我更加了解了eclipse的集成卡發(fā)環(huán)境的使用,雖然這個(gè)課題是所有的課題中最簡單的,按照參考書上的程序可以得出正確結(jié)果。但是剛開始導(dǎo)入程序的時(shí)候并沒有那么簡單,剛開始時(shí)只把程序?qū)нM(jìn)去了,沒導(dǎo)入圖片,運(yùn)行的結(jié)果就沒有圖片,只有幾個(gè)有顏色的矩形框,后來才發(fā)現(xiàn)是圖片沒導(dǎo)進(jìn)去,真是粗心!這讓我明白了寫程序要細(xì)心。還有如果遇到問題,不找出問題的根本,就無法理解自己獲得的是什么。做這個(gè)課程設(shè)計(jì)中,我將掌握的專業(yè)理論知
26、識很好地運(yùn)用到對這個(gè)課題的理解中.做到了理論和實(shí)踐相結(jié)合,在實(shí)踐中加深了對專業(yè)理論知識的理解,并提升了對理論知識的運(yùn)用能力,獲得了許多寶貴的經(jīng)驗(yàn)。還學(xué)到了很多書本上沒有的知識。一個(gè)好的程序,應(yīng)該能讓別人容易讀懂,所以變量名盡量用英文單詞而不要用單個(gè)字母表示,還有代碼中應(yīng)該要有足夠多的注釋。當(dāng)遇到某個(gè)功能無法實(shí)現(xiàn)時(shí),我會上網(wǎng)先百度,看看網(wǎng)上有沒有好的解決方案,實(shí)在找不到的話可以找老師或同學(xué),通過她們提供的接口、類之類的,然后查詢那個(gè)幫助文檔。我也理解了小組合作的重要性,真正理解了作為一個(gè)計(jì)算機(jī)學(xué)習(xí)者不僅要學(xué)好計(jì)算機(jī)知識,同時(shí)也要與自己的搭檔配合,共同克服困難。騎士游歷課程設(shè)計(jì)是我和同學(xué)一起探討,
27、一起慢慢理解,直至最后一起完成的,所以說不管有什么樣的困難,團(tuán)隊(duì)的合作一定能將大問題變小問題,再講小問題逐個(gè)擊破??傊?,這次的課程設(shè)計(jì)讓我受益匪淺。這個(gè)課程設(shè)計(jì)的順利完成,讓我對騎士游歷程序的開發(fā)的整個(gè)流程有了深刻地了解和系統(tǒng)地掌握。六 參考文獻(xiàn)1. 陳明.Java語言程序設(shè)計(jì)課程實(shí)踐.北京:清華大學(xué)出版社,2008.2. 楊樹林、胡潔萍.Java語言最新實(shí)用案例教程.北京:清華大學(xué)出版社,2006.3譚浩強(qiáng).Java程序設(shè)計(jì)(第二版).北京:清華大學(xué)出版社,2006.5黃曉東.Java課程設(shè)計(jì)案例精編.中國水利水電出版社,2007年6袁然,鄭自國,鄒豐義.java案例開發(fā)集錦,電子工業(yè)出版社
28、,2005年七 附錄程序源代碼:package test;import java.awt.*;import java.awt.event.*;import javax.swing.*;/import java.awt.image.*;public class KnightsTour extends JApplet /* * */private static final long serialVersionUID = 1L; / 初始位置位于某個(gè)位置的可達(dá)到數(shù)采用二維數(shù)組表示 /即以棋盤任意一點(diǎn)為初試位置,騎士游歷完整個(gè)棋盤的路徑數(shù) public static int access = 2,3,
29、4,4,4,4,3,2, 3,4,6,6,6,6,4,3, 4,6,8,8,8,8,6,4, 4,6,8,8,8,8,6,4, 4,6,8,8,8,8,6,4, 4,6,8,8,8,8,6,4, 3,4,6,6,6,6,4,3, 2,3,4,4,4,4,3,2; public static int accessbak = arrayCopy ( access ) ; int countMoving = -1 ; int tourXpos = new int 64 ;/游歷中,X,Y都有64個(gè)位置 int tourYpos = new int 64 ; private int recordXpo
30、s ; private int recordYpos ; private int recordCount = - 1 ; private boolean success = false; MyPanel myPanel ;/聲明 MyPanel的一個(gè)對象 public void tour ( int xpos ,int ypos )/成員函數(shù)/ int x,y; countMoving + ; /如果64個(gè)格子都被走過,則返回 if (countMoving = 63 ) tourXpos countMoving = xpos ; tourYpos countMoving = ypos ; s
31、uccess = true ; countMoving - ; return ; AccessibleSquares nextSquare = new AccessibleSquares( xpos, ypos ); /初試化 AccessibleSquares對象,給nextSquare分配內(nèi)存 while (nextSquare.hasMoreAccessible() /利用AccessibleSquares()對象調(diào)用hasMoreAccessible()成員函數(shù) / 開始移動 nextSquare.domoving();/調(diào)用 nextSquare.domoving()函數(shù) /把這一步
32、記錄下來 tourXpos countMoving = xpos ; tourYpos countMoving = ypos ; / 嘗試下一步的移動 nextSquare.nextAccessible(); tour ( nextSquare.getXpos() , nextSquare.getYpos() ); /如果64個(gè)格子都被走過,則返回 if ( success ) countMoving - ; return ; /如果失敗,則從起始位置從新開始 nextSquare.undomoving(); countMoving - ; /游歷方法結(jié)束 /定義棋盤行和列 /先定義一行棋盤
33、public static int arrayCopy ( int array1 )/定義一個(gè)整形數(shù)組arrayCopy intarray2 = new int array1.length; for ( int row = 0 ; row array1.length ; row + ) array2 row = array1 row ; ; return array2; /復(fù)制數(shù)組,即定義出棋盤列 public static int arrayCopy ( int array1 ) int array2 = new int array1.lengtharray10.length; for (
34、int row = 0 ; row array1.length ; row + ) for ( int column = 0 ; column array10.length ; column + ) array2 row column = array1 row column ; ; ; return array2; /棋盤數(shù)組函數(shù)初始化 public void initialArray ( int chessBoard ) for ( int row = 0 ; row 8 ; row + ) for ( int column = 0 ; column 8 ; column + ) chess
35、Board row column = 0 ; ; ; public static void main( String args ) KnightsTour application = new KnightsTour(); application.tour( 0 , 0 ); public void init () recordCount = -1 ; recordXpos = new int 64 64 ; recordYpos = new int 64 64 ; for (int row = 0 ; row 8 ;row +) for ( int column = 0 ; column 8
36、; column + ) success = false ; countMoving = -1; access = arrayCopy ( accessbak ); tour ( row ,column ); recordCount + ; recordXpos recordCount = arrayCopy ( tourXpos ) ; recordYpos recordCount = arrayCopy ( tourYpos ) ; recordCount = 0 ; myPanel = new MyPanel( recordXpos 0 ,recordYpos 0 ) ; JPanel
37、buttonPanel = new JPanel(); JButton nextMoving = new JButton( Next Moving ); JButton nextTour = new JButton( Next Tour ); buttonPanel.add( nextTour ); buttonPanel.add( nextMoving ); getContentPane().add( buttonPanel, BorderLayout.SOUTH ); getContentPane().add( myPanel ); nextMoving.addActionListener
38、(/匿名內(nèi)部類,定義了actionPerformed函數(shù),調(diào)用showNext函數(shù)響應(yīng)Next Moving Button事件 new ActionListener() public void actionPerformed ( ActionEvent e ) myPanel.showNext() ; );/end call to addActionListener nextTour.addActionListener(/內(nèi)部類定義了actionPerformed函數(shù),響應(yīng)Next Tour Button事件 new ActionListener() public void actionPer
39、formed ( ActionEvent e ) if ( recordCount recordXpos.length - 1 ) recordCount + ; else recordCount = 0 ; myPanel.initboard ( recordXpos recordCount , recordYpos recordCount ); myPanel.repaint(); );/end call to addActionListener public void paint (Graphics g ) super.paint( g ); /end of class KnightsT
40、ourclass AccessibleSquares /騎士8個(gè)方向走L形狀所需的X坐標(biāo)和Y坐標(biāo)的變化量 private static int horizontal = 2,1,-1,-2,-2,-1,1,2; private static int vertical = -1,-2,-2,-1,1,2,2,1; private int xpos ;/騎士所處X軸的坐標(biāo) private int ypos ;/騎士所處y軸的坐標(biāo) private int accessibility ;/表示可達(dá)到數(shù) private int ownxpos ,ownypos ; private int ownAcce
41、ssibility ; private int arrayPos ; private int countAccessibility; public AccessibleSquares(int x , int y )/構(gòu)造函數(shù) int testXPos; int testYPos; xpos = new int 8 ;/騎士所處X軸的坐標(biāo) ypos = new int 8 ; accessibility = new int 8 ; arrayPos = 0 ; ownxpos = x ; ownypos = y ; ownAccessibility = KnightsTour.access x
42、y ; for (int i = 0 ; i = 0 ) & ( testXPos = 0 ) & ( testYPos 0 ) arrayPos + ; /尋找空格子結(jié)束 / 結(jié)束for循環(huán),尋找結(jié)束 countAccessibility = arrayPos ;/統(tǒng)計(jì)可達(dá)到數(shù) if (countAccessibility 0 ) sortAll(); arrayPos = -1 ; public boolean hasMoreAccessible() / arrayPos + 1 指向下一個(gè)可行的 if ( (arrayPos + 1 ) = 0) & (pos countAccessib
43、ility ) arrayPos = pos ; return this; public int getXpos() return xpos arrayPos ; public int getYpos() return ypos arrayPos ; public int getAccessibility() return accessibility arrayPos ; public int getTotalAccessible() return countAccessibility; /冒泡排序法.冒泡排序的基本概念是:依次比較相鄰的兩個(gè)數(shù),將大數(shù)放在前面,小數(shù)放在后面。 private
44、void sortAll () for ( int begin = 0 ; begin countAccessibility - 1 ; begin + ) for ( int i = begin + 1; i accessibility i ) swapAll( begin, i ); /end of if / end of inner for / end of outer for / end of sortAll /交換兩個(gè)數(shù) private void swapAll ( int i , int j ) int temp ; temp = xpos i ; xpos i = xpos j
45、; xpos j = temp; temp = ypos i ; ypos i = ypos j ; ypos j = temp; temp = accessibility i ; accessibility i = accessibility j ; accessibility j = temp; /進(jìn)行移動操作 public void domoving() for ( int i = 0 ; i countAccessibility ; i + ) KnightsTour.access xpos i yposi - ; /直到?jīng)]有路徑了 KnightsTour.access ownxpos
46、 ownypos = 0 ; /撤消移動操作 public void undomoving() for ( int i = 0 ; i countAccessibility ; i + ) KnightsTour.access xpos i yposi + ; KnightsTour.access ownxpos ownypos = ownAccessibility ; /MyPanel函數(shù)實(shí)現(xiàn)圖形化顯示結(jié)果class MyPanel extends JPanel /* * */private static final long serialVersionUID = 1L; public st
47、atic final int WHITE = 0 ;/用于顯示棋盤 public static final int BLACK = 1 ; public static final int WKNIGHT = 2 ;/用于顯示騎士 public static final int BKNIGHT = 3 ; private int chessboard; private int xrecord ; private int yrecord ; private int displayCount ; private int lastxpos ,lastypos ,nextxpos ,nextypos ;
48、 ImageIcon images ; public MyPanel() /MyPanel構(gòu)造函數(shù) initvariance(); public MyPanel( int newxrecord ,int newyrecord ) /重載構(gòu)造函數(shù) initvariance(); initboard( newxrecord , newyrecord ); public void initvariance () chessboard = new int 8 8 ; xrecord = new int 64 ; yrecord = new int 64 ; images = new ImageIcon 4 ; images 0 = new ImageI
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年方向節(jié)項(xiàng)目投資可行性研究分析報(bào)告
- 某企業(yè)節(jié)能評估報(bào)告
- 知識產(chǎn)權(quán)糾紛解決的心理分析
- 電商企業(yè)如何構(gòu)建高效的末端配送體系
- 知識經(jīng)濟(jì)時(shí)代的創(chuàng)新發(fā)展與教育模式探討
- 中國煉焦行業(yè)市場發(fā)展現(xiàn)狀及前景趨勢與投資分析研究報(bào)告(2024-2030版)
- 知識產(chǎn)權(quán)在數(shù)字經(jīng)濟(jì)中的機(jī)遇與挑戰(zhàn)
- 婦產(chǎn)科護(hù)理技術(shù)模擬題(附參考答案)
- 三江學(xué)院《攝影測量與遙感》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《媒介倫理與法規(guī)》2023-2024學(xué)年第二學(xué)期期末試卷
- 育嬰員初級培訓(xùn)
- 學(xué)校物業(yè)管理投標(biāo)書范本
- 護(hù)理教學(xué)組工作匯報(bào)
- 醫(yī)療廢物管理?xiàng)l例
- 新視野英語1學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 生活垃圾焚燒發(fā)電廠摻燒一般工業(yè)固廢和協(xié)同處置污泥項(xiàng)目環(huán)評資料環(huán)境影響
- 《祖國被屈辱的歷史》課件
- 小學(xué)教師法制培訓(xùn)課件
- 建筑與市政工程地下水控制技術(shù)規(guī)范 JGJ111-2016 培訓(xùn)
- 2024年汽車裝調(diào)工技能競賽理論考試題庫(含答案)
- TCCASC 1007-2024 甲烷氯化物生產(chǎn)企業(yè)安全風(fēng)險(xiǎn)隱患排查指南
評論
0/150
提交評論