數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-迷宮_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)論文題目迷宮學(xué)院:信息工程學(xué)院專業(yè): 信息管理與信息系統(tǒng)班級(jí):信息管理與信息系統(tǒng)本(1)班姓名:*學(xué)號(hào):指導(dǎo)教師:設(shè)計(jì)時(shí)間:課程設(shè)計(jì)任務(wù)書一、設(shè)計(jì)任務(wù)隨機(jī)生成一個(gè)迷宮圖,從迷宮中找尋出路,將迷宮的左上角作入口,右下角 作出口,尋找從入口點(diǎn)到出口點(diǎn)的一條通路,并將通路信息顯示出來(lái)。二、設(shè)計(jì)要求基本要求:(1)對(duì)系統(tǒng)進(jìn)行功能模塊分析、控制模塊分析;(2)系統(tǒng)設(shè)計(jì)要完成題目所要求的功能;(3)編程簡(jiǎn)練、可用,盡可能的使系統(tǒng)的功能更加完善和全面;(4)說(shuō)明書、流程圖清晰、美觀。創(chuàng)新要求在基本要求達(dá)到后,可進(jìn)行創(chuàng)新設(shè)計(jì),如改善算法性能、友好的人機(jī)界面。三、設(shè)計(jì)期限設(shè)計(jì)進(jìn)度及完成情況表日期

2、內(nèi)容12.12-12.14選取參考書,查閱相關(guān)文獻(xiàn)資料,完成資料收集和系 統(tǒng)分析工作12.15-12.18創(chuàng)建相關(guān)數(shù)據(jù)結(jié)構(gòu),錄入源程序12.19-12.21調(diào)試程序,并記錄調(diào)試中的問題,初步完成課程設(shè)計(jì) 論文12.23上交數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告,并回答指導(dǎo)老師提出的 相關(guān)問題刖言隨著科技的日益發(fā)展,在當(dāng)今知識(shí)爆炸的年代,計(jì)算機(jī)毫無(wú)疑問成為了人們?nèi)粘I?中不可或缺的工具,而在計(jì)算機(jī)及其應(yīng)用的各個(gè)領(lǐng)域中,都會(huì)用到各種各樣的數(shù)據(jù)結(jié)構(gòu),學(xué) 會(huì)分析研究計(jì)算機(jī)加工對(duì)象的特征,選擇合適的數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)表示,以及編制相應(yīng)的實(shí)現(xiàn) 算法,是學(xué)習(xí)計(jì)算機(jī)不可或缺的知識(shí)技能。數(shù)據(jù)結(jié)構(gòu)可以說(shuō)是編程的靈魂,它不是一門語(yǔ)言所

3、以沒有關(guān)鍵字。它只是給程序開發(fā) 人員一個(gè)開發(fā)思路而已,講的主要是已經(jīng)成熟的編程思想和算法,而且?guī)缀踹m用于所有開發(fā) 語(yǔ)言。就好像學(xué)習(xí)英語(yǔ)一樣,學(xué)習(xí)編程語(yǔ)言讓你會(huì)說(shuō)英語(yǔ),記住很多英語(yǔ)單詞,熟悉英語(yǔ)的 很多語(yǔ)法。而學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)能讓你你出很漂亮的英語(yǔ)文章。當(dāng)然,在數(shù)據(jù)結(jié)構(gòu)中迷宮是一個(gè)非常經(jīng)典的問題,許多做課程設(shè)計(jì)的學(xué)生都可能選擇 迷宮這一課題。解決迷宮有很多種方法,在我的設(shè)計(jì)中我采用的是遞歸法,本方法在數(shù)據(jù)結(jié) 構(gòu)中運(yùn)用的還是比較多的,當(dāng)然還有回溯法運(yùn)用的也比較普遍。至于其他的方法一般就不常 見了,因?yàn)樵趯W(xué)生熟悉和能夠運(yùn)用的方法中,這兩種方法是運(yùn)用廣泛的,在許多高校,老師 提倡的和教導(dǎo)的最基本的也是這兩

