《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲_第1頁
《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲_第2頁
《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲_第3頁
《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲_第4頁
《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、信 息 工 程 學(xué) 院課程設(shè)計(jì)報(bào)告 課程名稱 數(shù)據(jù)結(jié)構(gòu) 課題名稱 走迷宮游戲 專業(yè) 班級(jí) 學(xué)號(hào) 姓名 聯(lián)系方式 指導(dǎo)教師 2015 年 12 月 27 日目 錄1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)任務(wù)書1.1、題目1.2、要求2、總體設(shè)計(jì)2.1、設(shè)計(jì)思路及總體組成框架2.2、操作流程圖3、詳細(xì)設(shè)計(jì)3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)的說明3.2、函數(shù)功能模塊說明3.3、各函數(shù)的調(diào)用關(guān)系4、調(diào)試與測(cè)試:4.1、調(diào)試方法與步驟:4.2、測(cè)試結(jié)果的分析與討論:4.3、測(cè)試過程中遇到的主要問題及采取的解決措施:6、源程序清單7、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)8、參考文獻(xiàn)1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)任務(wù)書1.1題目程序開始運(yùn)行時(shí)顯示

2、一個(gè)迷宮地圖,迷宮中央有一只老鼠,迷宮的右下方有一個(gè)糧倉。游戲的任務(wù)是使用鍵盤上的方向鍵操縱老鼠在規(guī)定的時(shí)間內(nèi)走到糧倉處。1.2、要求1) 老鼠形象可辨認(rèn),可用鍵盤操縱老鼠上下左右移動(dòng);2) 迷宮的墻足夠結(jié)實(shí),老鼠不能穿墻而過;3) 正確檢測(cè)結(jié)果,若老鼠在規(guī)定時(shí)間內(nèi)走到糧倉處,提示成功,否則提示失敗;4) 添加編輯迷宮功能,可修改當(dāng)前迷宮,修改內(nèi)容:墻變路、路變墻;5) 找出走出迷宮的所有路徑。利用序列化功能實(shí)現(xiàn)迷宮地圖文件的存盤和讀出等功能 2、總體設(shè)計(jì)2.1、設(shè)計(jì)思路及總體組成框架1、思路(1).利用mfc可以把迷宮地圖以及老鼠形象可變的導(dǎo)出來。 (2).需要有墻有路,通過把迷宮

3、地圖劃分成一個(gè)一個(gè)小方塊,通過一個(gè)數(shù)組的值來判斷是墻是路。(1表示墻0表示路) (3).利用棧,來存入當(dāng)前位置,然后判斷下一位置,是否有路,存入棧中或出棧。 (4).把每個(gè)數(shù)組元素對(duì)應(yīng)一個(gè)按鈕根據(jù)點(diǎn)擊按鈕,改變數(shù)組的值從而改變墻和路的轉(zhuǎn)化。 (5).鍵盤接受字符,根據(jù)字符調(diào)用不同的圖片,達(dá)到老鼠超前走的效果。2、數(shù)據(jù)結(jié)構(gòu)本程序運(yùn)用的邏輯結(jié)構(gòu)是線性和存儲(chǔ)結(jié)構(gòu)為順序。之所以采用本結(jié)構(gòu)是因?yàn)?,迷宮主要用到棧來儲(chǔ)存當(dāng)前位置,和判斷下一位置,來入棧。抽象數(shù)據(jù)類型線性表的定義如下:ADT Stack 數(shù)據(jù)對(duì)象:D=ai| ai ElemSet,i=1,2,3,n,n0數(shù)據(jù)關(guān)系:R1=<ai-1,ai

4、>| ai-1,ai D,i=1,2,3,,n基本操作:Initstack(&s)操作結(jié)果:構(gòu)造一個(gè)空棧s。Stackempty(s)初始條件:棧s已經(jīng)存在。操作結(jié)果:將s清為空棧。Push(&s,e)初始條件:棧s已經(jīng)存在。操作結(jié)果:插入元素e為新的棧頂元素。Pop(&s,&e)初始條件:棧s已經(jīng)存在,且非空。操作結(jié)果:刪除s的棧頂元素,并用e返回其值。 ADT Stack3、根據(jù)課程設(shè)計(jì)題目的功能要求,總體概要的組成框圖如下:開始保存地圖操作界面載入地圖地圖的繪制迷宮自動(dòng)尋路游戲時(shí)間設(shè)置小老鼠鍵盤操音效設(shè)置結(jié)束用戶登陸界面2.2、操作流程圖1、鍵盤操作

