《《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》走迷宮游戲.doc(16頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
信 息 工 程 學(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、題目 1
1.2、要求 1
2、總體設(shè)計(jì) 1
2.1、設(shè)計(jì)思路及總體組成框架 1
2.2、操作流程圖 2
3、詳細(xì)設(shè)計(jì) 5
3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)結(jié)構(gòu)的說明 5
3.2、函數(shù)功能模塊說明 5
3.3、各函數(shù)的調(diào)用關(guān)系 7
4、調(diào)試與測(cè)試: 7
4.1、調(diào)試方法與步驟: 7
4.2、測(cè)試結(jié)果的分析與討論: 8
4.3、測(cè)試過程中遇到的主要問題及采取的解決措施: 10
6、源程序清單 10
7、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié) 14
8、參考文獻(xiàn) 14
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)任務(wù)書
1.1題目
程序開始運(yùn)行時(shí)顯示一個(gè)迷宮地圖,迷宮中央有一只老鼠,迷宮的右下方有一個(gè)糧倉(cāng)。游戲的任務(wù)是使用鍵盤上的方向鍵操縱老鼠在規(guī)定的時(shí)間內(nèi)走到糧倉(cāng)處。
1.2、要求
1) 老鼠形象可辨認(rèn),可用鍵盤操縱老鼠上下左右移動(dòng);
2) 迷宮的墻足夠結(jié)實(shí),老鼠不能穿墻而過;
3) 正確檢測(cè)結(jié)果,若老鼠在規(guī)定時(shí)間內(nèi)走到糧倉(cāng)處,提示成功,否則提示失敗;
4) 添加編輯迷宮功能,可修改當(dāng)前迷宮,修改內(nèi)容:墻變路、路變墻;
5) 找出走出迷宮的所有路徑。
利用序列化功能實(shí)現(xiàn)迷宮地圖文件的存盤和讀出等功能
2、總體設(shè)計(jì)
2.1、設(shè)計(jì)思路及總體組成框架
1、思路
(1).利用mfc可以把迷宮地圖以及老鼠形象可變的導(dǎo)出來。
(2).需要有墻有路,通過把迷宮地圖劃分成一個(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,n≥0}
數(shù)據(jù)關(guān)系:R1={
| 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 Stack
3、根據(jù)課程設(shè)計(jì)題目的功能要求,總體概要的組成框圖如下:
開始
保存地圖
操作界面
載入地圖
地圖的繪制
迷宮自動(dòng)尋路
游戲時(shí)間設(shè)置
小老鼠鍵盤操
音效設(shè)置
結(jié)束
用戶登陸界面
2.2、操作流程圖
1、鍵盤操作流程:
開始
N
Y
按下鍵盤
按方向鍵up
方向鍵down
方向鍵left
方向鍵right
if(wall[i][j]==0||wall[i][j]==2)
判斷是否到達(dá)糧倉(cāng)
根據(jù)對(duì)應(yīng)的操作老鼠進(jìn)行相應(yīng)的修改x,y
N
N
結(jié)束
Y
Y
2、模塊流程圖:
開始
模塊初始化
加載迷宮地圖
N
判斷鍵是
否按下
N
啟動(dòng)計(jì)時(shí)
Y
是否撞墻
老鼠移動(dòng)
N
Y
時(shí)間為零
到達(dá)終點(diǎn)
N
停止移動(dòng)
Y
Y
游戲結(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ù)類型:結(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 CLabyrinthView::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): 墻變路,路變墻
(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 lpCreateStruct):到達(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_POPOUT,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)框架
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 CSkfction::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),如果重新開始,要自己按重新開始,次才能開始,很麻煩。
解決方案:void 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)(沒有任何一個(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 //順序棧初始化判??找约俺鋈霔?
{
int x,y,di;
}DataType;
typedef struct
{
DataType data[MAXSIZE];
int top;
}Seqstack;
typedef struct
{
int x;
int y;
}item;
2.主函數(shù)和其他函數(shù)的偽碼算法;
(1)、BOOL CLabyrinthView::OnEraseBkgnd(CDC* pDC)
{ extern int wall[13][17];//定義一個(gè)控制迷宮的數(shù)組
獲得客戶區(qū)句柄;
CBitmap bmp[4];//創(chuàng)建位圖
for(int j=0;j<13;j++)
{
for(int k=0;k<17;k++)//利用循環(huán)語(yǔ)句進(jì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) //第一個(gè)參數(shù)表示哪個(gè)按鍵
{
//用背景涂抹走過的痕跡
char ch[16];
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(nChar==VK_UP)
{
}
if(nChar==VK_LEFT)
{
}
}
else//解決游戲結(jié)束后還可繼續(xù)走的bug,讓他結(jié)束就變到初始位置
{ y=start_x;
x=start_y;
}//如果走到出口:
if(wall[y][x]==2)
{AfxMessageBox("你很棒!恭喜你贏了!(*^__^*) 嘻嘻……");
}
//貼走動(dòng)的圖:
}
(3)、void CLabyrinthView::OnAuto()
{item move[4]={1,0,0,1,-1,0,0,-1};
//獲取操作權(quán)
//老鼠4個(gè)方向16張圖,循環(huán)輸出到bitmap數(shù)組
CSkfction *csk=new CSkfction();//定義棧
Seqstack *s=csk->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(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;//已經(jīng)貼圖的
//if(wall[y][x]==2)
if(x==16&&y==10)
{成功找到糧倉(cāng),開始走全部路線
}
else
d=0;
}
else
d++;
}} }
(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;
//路變墻,墻變路
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)
{//時(shí)間消耗
}
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:二進(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_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.SetPaneText(1,str2);
Invalidate();
}
}
}7、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)總結(jié)
數(shù)據(jù)結(jié)構(gòu)是在整個(gè)計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域上廣泛被使用的術(shù)語(yǔ)。它用來反映一個(gè)數(shù)據(jù)的內(nèi)部構(gòu)成,即一個(gè)數(shù)據(jù)由那些成分?jǐn)?shù)據(jù)構(gòu)成,以什么方式構(gòu)成,呈什么結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)有邏輯上的數(shù)據(jù)結(jié)構(gòu)和物理上的數(shù)據(jù)結(jié)構(gòu)之分。邏輯上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)之間的邏輯關(guān)系,而物理上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)在計(jì)算機(jī)內(nèi)部的存儲(chǔ)安排。數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存在的形式。 數(shù)據(jù)結(jié)構(gòu)是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對(duì)應(yīng),通過這組算法集合可以對(duì)數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)進(jìn)行某種操作。
在剛開始的幾次調(diào)試中曾經(jīng)出現(xiàn)過不能運(yùn)行、不能正確輸出結(jié)果、不能正常顯示等等各種問題。經(jīng)過我的努力及同學(xué)的幫助,這些問題最終克服,并且使程序的功能也得到了一定的完善?,F(xiàn)在它能人性化的展現(xiàn)小老鼠的迷宮之旅。
在這次設(shè)計(jì)過程中,不僅復(fù)習(xí)課本上所學(xué)知識(shí),還通過查資料、問同學(xué)學(xué)到了課本上沒有的知識(shí)。從而啟發(fā)我,要想寫好程序,在寫好課本知識(shí)的同時(shí)還需要多讀和專業(yè)有關(guān)的一些書籍,同時(shí)還需要多動(dòng)腦子,盡量把所學(xué)的知識(shí)綜合起來應(yīng)用,力爭(zhēng)寫出完美的程序。除此之外,我還得到了一些有用的教訓(xùn):寫程序時(shí)必須要細(xì)心,不能輸錯(cuò)一個(gè)字符標(biāo)點(diǎn),就連全角半角也得注意。在修改時(shí)要有耐心,編譯出錯(cuò)后必須逐個(gè)錯(cuò)誤去改正,絕不能心急浮躁,否則修改之后還會(huì)有新的錯(cuò)誤。
8、參考文獻(xiàn)
書籍:
1. 《C語(yǔ)言程序設(shè)計(jì)(第三版)》, 出版社:高等教育出版社, 主編:廖雷,
出版日期:2009年6月
2. 《數(shù)據(jù)結(jié)構(gòu)(c語(yǔ)言描述)》,出版社:中國(guó)水利水電出版社,主編:馬秋菊
出版日期:2006年
《大話數(shù)據(jù)結(jié)構(gòu)》,出版社:清華大學(xué)出版社,主編,程杰,出版日期:2011年6月
3. http://student.zjzk.cn/course_ware/data_structure/web/main.htm
數(shù)據(jù)結(jié)構(gòu)自考網(wǎng):
zhidao.baidu.com 百度知道
鏈接地址:http://www.820124.com/p-6658744.html