4、種方法。迷宮在數(shù)據(jù)結(jié)構(gòu)中是比較簡(jiǎn)單的,容易讓學(xué)生入 門和對(duì)計(jì)算機(jī)產(chǎn)生興趣,更容易讓學(xué)生樹立起信心。數(shù)據(jù)結(jié)構(gòu)是一種工具,在日常生活中運(yùn) 用的比較多,學(xué)好數(shù)據(jù)結(jié)構(gòu)可以提高以后再計(jì)算機(jī)方面編程的能力和實(shí)踐能力。本論文包括五個(gè)章節(jié),包括需求分析、總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼與調(diào)試、總結(jié)。在整個(gè)課程設(shè)計(jì)的實(shí)踐中,我們小組成員團(tuán)結(jié)協(xié)作,共同交流,一起努力解決遇到的 問題,學(xué)習(xí)到編寫和調(diào)試代碼要細(xì)心、耐心,才能最終完成整個(gè)課程設(shè)計(jì)。同時(shí),在實(shí)踐中, 得到了老師許多寶貴意見,其他同學(xué)也提出了許多有益的建議,謹(jǐn)此一并致以誠(chéng)摯的謝意。由于個(gè)人水平有限,論文中有些許不當(dāng)之處,望老師批評(píng)指正。目錄 TOC o 1-5 h

5、 z 第1章需求分析41.1性能需求與功能需求41.2課題設(shè)計(jì)的目的與意義4第2章總體設(shè)計(jì)62.1課題設(shè)計(jì)的總體思路62.2整個(gè)程序的流程圖72.3課題設(shè)計(jì)界面8第3章詳細(xì)設(shè)計(jì)9 HYPERLINK l bookmark47 o Current Document main()主函數(shù)9 HYPERLINK l bookmark51 o Current Document Init ()初始化函數(shù)9 HYPERLINK l bookmark55 o Current Document MapRand()迷宮生成函數(shù) 9 HYPERLINK l bookmark59 o Current Document

6、 PrMap()迷宮顯示函數(shù) 9 HYPERLINK l bookmark63 o Current Document FindWay()系統(tǒng)自動(dòng)探索10 HYPERLINK l bookmark67 o Current Document PeopleFind()人工探索10 HYPERLINK l bookmark71 o Current Document Result()結(jié)果處理函數(shù)11 HYPERLINK l bookmark75 o Current Document Close()圖形關(guān)閉函數(shù)11第4章編碼與調(diào)試12第5章總結(jié)20附錄21參考文獻(xiàn)第1章需求分析1.1性能需求與功能需求性能

7、需求:隨著社會(huì)經(jīng)濟(jì)和人們物質(zhì)生活的不斷提高,人們對(duì)精神生活的需求也越來(lái) 越高,在現(xiàn)今社會(huì)里,人們對(duì)諸如智商、情商等的重視無(wú)疑反映了對(duì)精神 生活的態(tài)度。當(dāng)然具體到我們每個(gè)人來(lái)說(shuō),想必大多數(shù)人小時(shí)候都玩過魔 方、迷宮吧。作為這種智力游戲,人們是百玩不厭的。正是鑒于這種需求, 本設(shè)計(jì)運(yùn)用計(jì)算機(jī)語(yǔ)言及其算法,將人的意志賦予機(jī)器實(shí)現(xiàn),使人們不必 在陷于枯燥的重復(fù)勞動(dòng),從而將更多的精力投入到未知領(lǐng)域的探索上。功能需求:本設(shè)計(jì)的關(guān)鍵在于將人的思想自動(dòng)化,有所編軟件的自動(dòng)的搜索可行路徑。 因此,軟件必須擁有自動(dòng)搜索并記錄可行路徑的功能,除此之外,軟件還應(yīng) 設(shè)置人機(jī)交互接口,以便能夠人為地建立迷宮圖;當(dāng)然對(duì)于迷

8、宮問題還有很 多需要考慮的地方,比如由用戶自己探索可行路徑,但由于本設(shè)計(jì)側(cè)重于迷 宮的求解算法設(shè)計(jì),并非以游戲的形式為初衷,一定有不全之處,望讀者見 諒。1.2課題設(shè)計(jì)的目的與意義一般認(rèn)為,一個(gè)數(shù)據(jù)結(jié)構(gòu)是由數(shù)據(jù)元素依據(jù)某種邏輯聯(lián)系組織起來(lái)的。對(duì)數(shù)據(jù)元 素間邏輯關(guān)系的描述稱為數(shù)據(jù)的邏輯結(jié)構(gòu);數(shù)據(jù)必須在計(jì)算機(jī)內(nèi)存儲(chǔ),數(shù)據(jù)的存儲(chǔ)結(jié) 構(gòu)是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)形式,是其在計(jì)算機(jī)內(nèi)的表示;此外討論一個(gè)數(shù)據(jù)結(jié)構(gòu)必須同時(shí) 討論在該類數(shù)據(jù)上執(zhí)行的運(yùn)算才有意義。在許多類型的程序的設(shè)計(jì)中,數(shù)據(jù)結(jié)構(gòu)的選擇是一個(gè)基本的設(shè)計(jì)考慮因素。許多 大型系統(tǒng)的構(gòu)造經(jīng)驗(yàn)表明,系統(tǒng)實(shí)現(xiàn)的困難程度和系統(tǒng)構(gòu)造的質(zhì)量都嚴(yán)重的依賴于是 否選擇了最優(yōu)