5、流程:開始NY按下鍵盤按方向鍵up方向鍵down方向鍵left方向鍵rightif(wallij=0|wallij=2)判斷是否到達(dá)糧倉根據(jù)對(duì)應(yīng)的操作老鼠進(jìn)行相應(yīng)的修改x,yNN結(jié)束YY2、模塊流程圖:開始模塊初始化加載迷宮地圖N判斷鍵是否按下N啟動(dòng)計(jì)時(shí)Y是否撞墻老鼠移動(dòng)NY時(shí)間為零到達(dá)終點(diǎn)N停止移動(dòng)YY游戲結(jié)束面向?qū)ο蠖敲嫦蚬こ痰某绦蛟O(shè)計(jì),事件和判斷都具有同時(shí)性和并發(fā)性。3、游戲界面顯示新建登陸dlg類對(duì)象,并且顯示出來初始化迷宮數(shù)組根據(jù)對(duì)應(yīng)的迷宮數(shù)組初始化迷宮地圖,同時(shí)初始化背景音樂,顯示當(dāng)前設(shè)置時(shí)間和剩余時(shí)間。點(diǎn)擊開始按鈕3、詳細(xì)設(shè)計(jì)3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)的說明數(shù)據(jù)類

6、型:結(jié)構(gòu)體,整形數(shù)據(jù) 輸入:按照窗口、菜單提示按鼠標(biāo)左鍵 移動(dòng)老鼠位置,按鍵盤的上、下、左、右鍵 輸出:可視化迷宮3.2、函數(shù)功能模塊說明(1) 開始游戲 void CMainFrame:OnStart():開始游戲。void CLabyrinthView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):小老鼠鍵盤操。第一個(gè)參數(shù)表示哪個(gè)按鍵,接受上、下、左、右字符,判斷調(diào)用哪個(gè)小老鼠圖片,最后用腳印圖片覆蓋老鼠圖片,達(dá)到朝前走,留下腳印的效果。(2)重新開始void CMainFrame:OnSysmap():系統(tǒng)地圖。void CLabyri

7、nthView:OnSelfmap()、void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point):繪制地圖函 數(shù)。達(dá)到墻變路、路變墻的目的。(3)保存圖片void CMainFrame:OnSave():保存地圖。(4)載入圖片void CMainFrame:OnOpen():載入地圖。BOOL CLabyrinthView:OnEraseBkgnd(CDC* pDC):設(shè)置歡迎畫面,載入圖片。(5)自繪地圖void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point):

8、墻變路,路變墻(6)自動(dòng)尋路void CLabyrinthView:OnAuto():為自動(dòng)尋路函數(shù)。其重要調(diào)用Seqstack * CSkfction:init_Seqstack()、int CSkfction:Empty_Seqstack(Seqstack *s)、int CSkfction:Push_Seqstack(Seqstack *s,DataType x)、int CSkfction:Pop_Seqstack(Seqstack *s,DataType *x)函數(shù)。(7)設(shè)置時(shí)間int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruc

9、t):到達(dá)在在狀態(tài)欄中顯示時(shí)間,調(diào)用了系統(tǒng)的函數(shù)SetTimer(1,1000,NULL); 第一個(gè)參數(shù)為對(duì)應(yīng)時(shí)器的代號(hào)。在一個(gè)程序中,可能有多個(gè)SetTimer,在Ontime響應(yīng)時(shí),可以根據(jù)第一個(gè)參數(shù)來確定是哪一個(gè)記時(shí)器所引起的事件。第二個(gè)參數(shù)用于設(shè)置時(shí)間。 第三個(gè)參數(shù)為一個(gè)回調(diào)函數(shù)的指針,用NULL的話,系統(tǒng)會(huì)把SetTimer產(chǎn)生的消息加入消息隊(duì)列中。調(diào)用了一下三個(gè)函數(shù)信息,來顯示時(shí)間。m_wndStatusBar.CommandToIndex(IDS_LASTTIME);/按規(guī)定寬度顯示m_wndStatusBar.SetPaneInfo(0,IDS_LASTTIME,SBPS_PO

10、POUT,150);/剩余時(shí)間凸出來m_wndStatusBar.SetPaneText(1,str2);/在窗格中顯示文本信息。void CMainFrame:OnTimer(UINT nIDEvent):根據(jù)時(shí)間判斷老鼠是否餓死。void CMainFrame:OnSettime():設(shè)置時(shí)間。(8)音效設(shè)置void CMainFrame:OnMusicOn():音樂來。void CMainFrame:OnMusicOff():音樂關(guān)。(9)游戲退出void CMainFrame:OnAppExit():void CMainFrame:OnClose():退出游戲,彈出對(duì)話框。(10)框架

