首页 数据结构课设-走迷宫游戏

数据结构课设-走迷宫游戏

举报
开通vip

数据结构课设-走迷宫游戏数据结构课设-走迷宫游戏 数据结构课程设计—走迷宫游戏 一、需求分析 1.问题描述: 应用mfc编程,使程序开始运行时显示一个迷宫地图,迷宫中央有一只 老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老 鼠在规定的时间内走到粮仓处。满足要求:(1) 老鼠形象可辨认,可用键 盘操纵老鼠上下左右移动;(2) 迷宫的墙足够结实,老鼠不能穿墙而过; (3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提 示失败;(4)添加编辑迷宫功能,自会地图,可修改当前迷宫,修改内容: 墙变路、路变...

数据结构课设-走迷宫游戏
数据结构课设-走迷宫游戏 数据结构课程设计—走迷宫游戏 一、需求分析 1.问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 描述: 应用mfc编程,使程序开始运行时显示一个迷宫地图,迷宫中央有一只 老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老 鼠在规定的时间内走到粮仓处。满足要求:(1) 老鼠形象可辨认,可用键 盘操纵老鼠上下左右移动;(2) 迷宫的墙足够结实,老鼠不能穿墙而过; (3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提 示失败;(4)添加编辑迷宫功能,自会地图,可修改当前迷宫,修改内容: 墙变路、路变墙;(5)在走不出迷宫的情况下,可以通过自动寻图走到粮仓。 (6)可以保存当前自绘图片。 2.基本功能 1)开始游戏(2)重新开始(3)保存图片 ( (4)载入图片(5)自会地图(6)自动寻路 7)设置时间(8)音效设置(9)游戏难度 ( (10)游戏帮助 (11)游戏退出 3.输入输出 数据类型:结构体,整形数据 输入:按照窗口、菜单提示按鼠标左键 移动老鼠位置,按键盘的上、下、左、右键 输出:可视化迷宫 二、 概要设计 1.设计思路: (1).利用mfc可以把迷宫地图以及老鼠形象可变的导出来。 (2).需要有墙有路,通过把迷宫地图划分成一个一个小方块,通过一个 数组的值来判断是墙是路。(1 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示墙0表示路) (3).利用栈,来存入当前位置,然后判断下一位置,是否有路,存入栈 中或出栈。 (4).把每个数组元素对应一个按钮根据点击按钮,改变数组的值从而改 变墙和路的转化。 (5).键盘接受字符,根据字符调用不同的图片,达到老鼠超前走的效果。 2.数据结构设计: 本程序运用的逻辑结构是线性和存储结构为顺序。之所以采用本结构是 因为,迷宫主要用到栈来储存当前位置,和判断下一位置,来入栈。 抽象数据类型线性表的定义如下: ADT Stack{ 数据对象:D={a| a ?ElemSet,i=1,2,3……,n,n?0} ii 数据关系:R1={| a,a ?D,i=1,2,3,……,n} i-1ii-1i 基本操作: Initstack(&s) 操作结果:构造一个空栈s。 1 数据结构课程设计—走迷宫游戏 Stackempty(s) 初始条件:栈s已经存在。 操作结果:将s清为空栈。 Push(&s,e) 初始条件:栈s已经存在。 操作结果:插入元素e为新的栈顶元素。 Pop(&s,&e) 初始条件:栈s已经存在,且非空。 操作结果:删除s的栈顶元素,并用e返回其值。 } ADT Stack 3.软件结构设计: (1) 开始游戏 void CMainFrame::OnStart():开始游戏。 void CLabyrinthView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):小老鼠键盘操。第一个参数表示哪个按键,接受上、下、左、右字符,判断调用哪个小老鼠图片,最后用脚印图片覆盖老鼠图片,达到朝前走,留下脚印的效果。 (2)重新开始 void CMainFrame::OnSysmap():系统地图。 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):到达在在状 态栏中显示时间,调用了系统的函数SetTimer(1,1000,NULL); 第一个参数 为对应时器的代号。在一个程序中,可能有多个SetTimer,在Ontime响应 时,可以根据第一个参数来确定是哪一个记时器所引起的事件。第二个参 2 数据结构课程设计—走迷宫游戏 数用于设置时间。 第三个参数为一个回调函数的指针,用NULL的话, 系统会把SetTimer产生的消息加入消息队列中。调用了一下三个函数信 息,来显示时间。m_wndStatusBar.CommandToIndex(IDS_LASTTIME); //按规定宽度显示 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):在状态栏显示时间信息。 各函数的调用关系: void CLabyrinthView::OnAuto() Seqstack * int int Int CSkfction::init_CSkfction::EmpCSkfction::PushCSkfction::Pop Seqstack() ty_Seqstack(Se_Seqstack(Seqs_Seqstack(Seqs qstack *s) tack tack *s,DataType x) *s,DataType *x) 3 数据结构课程设计—走迷宫游戏 intCMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) SetTimer(1,1m_wndStatum_wndStatum_wndStatu 000,NULL); sBar.CommasBar.SetPanesBar.SetPane Text(0,str1); ndToIndex(IDInfo(0,IDS_L S_LASTTIME)ASTTIME,SBP ; S_POPOUT,1 50); 程序界面: 开始 操作界面 保载地迷游音小用 存入图宫戏效老户 地地的自时设鼠登 图 图 绘动间置 键陆 制 寻设盘界 路 置 操 面 结束 三、 详细设计 1. 定义程序中所有用到的数据及其数据结构,及其基本操作的实现; 4 数据结构课程设计—走迷宫游戏 结构体,类,栈 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];//定义一个控制迷宫的数组 获得客户区句柄; CBitmap bmp[4];//创建位图 for(int j=0;j<13;j++) { for(int k=0;k<17;k++)//利用循环语句进行贴迷宫地图 { if(wall[j][k]==0) { } if(wall[j][k]==1) { } if(wall[j][k]==2) { } if(wall[j][k]==3) { } } 5 数据结构课程设计—走迷宫游戏 } (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张图,循环输出到bitmap数组 } }//当选择开始游戏后,才能让老鼠走动 if(m_timestatus==1) { if(nChar==VK_DOWN)//nchar 从键盘中接受的变量 { } if(nChar==VK_RIGHT) { } if(nChar==VK_UP) { } if(nChar==VK_LEFT) { } } else//解决游戏结束后还可继续走的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张图,循环输出到bitmap数组 CSkfction *csk=new CSkfction();//定义栈 Seqstack *s=csk->init_Seqstack();//初始化 while(!csk->Empty_Seqstack(s)) //不空运行 6 数据结构课程设计—走迷宫游戏 { 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(); 7 数据结构课程设计—走迷宫游戏 } 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() { //设置游戏时间菜单用于创建一个对话框类,并传入输入值, //并重画状态栏 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("规定时间:%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(); } 8 数据结构课程设计—走迷宫游戏 } 3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。 键盘操作流程 开始 按下键盘 N Y 按方向键up 方向键down 方向键left 方向键right N if(wall[i][j]==0||wall[i][j ]==2) Y Y 判断是否到达粮仓 N 根据对应的操作老鼠进行相应的修改x,y 结束 9 数据结构课程设计—走迷宫游戏 总流程: 开始 模块初始化 加载迷宫地图 N 判断键是 否按下 N 启动计时 Y 是否撞墙 老鼠移动 N Y 时间为零 停止移动 到达终点 N Y Y 游戏结束 面向对象而非面向工程的程序设计,事件和判断都具有同时性和并发性。 游戏界面显示 10 数据结构课程设计—走迷宫游戏 小老鼠操作 点击开始按钮 新建登陆dlg类对象,并且显示出来 初始化迷宫数组 根据对应的迷宫数组初始化迷宫地图,同时初始化背 景音乐,显示当前设置时间和剩余时间。 四 调试分析 内容包括:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析。 1.实际完成的情况说明(完成的功能,支持的数据类型等); 基本功能都已经完成,而且还加了保存图片、载入图片、设置时间、游戏帮助等功能。不足的是,没有最短路径这一功能,之所以这样,是因为,在我设计的这个迷宫游戏中,最短路径并没有太大作用。 2.上机过程中出现的问题及其解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ; (1) 问题:每次走完迷宫,它都会保持现有状态,如果重新开始,要自己按 重新开始,次才能开始,很麻烦。 解决方案:void CMainFrame::OnTimer(UINT nIDEvent)函数中调用void CMainFrame::OnOpen(),这样在每次游戏结束时就可以调用这个 函数,载入图片。 (2)问题:通过键盘来如何控制对象(老鼠)的移动,我希望达到一种老鼠会 动的效果,即朝左走头往左哦哦,朝右走,头朝右。 解决方案:导入一组老鼠图片,用数组进行控制,没走一步判断调用哪 一组老鼠图片。 (3)问题:键盘控制时老是出错。 解决方案:后来通过CSDN、博客园等IT技术社区找到了相关文章,如果 你按键没有反应是因为它把你的消息转发到了其它的激活窗口的 处理程序上,可以试着点击窗口的空白区域,不让任何子控件获得 焦点(没有任何一个控件有一个虚线的框)的时候,这个就能激活 了。 11 数据结构课程设计—走迷宫游戏 3.程序中可以改进的地方说明; 本文的研究虽然取得了初步的成功,但依然任重道远,尚有许多有待进一 步深入进行的研究工作,这里择其要者简要讨论如下: (1)本程序选择的是结构体,这样注定有些功能并不能很好的实现,可以改 进用树,利用层次序遍历算法和树与二叉树的转换算法,对整个迷宫进 行扫描。 (2)界面还可以在优化。 (3)可以再添加一些功能,是走迷宫游戏更人机。 (4)迷宫图太简单,还可以更复杂,更有挑战性。 4.程序中可以扩充的功能及设计实现假想。 (1)功能上还可以再完善,例如可以加一个分数排行榜, 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 分数最高的几 个记录。 (2)求最优路径。 五、测试结果 (1)如果不按开始按钮,会弹出一下对话框,如(图一) (图一) (2)游戏顺利进行,并成功。如(图二) 12 数据结构课程设计—走迷宫游戏 (图二) (3)自动寻路完成,如(图三) (图三) (4)自动寻路完成,如(图四) (图四) (5)走完全部的路,如(图五) 13 数据结构课程设计—走迷宫游戏 (图五) (6)非法输入: 当小老鼠上、下、左、右移动时,如果按下非以上四键,老鼠呆在原地不动。 对游戏和程序没有影响。 六、用户手册 (1)打开exe,即出现下(图六) (图六) (2)标题栏 (3)开始按钮如(图八) 14 数据结构课程设计—走迷宫游戏 (图八) (4)游戏设置按钮,如(图九) (图九) (5)帮助按钮 (6)音效按钮 (7)难易程度按钮 (8)退出按钮 15 数据结构课程设计—走迷宫游戏 (9)根据个人需要可以设定时间,点击上述游戏设置按钮下的设置时间 (10)操作工程中,注意左下方的时间 (11)如对游戏规则不清楚,可以打开有助按钮下的游戏帮助 七、体会与自我评价 这次课程设计历时两周之久,但对于我来说,时间还是比较紧的。 刚看到题目的时候,的确感觉有点难,是老鼠走迷宫。而且要老鼠清晰可辨,墙足够坚硬,用键盘的方向键来控制老鼠的行动,用c语言编程感觉有点难做到,而且用C去展现迷宫图感觉看着不是太舒服,思来想去觉得用mfc比较好~好在 16 数据结构课程设计—走迷宫游戏 之前两个周用mfc编了五子棋,有了一定的基础。Mfc做出的界面比较好看,而且还可以加一些背景音乐什么的。 以前觉得数据结构很枯燥,而且编程的时候还不怎么用。现在才发现那只是简单的语句来堆砌出一段程序,没有章程。现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的目标了。这样无形中就提高了自己编写的程序的质量。本设计中,虽然存在一些瑕疵,有些地方没有达到预想的效果,整体来说还算完成任务。这次课设着实让我体会到软件工程的艰辛,整个程序可能因为一个细小部分而花去你数倍的时间去调试,使我明白调试是开发人员一项非常重要的基本功,而且不能急躁,要有耐心。同时还有认真仔细,尽量保证不出现错误。编程要有条理,不仅使自己要看懂 ,别人也能看懂,这样有利于程序的改正。 通过这次课程设计,我对数据结构有了更多的深刻认识,对栈的运用更加熟练;而且对mfc也有了进一步的学习,我发现mfc功能其实很强大,能够完成很多功能,以后对mfc还要不断学习;同时也收获了很多的成长,做什么事都要有 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 ,合理安排这样的时间来完成这些作业,不像这次最后熬夜才弄完。 不过,真的很高兴,遇到困难,经过查资料,问老师、同学,最后解决问题,真的很有成就感,可以增强自己的自信心,在以后无论遇到什么困难只要认真对待,一定能够解决。在此我要感谢同学们及几位老师在此次课程设计中对我的指导和帮助。 17
本文档为【数据结构课设-走迷宫游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_321575
暂无简介~
格式:doc
大小:194KB
软件:Word
页数:24
分类:高中语文
上传时间:2017-09-02
浏览量:66