9、的數(shù)據(jù)結(jié)構(gòu)。許多時(shí)候,確定了數(shù)據(jù)結(jié)構(gòu)后,算法就容易得到了。有些 時(shí)候事情也會(huì)反過來(lái),我們根據(jù)特定算法來(lái)選擇數(shù)據(jù)結(jié)構(gòu)與之適應(yīng)。不論哪種情況,選擇合適的數(shù)據(jù)結(jié)構(gòu)都是非常重要的。而進(jìn)行課程設(shè)計(jì)實(shí)踐操作能夠使我們更好地鞏固 課本知識(shí),對(duì)課本知識(shí)有更深一步的了解,了解迷宮求解相關(guān)方面的知識(shí),能小組合作完成 較為簡(jiǎn)單的程序的設(shè)計(jì)并獨(dú)立完成課程設(shè)計(jì)的論文,通過課程設(shè)計(jì),達(dá)到增強(qiáng)鞏固數(shù)據(jù)結(jié)構(gòu) 知識(shí)的目的,使知識(shí)更加全面化,系統(tǒng)化。選擇了數(shù)據(jù)結(jié)構(gòu),算法也隨之確定,是數(shù)據(jù)而不是算法是系統(tǒng)構(gòu)造的關(guān)鍵因素。這種看法導(dǎo)致了許多種軟件設(shè)計(jì)方法和程序設(shè)計(jì)語(yǔ)言的出現(xiàn),面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言就是其中之一。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)是學(xué)習(xí)

10、數(shù)據(jù)結(jié)構(gòu)課程的一個(gè)重要的環(huán)節(jié),能鞏固和加深課堂教學(xué)中所 學(xué)習(xí)到的內(nèi)容,提高學(xué)生學(xué)習(xí)的實(shí)踐和實(shí)際工作能力,為以后的學(xué)習(xí)奠定好的基礎(chǔ)和學(xué)習(xí)態(tài) 度及方法。通過課程設(shè)計(jì),使學(xué)生加強(qiáng)團(tuán)隊(duì)合作的意識(shí),并且能夠綜合運(yùn)用課本知識(shí)來(lái)解決 實(shí)際問題,加強(qiáng)分析問題、解決問題和動(dòng)手的能力。第2章總體設(shè)計(jì)2.1課題設(shè)計(jì)的總體思路(1)程序的設(shè)計(jì),首先要考慮迷宮的表示,這是一個(gè)二維關(guān)系圖,典型的存儲(chǔ)方 式是選擇二維數(shù)組,數(shù)據(jù)元素的值只有兩種狀態(tài),所以取值為0或1,其中0 表示通路,1表示墻壁即此路不通,這里將二維數(shù)組取名為map,將最外面一 圈設(shè)為墻壁,作為一個(gè)封閉圖形,只留下入口點(diǎn)和出口點(diǎn)為通路。(2)圖形的顯示就可以

11、根據(jù)數(shù)組元素的值來(lái)確定,如果是人工探索,則根據(jù)按鍵 來(lái)確定探索物的位置坐標(biāo),利用循環(huán)語(yǔ)句即可實(shí)現(xiàn);如果是人工探索,則根 據(jù)按鍵來(lái)確定探索物的位置坐標(biāo),利用循環(huán)語(yǔ)句即可實(shí)現(xiàn);如果是系統(tǒng)自動(dòng) 檢索,并在8個(gè)方向檢索,則問題相對(duì)復(fù)雜,采用遞歸的方法實(shí)現(xiàn)。(3)迷宮一作為線性結(jié)構(gòu)的典型應(yīng)用,大多數(shù)是用遞歸方法實(shí)現(xiàn),用0代表通路, 1代表此路不通。本程序采用了一個(gè)美觀逼真的迷宮圖,而且是隨機(jī)生成的, 迷宮的大小為N*N,N預(yù)定義為常數(shù),修改N的數(shù)值,可以改變迷宮的大?。ㄖ?要不超過屏幕顯示范圍),用白色表示可走的路,藍(lán)色表示此路不可以通過, 并畫出整個(gè)程序的流程圖,讓整個(gè)程序的設(shè)計(jì)思路一目了然。(4)若