11、BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs):設(shè)置窗口信息。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct):在狀態(tài)欄顯示時(shí)間信息。3.3、各函數(shù)的調(diào)用關(guān)系void CLabyrinthView:OnAuto()Seqstack * CSkfction:init_Seqstack()int CSkfction:Empty_Seqstack(Seqstack *s)int CSkfction:Push_Seqstack(Seqstack *s,DataType x)Int C

12、Skfction:Pop_Seqstack(Seqstack *s,DataType *x)程序界面:開始保存地圖操作界面載入地圖地圖的繪制迷宮自動(dòng)尋路游戲時(shí)間設(shè)置小老鼠鍵盤操音效設(shè)置結(jié)束用戶登陸界面4、調(diào)試與測(cè)試:4.1、調(diào)試方法與步驟:內(nèi)容包括:調(diào)試過程中遇到的問題是如何解決的以及對(duì)設(shè)計(jì)與實(shí)現(xiàn)的回顧討論和分析:1.實(shí)際完成的情況說明(完成的功能,支持的數(shù)據(jù)類型等);基本功能都已經(jīng)完成,而且還加了保存圖片、載入圖片、設(shè)置時(shí)間、游戲幫助等功能。2.上機(jī)過程中出現(xiàn)的問題及其解決方案; (1) 問題:每次走完迷宮,它都會(huì)保持現(xiàn)有狀態(tài),如果重新開始,要自己按重新開始,次才能開始,很麻煩。解決方案:v

13、oid CMainFrame:OnTimer(UINT nIDEvent)函數(shù)中調(diào)用void CMainFrame:OnOpen(),這樣在每次游戲結(jié)束時(shí)就可以調(diào)用這個(gè)函數(shù),載入圖片。(2)問題:通過鍵盤來如何控制對(duì)象(老鼠)的移動(dòng),我希望達(dá)到一種老鼠會(huì)動(dòng)的效果,即朝左走頭往左哦哦,朝右走,頭朝右。解決方案:導(dǎo)入一組老鼠圖片,用數(shù)組進(jìn)行控制,沒走一步判斷調(diào)用哪一組老鼠圖片。(3)問題:鍵盤控制時(shí)老是出錯(cuò)。解決方案:后來通過CSDN、博客園等IT技術(shù)社區(qū)找到了相關(guān)文章,如果你按鍵沒有反應(yīng)是因?yàn)樗涯愕南⑥D(zhuǎn)發(fā)到了其它的激活窗口的處理程序上,可以試著點(diǎn)擊窗口的空白區(qū)域,不讓任何子控件獲得焦點(diǎn)(沒有

14、任何一個(gè)控件有一個(gè)虛線的框)的時(shí)候,這個(gè)就能激活了。4.2、測(cè)試結(jié)果的分析與討論:(1)如果不按開始按鈕,會(huì)彈出一下對(duì)話框,如(圖一) (圖一)(2)游戲順利進(jìn)行,并成功。如(圖二) (圖二)(3)自動(dòng)尋路完成,如(圖三) (圖三)(4)自動(dòng)尋路完成,如(圖四)(圖四)(5)走完全部的路,如(圖五)(圖五)(6)非法輸入: 當(dāng)小老鼠上、下、左、右移動(dòng)時(shí),如果按下非以上四鍵,老鼠呆在原地不動(dòng)。對(duì)游戲和程序沒有影響。4.3、測(cè)試過程中遇到的主要問題及采取的解決措施:6、源程序清單1. 定義程序中所有用到的數(shù)據(jù)及其數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)體,類,棧 typedef struct /順序棧初始化判棧空以及出入棧i

