《數(shù)據(jù)結構課程設計》走迷宮游戲.doc
《《數(shù)據(jù)結構課程設計》走迷宮游戲.doc》由會員分享,可在線閱讀,更多相關《《數(shù)據(jù)結構課程設計》走迷宮游戲.doc(16頁珍藏版)》請在裝配圖網上搜索。
信 息 工 程 學 院課程設計報告 課程名稱 數(shù)據(jù)結構 課題名稱 走迷宮游戲 專業(yè) 班級 學號 姓名 聯(lián)系方式 指導教師 2015 年 12 月 27 日目 錄1、數(shù)據(jù)結構課程設計任務書1.1、題目1.2、要求2、總體設計2.1、設計思路及總體組成框架2.2、操作流程圖3、詳細設計3.1、程序中所采用的數(shù)據(jù)結構及存儲結構的說明3.2、函數(shù)功能模塊說明3.3、各函數(shù)的調用關系4、調試與測試:4.1、調試方法與步驟:4.2、測試結果的分析與討論:4.3、測試過程中遇到的主要問題及采取的解決措施:6、源程序清單7、數(shù)據(jù)結構課程設計總結8、參考文獻1、數(shù)據(jù)結構課程設計任務書1.1題目程序開始運行時顯示一個迷宮地圖,迷宮中央有一只老鼠,迷宮的右下方有一個糧倉。游戲的任務是使用鍵盤上的方向鍵操縱老鼠在規(guī)定的時間內走到糧倉處。1.2、要求1) 老鼠形象可辨認,可用鍵盤操縱老鼠上下左右移動;2) 迷宮的墻足夠結實,老鼠不能穿墻而過;3) 正確檢測結果,若老鼠在規(guī)定時間內走到糧倉處,提示成功,否則提示失敗;4) 添加編輯迷宮功能,可修改當前迷宮,修改內容:墻變路、路變墻;5) 找出走出迷宮的所有路徑。利用序列化功能實現(xiàn)迷宮地圖文件的存盤和讀出等功能2、總體設計2.1、設計思路及總體組成框架1、思路(1).利用mfc可以把迷宮地圖以及老鼠形象可變的導出來。 (2).需要有墻有路,通過把迷宮地圖劃分成一個一個小方塊,通過一個數(shù)組的值來判斷是墻是路。(1表示墻0表示路) (3).利用棧,來存入當前位置,然后判斷下一位置,是否有路,存入棧中或出棧。 (4).把每個數(shù)組元素對應一個按鈕根據(jù)點擊按鈕,改變數(shù)組的值從而改變墻和路的轉化。 (5).鍵盤接受字符,根據(jù)字符調用不同的圖片,達到老鼠超前走的效果。2、數(shù)據(jù)結構本程序運用的邏輯結構是線性和存儲結構為順序。之所以采用本結構是因為,迷宮主要用到棧來儲存當前位置,和判斷下一位置,來入棧。抽象數(shù)據(jù)類型線性表的定義如下:ADT Stack 數(shù)據(jù)對象:D=ai| ai ElemSet,i=1,2,3,n,n0數(shù)據(jù)關系:R1=| ai-1,ai D,i=1,2,3,,n基本操作:Initstack(&s)操作結果:構造一個空棧s。Stackempty(s)初始條件:棧s已經存在。操作結果:將s清為空棧。Push(&s,e)初始條件:棧s已經存在。操作結果:插入元素e為新的棧頂元素。Pop(&s,&e)初始條件:棧s已經存在,且非空。操作結果:刪除s的棧頂元素,并用e返回其值。 ADT Stack3、根據(jù)課程設計題目的功能要求,總體概要的組成框圖如下:開始保存地圖操作界面載入地圖地圖的繪制迷宮自動尋路游戲時間設置小老鼠鍵盤操音效設置結束用戶登陸界面2.2、操作流程圖1、鍵盤操作流程:開始NY按下鍵盤按方向鍵up方向鍵down方向鍵left方向鍵rightif(wallij=0|wallij=2)判斷是否到達糧倉根據(jù)對應的操作老鼠進行相應的修改x,yNN結束YY2、模塊流程圖:開始模塊初始化加載迷宮地圖N判斷鍵是否按下N啟動計時Y是否撞墻老鼠移動NY時間為零到達終點N停止移動YY游戲結束面向對象而非面向工程的程序設計,事件和判斷都具有同時性和并發(fā)性。3、游戲界面顯示新建登陸dlg類對象,并且顯示出來初始化迷宮數(shù)組根據(jù)對應的迷宮數(shù)組初始化迷宮地圖,同時初始化背景音樂,顯示當前設置時間和剩余時間。點擊開始按鈕3、詳細設計3.1、程序中所采用的數(shù)據(jù)結構及存儲結構的說明數(shù)據(jù)類型:結構體,整形數(shù)據(jù) 輸入:按照窗口、菜單提示按鼠標左鍵 移動老鼠位置,按鍵盤的上、下、左、右鍵 輸出:可視化迷宮3.2、函數(shù)功能模塊說明(1) 開始游戲 void CMainFrame:OnStart():開始游戲。void CLabyrinthView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):小老鼠鍵盤操。第一個參數(shù)表示哪個按鍵,接受上、下、左、右字符,判斷調用哪個小老鼠圖片,最后用腳印圖片覆蓋老鼠圖片,達到朝前走,留下腳印的效果。(2)重新開始void CMainFrame:OnSysmap():系統(tǒng)地圖。void CLabyrinthView:OnSelfmap()、void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point):繪制地圖函 數(shù)。達到墻變路、路變墻的目的。(3)保存圖片void CMainFrame:OnSave():保存地圖。(4)載入圖片void CMainFrame:OnOpen():載入地圖。BOOL CLabyrinthView:OnEraseBkgnd(CDC* pDC):設置歡迎畫面,載入圖片。(5)自繪地圖void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point): 墻變路,路變墻(6)自動尋路void CLabyrinthView:OnAuto():為自動尋路函數(shù)。其重要調用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)設置時間int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct):到達在在狀態(tài)欄中顯示時間,調用了系統(tǒng)的函數(shù)SetTimer(1,1000,NULL); 第一個參數(shù)為對應時器的代號。在一個程序中,可能有多個SetTimer,在Ontime響應時,可以根據(jù)第一個參數(shù)來確定是哪一個記時器所引起的事件。第二個參數(shù)用于設置時間。 第三個參數(shù)為一個回調函數(shù)的指針,用NULL的話,系統(tǒng)會把SetTimer產生的消息加入消息隊列中。調用了一下三個函數(shù)信息,來顯示時間。m_wndStatusBar.CommandToIndex(IDS_LASTTIME);/按規(guī)定寬度顯示m_wndStatusBar.SetPaneInfo(0,IDS_LASTTIME,SBPS_POPOUT,150);/剩余時間凸出來m_wndStatusBar.SetPaneText(1,str2);/在窗格中顯示文本信息。void CMainFrame:OnTimer(UINT nIDEvent):根據(jù)時間判斷老鼠是否餓死。void CMainFrame:OnSettime():設置時間。(8)音效設置void CMainFrame:OnMusicOn():音樂來。void CMainFrame:OnMusicOff():音樂關。(9)游戲退出void CMainFrame:OnAppExit():void CMainFrame:OnClose():退出游戲,彈出對話框。(10)框架BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs):設置窗口信息。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct):在狀態(tài)欄顯示時間信息。3.3、各函數(shù)的調用關系void CLabyrinthView:OnAuto()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)程序界面:開始保存地圖操作界面載入地圖地圖的繪制迷宮自動尋路游戲時間設置小老鼠鍵盤操音效設置結束用戶登陸界面4、調試與測試:4.1、調試方法與步驟:內容包括:調試過程中遇到的問題是如何解決的以及對設計與實現(xiàn)的回顧討論和分析:1.實際完成的情況說明(完成的功能,支持的數(shù)據(jù)類型等);基本功能都已經完成,而且還加了保存圖片、載入圖片、設置時間、游戲幫助等功能。2.上機過程中出現(xiàn)的問題及其解決方案; (1) 問題:每次走完迷宮,它都會保持現(xiàn)有狀態(tài),如果重新開始,要自己按重新開始,次才能開始,很麻煩。解決方案:void CMainFrame:OnTimer(UINT nIDEvent)函數(shù)中調用void CMainFrame:OnOpen(),這樣在每次游戲結束時就可以調用這個函數(shù),載入圖片。(2)問題:通過鍵盤來如何控制對象(老鼠)的移動,我希望達到一種老鼠會動的效果,即朝左走頭往左哦哦,朝右走,頭朝右。解決方案:導入一組老鼠圖片,用數(shù)組進行控制,沒走一步判斷調用哪一組老鼠圖片。(3)問題:鍵盤控制時老是出錯。解決方案:后來通過CSDN、博客園等IT技術社區(qū)找到了相關文章,如果你按鍵沒有反應是因為它把你的消息轉發(fā)到了其它的激活窗口的處理程序上,可以試著點擊窗口的空白區(qū)域,不讓任何子控件獲得焦點(沒有任何一個控件有一個虛線的框)的時候,這個就能激活了。4.2、測試結果的分析與討論:(1)如果不按開始按鈕,會彈出一下對話框,如(圖一) (圖一)(2)游戲順利進行,并成功。如(圖二) (圖二)(3)自動尋路完成,如(圖三) (圖三)(4)自動尋路完成,如(圖四)(圖四)(5)走完全部的路,如(圖五)(圖五)(6)非法輸入: 當小老鼠上、下、左、右移動時,如果按下非以上四鍵,老鼠呆在原地不動。對游戲和程序沒有影響。4.3、測試過程中遇到的主要問題及采取的解決措施:6、源程序清單1. 定義程序中所有用到的數(shù)據(jù)及其數(shù)據(jù)結構結構體,類,棧 typedef struct /順序棧初始化判??找约俺鋈霔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;/定義一個控制迷宮的數(shù)組 獲得客戶區(qū)句柄; CBitmap bmp4;/創(chuàng)建位圖for(int j=0;j13;j+)for(int k=0;k17;k+)/利用循環(huán)語句進行貼迷宮地圖if(walljk=0)if(walljk=1) if(walljk=2)if(walljk=3)(2)、void CLabyrinthView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) /第一個參數(shù)表示哪個按鍵/用背景涂抹走過的痕跡 char ch16;for(int i=0;i4;i+)for(int j=0;jinit_Seqstack();/初始化while(!csk-Empty_Seqstack(s) /不空運行 while(dx+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-SelectObject(bitmapdiindex+);/選擇各方向的圖 csk-Push_Seqstack(s,temp); wallyx=-1;/已經貼圖的 /if(wallyx=2)if(x=16&y=10)成功找到糧倉,開始走全部路線elsed=0;elsed+; (4)void CLabyrinthView:OnLButtonDown(UINT nFlags, CPoint point) if(m_selfmap=1)/獲取dc指針/獲取鼠標坐標,轉換為墻的xy坐標,存入數(shù)組。int j=(int)point.x/50;int k=(int)point.y/50;/路變墻,墻變路switch(wallkj)case 1:/貼路的圖片case 0:/貼墻的圖片(5)void CMainFrame:OnTimer(UINT nIDEvent) if(m_lasttime)o); OnOpen();else if(m_timestatus=1)/時間消耗CFrameWnd:OnTimer(nIDEvent);(6)void CMainFrame:OnSave() /用于保存地圖extern int wall1317;char ch1317;for(int i=0;i13;i+)for(int j=0;j17;j+)chij=wallij+48;/保存文件2種方式1:asc2碼 2:二進制碼/數(shù)組中有2、3所以用asc碼FILE *pFile=fopen(Gamemap.txt,w);fwrite(ch,1,222,pFile);fclose(pFile);(7)void CMainFrame:OnSettime() /設置游戲時間菜單用于創(chuàng)建一個對話框類,并傳入輸入值,/并重畫狀態(tài)欄CSetTime dlg;if(IDOK=dlg.DoModal()m_settime=dlg.m_time;m_lasttime=m_settime;CString str1,str2;str1.Format(剩余時間:%d,m_lasttime);str2.Format(規(guī)定時間:%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.SetPaneText(1,str2);Invalidate();7、數(shù)據(jù)結構課程設計總結數(shù)據(jù)結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數(shù)據(jù)的內部構成,即一個數(shù)據(jù)由那些成分數(shù)據(jù)構成,以什么方式構成,呈什么結構。數(shù)據(jù)結構有邏輯上的數(shù)據(jù)結構和物理上的數(shù)據(jù)結構之分。邏輯上的數(shù)據(jù)結構反映成分數(shù)據(jù)之間的邏輯關系,而物理上的數(shù)據(jù)結構反映成分數(shù)據(jù)在計算機內部的存儲安排。數(shù)據(jù)結構是數(shù)據(jù)存在的形式。 數(shù)據(jù)結構是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應,通過這組算法集合可以對數(shù)據(jù)結構中的數(shù)據(jù)進行某種操作。在剛開始的幾次調試中曾經出現(xiàn)過不能運行、不能正確輸出結果、不能正常顯示等等各種問題。經過我的努力及同學的幫助,這些問題最終克服,并且使程序的功能也得到了一定的完善?,F(xiàn)在它能人性化的展現(xiàn)小老鼠的迷宮之旅。在這次設計過程中,不僅復習課本上所學知識,還通過查資料、問同學學到了課本上沒有的知識。從而啟發(fā)我,要想寫好程序,在寫好課本知識的同時還需要多讀和專業(yè)有關的一些書籍,同時還需要多動腦子,盡量把所學的知識綜合起來應用,力爭寫出完美的程序。除此之外,我還得到了一些有用的教訓:寫程序時必須要細心,不能輸錯一個字符標點,就連全角半角也得注意。在修改時要有耐心,編譯出錯后必須逐個錯誤去改正,絕不能心急浮躁,否則修改之后還會有新的錯誤。8、參考文獻書籍: 1. C語言程序設計(第三版), 出版社:高等教育出版社, 主編:廖雷,出版日期:2009年6月 2. 數(shù)據(jù)結構(c語言描述),出版社:中國水利水電出版社,主編:馬秋菊 出版日期:2006年大話數(shù)據(jù)結構,出版社:清華大學出版社,主編,程杰,出版日期:2011年6月3. http:/student.zjzk.cn/course_ware/data_structure/web/main.htm數(shù)據(jù)結構自考網:zhidao.baidu.com 百度知道- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 數(shù)據(jù)結構課程設計 數(shù)據(jù)結構 課程設計 迷宮 游戲
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
相關資源
更多
正為您匹配相似的精品文檔
鏈接地址:http://italysoccerbets.com/p-6658744.html