12、設(shè)定的迷宮存在通路,如果采用的是系統(tǒng)自動(dòng)探索的運(yùn)行方式,則會(huì)顯示 出所走過的路徑;如果采用的是人工探索方式,沒有記錄所走過的路徑,只 顯示找的通路信息;(5)程序執(zhí)行的命令為:生成迷宮、求解迷宮、輸出迷宮的解。2.2整個(gè)程序的流程圖u開始二預(yù)定義主函數(shù)MAIN()定義二維數(shù)組Mapnn清除clrscr輸出字符串并初始化.隨機(jī)生成迷宮(Mandrand)手動(dòng)搜索PopleFindO |自動(dòng)搜索FingWay()輸出結(jié)果Result()關(guān)閉圖像close()圖2-1整個(gè)程序的流程圖2.3課題設(shè)計(jì)界面圖2-2人工探索通路圖系統(tǒng)運(yùn)行首先出現(xiàn)提示字符串please select hand (1) els

13、e auto”,詢問是選擇人工 探索還是系統(tǒng)自動(dòng)探索,當(dāng)用戶出現(xiàn)字符1按回車鍵后出現(xiàn)一個(gè)迷宮圖,紅色矩形塊(表示 探索物)出現(xiàn)在左上角,這是可以按代表8個(gè)方向的字符選擇通路,遇到墻壁不能通行,按 回車鍵結(jié)束探索,如果這是探索物移動(dòng)到右下角出口,則顯示找到通路信息,否則顯示沒有 找到通路信息,在提示信息后,如果輸入的字符不是1,則系統(tǒng)自動(dòng)查找通路,如果沒有 找到通路,則顯示沒有找到通路信息,如果找到通路,則用紅色標(biāo)記走過的路徑第3章詳細(xì)設(shè)計(jì)main ()主函數(shù)首先,確定是進(jìn)行人工探索還是系統(tǒng)自動(dòng)探索,通過輸入字符來(lái)選定,選定之后調(diào)用圖 形初始化函數(shù),緊接著調(diào)用迷宮生成函數(shù)及迷宮顯示函數(shù),然后根據(jù)

14、輸入的字符調(diào)用人 工探索函數(shù)或自動(dòng)探索函數(shù)。探索完畢進(jìn)行處理,最后關(guān)閉圖形系統(tǒng),程序結(jié)束。if(ch=1)PeopleFind(map);/人工搜索elseFindWay(map,1,1);/系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開始搜索Init ()初始化函數(shù)由于迷宮圖是在圖形方式顯示的,所以要進(jìn)行圖形初始化工作。MapRand ()迷宮生成函數(shù)用數(shù)組map表示一個(gè)迷宮,要隨機(jī)生成迷宮,數(shù)組元素的值利用隨機(jī)函數(shù)生成0或1 的數(shù)。將最外面一圈設(shè)為墻壁即不可通過,作為一個(gè)封閉圖形,只留下入口點(diǎn)和出口點(diǎn) 為通路。for(i=0;iN;i+)for(j=0;jN;j+)if(i=0|i=N-1|j=0|j=N-

15、1)/最 外面一圈為墻壁map1j=1;elseif(i=1&j=1|i=N-2|&j=N-2)/出發(fā)點(diǎn)與終點(diǎn)表示為可走的 mapij=0;elsemapij=random(2);/其他的隨機(jī)生成0或1PrMap ()迷宮顯示函數(shù)根據(jù)數(shù)組map的值輸出迷宮圖,利用函數(shù)setfillstyle()設(shè)置圖形實(shí)體填充樣式, bar ()函數(shù)輸出矩形塊,每個(gè)塊的大小為12*12單位,塊與塊間距為3,如果數(shù)組元 素值為0,則填充為白色,值為1顯示填充為藍(lán)色,一個(gè)數(shù)組元素對(duì)應(yīng)一個(gè)矩形塊。數(shù) 組元素的下標(biāo)為矩形塊的中心坐標(biāo),利用兩重循環(huán)語(yǔ)句可以完成迷宮圖的顯示。FindWay ()系統(tǒng)自動(dòng)探索從下標(biāo)(1,1

16、)開始探索,依次按照右下、下、右、上、右上、左下、左、左上的順 序前進(jìn),若該方向上的值為0,則前進(jìn)一步,然后作相應(yīng)的標(biāo)記,表示該探索物在某一 方向探索過,而在另一個(gè)方向上探索,若8個(gè)方向均已探索過,則不能再前進(jìn),需要沿 著原來(lái)的路徑回溯一步,然后重復(fù)上述過程直到出口。判斷8個(gè)方向的順序前三個(gè)是判斷右下、下、右、這樣的話可以以最短的路徑找到迷宮 出口。因?yàn)橐厮?,所以?shí)現(xiàn)的方法可以有兩種;一種是非遞歸型方法,設(shè)置一個(gè)堆棧,記錄 所有走過的路徑,前進(jìn)時(shí)入棧,回溯時(shí)可以出棧;另一種是遞歸方法,不必設(shè)堆棧,但 遞歸的方法其實(shí)就是棧的應(yīng)用,只不過棧由系統(tǒng)安排,對(duì)用戶是不可見的。本程序采用 了后者實(shí)現(xiàn)。在