15、nt x,y,di;DataType;typedef structDataType dataMAXSIZE;int top; Seqstack;typedef structint x;int y;item;2主函數(shù)和其他函數(shù)的偽碼算法;(1)、BOOL CLabyrinthView:OnEraseBkgnd(CDC* pDC) extern int wall1317;/定義一個(gè)控制迷宮的數(shù)組 獲得客戶區(qū)句柄; CBitmap bmp4;/創(chuàng)建位圖for(int j=0;j<13;j+)for(int k=0;k<17;k+)/利用循環(huán)語句進(jìn)行貼迷宮地圖if(walljk=0)if(

16、walljk=1) if(walljk=2)if(walljk=3)(2)、void CLabyrinthView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) /第一個(gè)參數(shù)表示哪個(gè)按鍵/用背景涂抹走過的痕跡 char ch16;for(int i=0;i<4;i+)for(int j=0;j<4;j+)/老鼠4個(gè)方向16張圖,循環(huán)輸出到bitmap數(shù)組/當(dāng)選擇開始游戲后,才能讓老鼠走動(dòng) if(m_timestatus=1)if(nChar=VK_DOWN)/nchar 從鍵盤中接受的變量if(nChar=VK_RIGHT)if(

17、nChar=VK_UP)if(nChar=VK_LEFT)else/解決游戲結(jié)束后還可繼續(xù)走的bug,讓他結(jié)束就變到初始位置y=start_x;x=start_y;/如果走到出口:if(wallyx=2)AfxMessageBox("你很棒!恭喜你贏了!(*_*) 嘻嘻");/貼走動(dòng)的圖:(3)、void CLabyrinthView:OnAuto() item move4=1,0,0,1,-1,0,0,-1;/獲取操作權(quán)/老鼠4個(gè)方向16張圖,循環(huán)輸出到bitmap數(shù)組CSkfction *csk=new CSkfction();/定義棧Seqstack *s=csk-&

18、gt;init_Seqstack();/初始化while(!csk->Empty_Seqstack(s) /不空運(yùn)行 while(d<4) /試探指向下一個(gè)位置 0->x+1 y右 1->x y+1下 2->x-1 y左3->x y-1上if(wallij=0|wallij=2)/試探可通/刷白走過的路temp.x=j;temp.y=i;/將試探給要壓棧的temp/找老鼠行走方向if(temp.di=0) di=2;if(temp.di=1) di=0;if(temp.di=2) di=1;if(temp.di=3) di=3;mdc->SelectO

19、bject(bitmapdiindex+);/選擇各方向的圖 csk->Push_Seqstack(s,temp); wallyx=-1;/已經(jīng)貼圖的 /if(wallyx=2)if(x=16&&y=10)成功找到糧倉,開始走全部路線elsed=0;elsed+; (4)void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point) if(m_selfmap=1)/獲取dc指針/獲取鼠標(biāo)坐標(biāo),轉(zhuǎn)換為墻的xy坐標(biāo),存入數(shù)組。int j=(int)point.x/50;int k=(int)point.y/50;/路變

20、墻,墻變路switch(wallkj)case 1:/貼路的圖片case 0:/貼墻的圖片(5)void CMainFrame:OnTimer(UINT nIDEvent) if(m_lasttime<0)MessageBox("你怎么讓老鼠餓死啦!o(><)o"); OnOpen();else if(m_timestatus=1)/時(shí)間消耗CFrameWnd:OnTimer(nIDEvent);(6)void CMainFrame:OnSave() /用于保存地圖extern int wall1317;char ch1317;for(int i=0;i&

21、lt;13;i+)for(int j=0;j<17;j+)chij=wallij+48;/保存文件2種方式1:asc2碼 2:二進(jìn)制碼/數(shù)組中有2、3所以用asc碼FILE *pFile=fopen("Gamemap.txt","w");fwrite(ch,1,222,pFile);fclose(pFile);(7)void CMainFrame:OnSettime() /設(shè)置游戲時(shí)間菜單用于創(chuàng)建一個(gè)對(duì)話框類,并傳入輸入值,/并重畫狀態(tài)欄CSetTime dlg;if(IDOK=dlg.DoModal()m_settime=dlg.m_time;m

22、_lasttime=m_settime;CString str1,str2;str1.Format("剩余時(shí)間:%d",m_lasttime);str2.Format("規(guī)定時(shí)間:%d",m_settime);CClientDC dc(this);m_wndStatusBar.CommandToIndex(IDS_LASTTIME);m_wndStatusBar.SetPaneInfo(0,IDS_LASTTIME,SBPS_NORMAL,150);m_wndStatusBar.SetPaneText(0,str1);m_wndStatusBar.CommandToIndex(IDS_SETTIME);m_wndStatusBar.SetPaneInfo(1,IDS_SETTIME,SBPS_NORMAL,150);m_wndStatusBar.SetPan

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論