《《數據結構課程設計》走迷宮游戲.doc》由會員分享,可在線閱讀,更多相關《《數據結構課程設計》走迷宮游戲.doc(16頁珍藏版)》請在裝配圖網上搜索。
信 息 工 程 學 院
課程設計報告
課程名稱 《數據結構》
課題名稱 走迷宮游戲
專 業(yè)
班 級
學 號
姓 名
聯(lián)系方式
指導教師
2015 年 12 月 27 日
目 錄
1、數據結構課程設計任務書 1
1.1、題目 1
1.2、要求 1
2、總體設計 1
2.1、設計思路及總體組成框架 1
2.2、操作流程圖 2
3、詳細設計 5
3.1、程序中所采用的數據結構及存儲結構的說明 5
3.2、函數功能模塊說明 5
3.3、各函數的調用關系 7
4、調試與測試: 7
4.1、調試方法與步驟: 7
4.2、測試結果的分析與討論: 8
4.3、測試過程中遇到的主要問題及采取的解決措施: 10
6、源程序清單 10
7、數據結構課程設計總結 14
8、參考文獻 14
1、數據結構課程設計任務書
1.1題目
程序開始運行時顯示一個迷宮地圖,迷宮中央有一只老鼠,迷宮的右下方有一個糧倉。游戲的任務是使用鍵盤上的方向鍵操縱老鼠在規(guī)定的時間內走到糧倉處。
1.2、要求
1) 老鼠形象可辨認,可用鍵盤操縱老鼠上下左右移動;
2) 迷宮的墻足夠結實,老鼠不能穿墻而過;
3) 正確檢測結果,若老鼠在規(guī)定時間內走到糧倉處,提示成功,否則提示失??;
4) 添加編輯迷宮功能,可修改當前迷宮,修改內容:墻變路、路變墻;
5) 找出走出迷宮的所有路徑。
利用序列化功能實現(xiàn)迷宮地圖文件的存盤和讀出等功能
2、總體設計
2.1、設計思路及總體組成框架
1、思路
(1).利用mfc可以把迷宮地圖以及老鼠形象可變的導出來。
(2).需要有墻有路,通過把迷宮地圖劃分成一個一個小方塊,通過一個數組的值來判斷是墻是路。(1表示墻0表示路)
(3).利用棧,來存入當前位置,然后判斷下一位置,是否有路,存入棧中或出棧。
(4).把每個數組元素對應一個按鈕根據點擊按鈕,改變數組的值從而改變墻和路的轉化。
(5).鍵盤接受字符,根據字符調用不同的圖片,達到老鼠超前走的效果。
2、數據結構
本程序運用的邏輯結構是線性和存儲結構為順序。之所以采用本結構是因為,迷宮主要用到棧來儲存當前位置,和判斷下一位置,來入棧。
抽象數據類型線性表的定義如下:
ADT Stack{
數據對象:D={ai| ai ∈ElemSet,i=1,2,3……,n,n≥0}
數據關系: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 Stack
3、根據課程設計題目的功能要求,總體概要的組成框圖如下:
開始
保存地圖
操作界面
載入地圖
地圖的繪制
迷宮自動尋路
游戲時間設置
小老鼠鍵盤操
音效設置
結束
用戶登陸界面
2.2、操作流程圖
1、鍵盤操作流程:
開始
N
Y
按下鍵盤
按方向鍵up
方向鍵down
方向鍵left
方向鍵right
if(wall[i][j]==0||wall[i][j]==2)
判斷是否到達糧倉
根據對應的操作老鼠進行相應的修改x,y
N
N
結束
Y
Y
2、模塊流程圖:
開始
模塊初始化
加載迷宮地圖
N
判斷鍵是
否按下
N
啟動計時
Y
是否撞墻
老鼠移動
N
Y
時間為零
到達終點
N
停止移動
Y
Y
游戲結束
面向對象而非面向工程的程序設計,事件和判斷都具有同時性和并發(fā)性。
3、游戲界面顯示
新建登陸dlg類對象,并且顯示出來
初始化迷宮數組
根據對應的迷宮數組初始化迷宮地圖,同時初始化背景音樂,顯示當前設置時間和剩余時間。
點擊開始按鈕
3、詳細設計
3.1、程序中所采用的數據結構及存儲結構的說明
數據類型:結構體,整形數據
輸入:按照窗口、菜單提示按鼠標左鍵
移動老鼠位置,按鍵盤的上、下、左、右鍵
輸出:可視化迷宮
3.2、函數功能模塊說明
(1) 開始游戲
void CMainFrame::OnStart():開始游戲。
void CLabyrinthView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):小老鼠鍵盤操。第一個參數表示哪個按鍵,接受上、下、左、右字符,判斷調用哪個小老鼠圖片,最后用腳印圖片覆蓋老鼠圖片,達到朝前走,留下腳印的效果。
(2)重新開始
void CMainFrame::OnSysmap():系統(tǒng)地圖。
void CLabyrinthView::OnSelfmap()、void CLabyrinthView::OnLButtonDown(UINT nFlags, CPoint point):繪制地圖函 數。達到墻變路、路變墻的目的。
(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():為自動尋路函數。其重要調用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)函數。
(7)設置時間
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct):到達在在狀態(tài)欄中顯示時間,調用了系統(tǒng)的函數SetTimer(1,1000,NULL); 第一個參數為對應時器的代號。在一個程序中,可能有多個SetTimer,在Ontime響應時,可以根據第一個參數來確定是哪一個記時器所引起的事件。第二個參
數用于設置時間。 第三個參數為一個回調函數的指針,用NULL的話,系統(tǒng)會把SetTimer產生的消息加入消息隊列中。調用了一下三個函數信息,來顯示時間。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):根據時間判斷老鼠是否餓死。
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、各函數的調用關系
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.實際完成的情況說明(完成的功能,支持的數據類型等);
基本功能都已經完成,而且還加了保存圖片、載入圖片、設置時間、游戲幫助等功能。
2.上機過程中出現(xiàn)的問題及其解決方案;
(1) 問題:每次走完迷宮,它都會保持現(xiàn)有狀態(tài),如果重新開始,要自己按重新開始,次才能開始,很麻煩。
解決方案:void CMainFrame::OnTimer(UINT nIDEvent)函數中調用void CMainFrame::OnOpen(),這樣在每次游戲結束時就可以調用這個函數,載入圖片。
(2)問題:通過鍵盤來如何控制對象(老鼠)的移動,我希望達到一種老鼠會動的效果,即朝左走頭往左哦哦,朝右走,頭朝右。
解決方案:導入一組老鼠圖片,用數組進行控制,沒走一步判斷調用哪一組老鼠圖片。
(3)問題:鍵盤控制時老是出錯。
解決方案:后來通過CSDN、博客園等IT技術社區(qū)找到了相關文章,如果你按鍵沒有反應是因為它把你的消息轉發(fā)到了其它的激活窗口的處理程序上,可以試著點擊窗口的空白區(qū)域,不讓任何子控件獲得焦點(沒有任何一個控件有一個虛線的框)的時候,這個就能激活了。
4.2、測試結果的分析與討論:
(1)如果不按開始按鈕,會彈出一下對話框,如(圖一)
(圖一)
(2)游戲順利進行,并成功。如(圖二)
(圖二)
(3)自動尋路完成,如(圖三)
(圖三)
(4)自動尋路完成,如(圖四)
(圖四)
(5)走完全部的路,如(圖五)
(圖五)
(6)非法輸入:
當小老鼠上、下、左、右移動時,如果按下非以上四鍵,老鼠呆在原地不動。
對游戲和程序沒有影響。
4.3、測試過程中遇到的主要問題及采取的解決措施:
6、源程序清單
1. 定義程序中所有用到的數據及其數據結構
結構體,類,棧
typedef struct //順序棧初始化判??找约俺鋈霔?
{
int x,y,di;
}DataType;
typedef struct
{
DataType data[MAXSIZE];
int top;
}Seqstack;
typedef struct
{
int x;
int y;
}item;
2.主函數和其他函數的偽碼算法;
(1)、BOOL CLabyrinthView::OnEraseBkgnd(CDC* pDC)
{ extern int wall[13][17];//定義一個控制迷宮的數組
獲得客戶區(qū)句柄;
CBitmap bmp[4];//創(chuàng)建位圖
for(int j=0;j<13;j++)
{
for(int k=0;k<17;k++)//利用循環(huán)語句進行貼迷宮地圖
{
if(wall[j][k]==0)
{
}
if(wall[j][k]==1)
{
}
if(wall[j][k]==2)
{
}
if(wall[j][k]==3)
{
}
}
}
(2)、void CLabyrinthView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //第一個參數表示哪個按鍵
{
//用背景涂抹走過的痕跡
char ch[16];
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
//老鼠4個方向16張圖,循環(huán)輸出到bitmap數組
}
}//當選擇開始游戲后,才能讓老鼠走動
if(m_timestatus==1)
{
if(nChar==VK_DOWN)//nchar 從鍵盤中接受的變量
{
}
if(nChar==VK_RIGHT)
{
}
if(nChar==VK_UP)
{
}
if(nChar==VK_LEFT)
{
}
}
else//解決游戲結束后還可繼續(xù)走的bug,讓他結束就變到初始位置
{ y=start_x;
x=start_y;
}//如果走到出口:
if(wall[y][x]==2)
{AfxMessageBox("你很棒!恭喜你贏了!(*^__^*) 嘻嘻……");
}
//貼走動的圖:
}
(3)、void CLabyrinthView::OnAuto()
{item move[4]={1,0,0,1,-1,0,0,-1};
//獲取操作權
//老鼠4個方向16張圖,循環(huán)輸出到bitmap數組
CSkfction *csk=new CSkfction();//定義棧
Seqstack *s=csk->init_Seqstack();//初始化
while(!csk->Empty_Seqstack(s)) //不空運行
{
while(d<4)
{ //試探指向下一個位置 0->x+1 y右 1->x y+1下 2->x-1 y左3->x y-1上
if(wall[i][j]==0||wall[i][j]==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(bitmap[di][index++]);//選擇各方向的圖
csk->Push_Seqstack(s,temp);
wall[y][x]=-1;//已經貼圖的
//if(wall[y][x]==2)
if(x==16&&y==10)
{成功找到糧倉,開始走全部路線
}
else
d=0;
}
else
d++;
}} }
(4)void CLabyrinthView::OnLButtonDown(UINT nFlags, CPoint point)
{ if(m_selfmap==1)
{//獲取dc指針
//獲取鼠標坐標,轉換為墻的xy坐標,存入數組。
int j=(int)point.x/50;
int k=(int)point.y/50;
//路變墻,墻變路
switch(wall[k][j]){
case 1:
//貼路的圖片
case 0:
//貼墻的圖片
}
}
}
(5)void CMainFrame::OnTimer(UINT nIDEvent)
{
if(m_lasttime<0)
{
MessageBox("你怎么讓老鼠餓死啦!o(>﹏<)o");
OnOpen();
}
else if(m_timestatus==1)
{//時間消耗
}
CFrameWnd::OnTimer(nIDEvent);
}
(6)void CMainFrame::OnSave()
{
//用于保存地圖
extern int wall[13][17];
char ch[13][17];
for(int i=0;i<13;i++){
for(int j=0;j<17;j++){
ch[i][j]=wall[i][j]+48;
}
}
//保存文件2種方式1:asc2碼 2:二進制碼
//數組中有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、數據結構課程設計總結
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什么方式構成,呈什么結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應,通過這組算法集合可以對數據結構中的數據進行某種操作。
在剛開始的幾次調試中曾經出現(xiàn)過不能運行、不能正確輸出結果、不能正常顯示等等各種問題。經過我的努力及同學的幫助,這些問題最終克服,并且使程序的功能也得到了一定的完善?,F(xiàn)在它能人性化的展現(xiàn)小老鼠的迷宮之旅。
在這次設計過程中,不僅復習課本上所學知識,還通過查資料、問同學學到了課本上沒有的知識。從而啟發(fā)我,要想寫好程序,在寫好課本知識的同時還需要多讀和專業(yè)有關的一些書籍,同時還需要多動腦子,盡量把所學的知識綜合起來應用,力爭寫出完美的程序。除此之外,我還得到了一些有用的教訓:寫程序時必須要細心,不能輸錯一個字符標點,就連全角半角也得注意。在修改時要有耐心,編譯出錯后必須逐個錯誤去改正,絕不能心急浮躁,否則修改之后還會有新的錯誤。
8、參考文獻
書籍:
1. 《C語言程序設計(第三版)》, 出版社:高等教育出版社, 主編:廖雷,
出版日期:2009年6月
2. 《數據結構(c語言描述)》,出版社:中國水利水電出版社,主編:馬秋菊
出版日期:2006年
《大話數據結構》,出版社:清華大學出版社,主編,程杰,出版日期:2011年6月
3. http://student.zjzk.cn/course_ware/data_structure/web/main.htm
數據結構自考網:
zhidao.baidu.com 百度知道
鏈接地址:http://italysoccerbets.com/p-6658744.html