17、遞歸過程中凡是已經(jīng)走過的路,做標(biāo)記為1,防止來(lái)回徘徊而最終無(wú)法找到出口。由 于走過的路數(shù)組元素要改變?yōu)?,為了 8個(gè)方向的遞歸和回溯,所以做了一個(gè)函數(shù) WayCopy()把舊迷宮數(shù)組拷貝到新迷宮數(shù)組。同時(shí)設(shè)計(jì)一個(gè)全局變量yes,如果到了 出口,yes賦值為1,探索結(jié)束。為了顯示所走過的路徑,把具體的路線保存在二維數(shù) 組way中。Wayn0代表所走路徑的行下標(biāo),wayn1代表所走路徑的列下標(biāo),其中 的n代表走的步數(shù),根據(jù)way數(shù)組將走過的路徑用紅色顯示。PeopleFind ()人工探索首先輸出迷宮圖以及人工控制操作圖示。紅色探索物出現(xiàn)在左上角,采用人工控制8 個(gè)方向的移動(dòng),由于8個(gè)方向,用光標(biāo)

18、鍵只能控制4個(gè)方向,為了統(tǒng)一,采用了臨近的 8個(gè)字符q、w、e、a、d、z、x、c代表8個(gè)方向,按了字符后,對(duì)應(yīng)方向不是墻壁, 可以將紅色探索無(wú)移動(dòng)到相應(yīng)位置,按回車鍵表示人工操作,如果此時(shí)map數(shù)組元素的 坐標(biāo)是目標(biāo)出口,則yes賦值為1,表示探索成功,否則賦值為0。由于探索物在不停地移動(dòng),要在新位置顯示,并將走過的路恢復(fù)為白色通路,可以調(diào)用 函數(shù)DrawPeople(&x,&y,n)完成,參數(shù)x和y代表所走過的行坐標(biāo)和列坐標(biāo),n代表所選的方向,根據(jù)n的值將x和y進(jìn)行相應(yīng)的變化。void PeopleFind(int (*map)N)int x,y;char c=0;/接收按鍵的變量x=y=

19、1;/人工查找的初始位置setcolor(11);/設(shè)置當(dāng)前畫線顏色line(500,200,550,200);/從當(dāng)前點(diǎn)開始用增量(x,y)畫一直線(int x1,int y1,int x2,int y2)outtextxy(570,197,d);/ 繪制并填充一個(gè)扇形(int x,int y,char far*textstring)Result ()結(jié)果處理函數(shù)因?yàn)椴捎昧藘煞N探索方式,但最終結(jié)果是找到和沒找到兩種情況,所以在程序中設(shè)計(jì)了 全局變量yes,根據(jù)yes的值進(jìn)行處理,如果yes為0調(diào)用函數(shù)NotFind(),顯示沒找 到通路信息,否則調(diào)用函數(shù)Find()。如果是系統(tǒng)自動(dòng)探索,F(xiàn)i

20、nd()會(huì)顯示出所走過的 路徑,如果是人工探索,沒有記錄所走過的路徑,只顯示找到通路信息。if(yes)/如果找到Find();else/沒找到路NotFind();Close()圖形關(guān)閉函數(shù)調(diào)用函數(shù)closegraph()關(guān)閉圖形函數(shù)系統(tǒng),程序結(jié)束。第4章編碼與調(diào)試#include/圖形函數(shù)#include/其它函數(shù)#include/此行為文件包含,告訴系統(tǒng)必須包含文件stdio.h,此文件為輸入和 輸出提供支持。#include/字符屏幕操作函數(shù)#include/接口函數(shù)#define N 20 /迷宮的大小可以改變int oldmapNN;/遞歸用的數(shù)組,用全局變量節(jié)約時(shí)間int yes

21、=0;/yes是判斷是否找到路的標(biāo)志,1找到,0沒找到int way1002,wayn=0;/way數(shù)組是顯示路線用的,wayn是統(tǒng)計(jì)走了幾個(gè)格子void Init(void);/圖形初始化void Close(void);/圖形關(guān)閉void DrawPeople(int *x,int *y,int n);/畫人工探索物圖void PeopleFind(int (*x)N);/A 工探索void WayCopy(int (*x)N,int(*y)N);/為了 8個(gè)方向的遞歸,把舊迷宮圖拷貝給新數(shù) 組int FindWay(int (*x)N,int i,int j);/ 自動(dòng)搜索函數(shù)void

22、MapRand(int (*x)N);/隨機(jī)生成迷宮函數(shù)void PrMap(int (*x)N);/輸出迷宮圖函數(shù)void Result(void);/輸出結(jié)果處理void Find(void);/成功處理void NotFind(void);/失敗處理/主函數(shù)void main(void)int mapNN;/迷宮數(shù)組char ch;clrscr();/清除正文模式窗口printf(n please select hand(1) else auton);/選擇搜索方式 scanf(%c”,&ch);Init();/圖形初始化MapRand(map);/生成迷宮PrMap(map);/顯示迷

23、宮圖if(ch=1)PeopleFind(map);/人工搜索elseFindWay(map,1,1);/系統(tǒng)自動(dòng)從下標(biāo)1,1的地方開始搜索Result();/輸出結(jié)果Close();圖形初始化void Init(void)int gd=DETECT,gm;initgraph(&gd,&gm,c:tc);畫人工控制圖void DrawPeople(int *x,int *y,int n)如果將以下兩句注釋掉,則顯示人工走過的路徑setfillstyle(SOLID_FILL,WHITE);/設(shè)置白色實(shí)體填充樣式(int patttern,int color)bar(100+(*y)*15-6,

24、50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/畫一個(gè)二維條形 圖(int left,int top,int rigth,int bottom)恢復(fù)原通路switch(n)/判斷x和y的變化,8個(gè)方向的變化case 1:(*x)-;break;/上case 2:(*x)-;(*y)+;break;/右上case 3:(*y)+;break;/右case 4:(*x)+;(*y)+;break;/右下case 5:(*x)+;break;/下case 6:(*x)+;(*y)-;break;/左下case 7:(*y)-;break;/左case 8:(*x)

25、-;(*y)-;break;/左上setfillstyle(SOLID_FILE,RED);/新 位置顯示探索物bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/人工手動(dòng)查找void PeopleFind(int (*map)N)int x,y;char c=0;/接收按鍵的變量x=y=1;/人工查找的初始位置setcolor(11);/設(shè)置當(dāng)前畫線顏色line(500,200,550,200);/從當(dāng)前點(diǎn)開始用增量(x,y)畫一直線(int x1,int y1,int x2,int y2)outtextxy(570,197

26、,d);/繪制并填充一個(gè)扇形(int x,int y,char far*textstring) line(500,200,450,200);outtextxy(430,197,a”);line(500,200,500,150);outtextxy(497,130,w”);line(500,200,500,250);outtextxy(497,270,x”);line(500,200,450,150);outtextxy(445,130,q”);line(500,200,550,150);outtextxy(550,130,e”);line(500,200,450,250);outtextxy(

27、445,270,z”);line(500,200,550,250);outtextxy(550,270,c)/以上是畫8個(gè)方向的控制介紹setcolor(YELLOW);/設(shè)置當(dāng)前畫線顏色(int color)outtextxy(420,290,Press Enter to end);/按 回車鍵結(jié)束 setfillstyle(SOLID_FILL,RED);/設(shè)置填充模式和顏色 bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/A 口位置顯示 while(c!=13)/如果按下的不是回車鍵 c=getch();/接收字符后開始各個(gè)方向的探索if(

28、c=w&mapx-1y!=1)DrawPeople(&x,&y,1);/上elseif(c=e&mapx-1y+1!=1)DrawPeople(&x,&y,2);/右上elseif(c=d&mapxy+1!=1)DrawPeople(&x,&y,3);/右elseif(c=c&mapx+1y+1!=1)DrawPeople(&x,&y,4);/右下 elseif(c=x&mapx+1y!=1)DrawPeople(&x,&y,5);/下elseif(c=z&mapx+1y-1!=1)DrawPeople(&x,&y,6);/左下 elseif(c=a&mapxy-1!=1)DrawPeople

29、(&x,&y,7);/左else if(c=q&mapx-y-1!=1)DrawPeople(&x,&y,8);/左上setfillstyle(SOLID_FILL,WHITE);/消去紅色探索物,恢復(fù)原迷宮圖bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x=N-2&y=N-2)/人工控制找成功的話yes=1;/如果成功標(biāo)志為1/拷貝迷宮數(shù)組void WayCopy(int(*oldmap)N,int(*map)N)int i,j;for(i=0;iN;i+)for(j=0;jN;j+)oldmap(ij=mapij;遞歸找路int Fin

30、dWay(int (*map)N,int i,int j)if(i=N-2&j=N-2)/ 走到路口yes=1;/標(biāo)志為1,表示成功return;mapij=1;/走過的地方變?yōu)?WayCopy(oldmap,map);/拷貝迷宮圖if(oldmapi+1j+1=0&!yes)/判 斷右下方是否可走FindWay(oldmap,i+1,j+1);if(yes)/如果到達(dá)出口了,再把值賦給顯示路線的way數(shù)組,也正是這個(gè)原因, 所以具體路線是從最后開始保存waywayn0=i;waywayn+1=jreturn;WayCopy(oldmap,map);if(oldmapi+1j=0&!yes)/

31、判斷下方是否可以走,如果標(biāo)志yes已經(jīng)是1,則不 用找下去了艱 n RKn枳 TBDMeM -IHOWDMeM)(s 凱).n-(I+苔delnpIOMDMPUIH) 艱 mtlKn枳 kBDMeM -IHOWDMeM)(s 凱).n-(二+1delnplo)源Mpu 艱RKn枳KWB/ (S 凱 一 WOHI二 I+二 delnplo) a -(delndelnplo) AdoMcdM(-UJnq-CDJ 二AI+U 源MAm -IHOWDMAm(s 凱).ji-(I+二Idelnplo)源 Mpu) 艱壬KKn枳 T*B/、(s 凱 一 goHH1+二 I工 delnplo) a-(del

32、ndelnplo) AdoMcdM( (-UWCDJ 二AI+U 源MAm -IHOWDMAm)(芝)a-(二Idelnplo)源MpuFindWay(oldmap,i+1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapij-1=0&!yes)/判 斷左方是否可走FindWay(oldmap,i,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j-1=0&!yes)/判 斷左上方是否可走FindWay

33、(oldmap,i-1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;return;開始的隨機(jī)迷宮圖void MapRand(int (*map)N)int i,j;cleardevice();/清除圖形屏幕randomize();/隨機(jī)數(shù)發(fā)生器for(i=0;iN;i+)for(j=0;jN;j+) if(i=0|i=N-1|j=0|j=N-1)/最 外面一圈為墻壁 map1j=1;elseif(i=1&j=1|i=N-2|&j=N-2)/出發(fā)點(diǎn)與終點(diǎn)表示為可走的 mapij=0;elsemapij=random(2);/其他的隨機(jī)生成0或1輸出迷宮圖void PrMap(int (*map)N)int i,j;for(i=0;iN;i+)for(j=0;j=0;i-)bar(100+wayi1*15-6,50+wayi0*15-6,100+wayi1*15+6,50+wayi0*15 +6);sleep(1);/控制時(shí)間顯示bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/在目標(biāo)點(diǎn)標(biāo) 紅色setcolor(GREEN);settexts

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論