




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
辽 宁 工 业 大 学 C语言程序设计 课程设计(论文)题目: 迷宫设计 院(系): 软件学院 专业班级: 计算机信息管理101班 学 号: 101403004 学生姓名: 彭福祯 指导教师: 翟宝峰 教师职称: 副教授 起止时间:2010.12.20至2010.12.31 课程设计(报告)任务及评语院(系):软件学院 教研室:软件教研室学 号101403004学生姓名彭福祯专业班级计算机信息管理101班程序设计(报告)题目迷宫问题程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩: 指导教师签字: 2011 年 1 月 4 日辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)目 录第1章 课程设计的目的与要求11.1 课程设计目的11.2 课程设计的实验环境11.3 课程设计的预备知识11.4 课程设计要求1第2章 课程设计内容22.1课程设计题目22.2课程设计整体设计说明22.2.1课程设计内容22.2.2系统功能模块结构图22.2.3数据结构设计及用法说明22.2.4程序结构(画流程图)22.2.5各模块的功能22.3程序源代码及注释2第3章 课程设计总结3参考资料134第1章 课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言(C)课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对C语言课程的基本知识的理解和掌握 2. 掌握C语言编程和程序调试的基本技能 3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。1.3 课程设计的预备知识熟悉C语言及C语言开发工具。1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章 课程设计内容2.1程序功能介绍本课题要求随机生成一个美观逼真的迷宫图,迷宫的大小为N*N,N预定义为常数,修改N的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。用黑色表示可走的路,蓝色表示墙壁不可以通过。2.2程序整体设计说明输入表达式时,会将原来的内容清空,并且必须按照中缀表示输入。如果你细看一下中缀表达式,你就会发现,除了括号,表达式的结构是“操作数”、“操作符”、“操作数”、“操作符()”,为了统一这个规律,同时也为了使输入函数简单一点,规定括号必须这样输入“0(”、“)0”;这样一来,“0”就不能作为操作数出现在表达式中了。因为我没有在输入函数中增加容错的语句,所以一旦输错了,那程序就“死”了。 表达式求值的过程是,先变成后缀表示,然后用后缀表示求值。2.2.1设计思路1. 用矩阵表示的迷宫;2. 将矩阵表示的迷宫转换成无向图,用邻接表存储;3. 对无向图从入口结点开始广度优先搜索;4. 用一个一维数组存储各个结点的前驱结点的编号;5. 输出用0代表通路,1代表墙壁。6. 依次类推直到找到出口结点。2.2.2数据结构设计及用法说明 1)int mapNN; /*迷宫数组*/作用是对迷宫数组的定义。2)char ch /*一个字符变量*/作用是判断寻路功能是人工完成还是机器完成。3)int oldmapNN;/*递归用的数组一个全局变量方便操作*/作用是进行递归调用是拷贝原地图进行判断和标记。4)int yes=0/*全局变量*/ 作用是对出口的判断0表示没有找到出路1表示找到出路。5)int gd=DETECT,gm作用是对图形进行初始化 2.2.3程序结构(流程图)Y=1Y=-1开始输入xx=0x0Y=0输出y结束假假真真图 2.1 程序流程图2.2.4各模块的功能及程序说明一般的迷宫为二维平面图形,将迷宫的左上角作入口,右下角作出口,求出从入口点到出口点的一条通路,作为线性结构的典型应用,大多用非递归方法实现,输出用0代表通路,1代表墙壁。程序采用了一个美观逼真的迷宫图,而且是随机生成,迷宫的大小为NN,N预定义为常数,修改N的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。用白色表示可走的路,蓝色表示墙壁不可以通过。程序还设计了两种运行方式:一种是由系统自动运行探索,用递归方法实现;一种是由人工操作探索通路,颇有新意。 系统运行首先出现提示字符串“Please select hand(1) else auto”,询问是选择人工探索还是系统自动探索,当用户输入字符1按回车键后出现一个迷宫图,红色矩形块(表示探索物)出现在左上角,这是可以安代表4个方向的字符选择通路,遇到墙壁不能通行,按回车键结束探索,如果这时探索物移动到右下角出口,则显示找到通路信息,否则显示没找到通路信息。 在提示信息后,如果输入的字符不是1,则系统自动查找通路,如果没有找到通路,则显示没有找到通路信息。如果找到通路,则用红色标记走过的路径2.2.5程序结果 图2.2 程序结果图2.3 程序结果2.3程序源代码及注释#include #include #include #include #define N 20/*迷宫的大小,可改变*/int oldmapNN;/*递归用的数组,用全局变量节约时间*/int yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/int way1002,wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/void Init(void);/*图形初始化*/void Close(void);/*图形关闭*/void DrawPeople(int *x,int *y,int n);/*画人工探索物图*/void PeopleFind(int (*x)N);/*人工探索*/void WayCopy(int (*x)N,int (*y)N);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/int FindWay(int (*x)N,int i,int j);/*自动探索函数*/void MapRand(int (*x)N);/*随机生成迷宫函数*/void PrMap(int (*x)N);/*输出迷宫图函数*/void Result(void);/*输出结果处理*/void Find(void);/*成功处理*/void NotFind(void);/*失败处理*/void main(void)/*主函数*/int mapNN; /*迷宫数组*/char ch;clrscr();printf(n Please select hand(1) else auton);/*选择探索方式*/scanf(%c,&ch);Init(); /*初始化*/MapRand(map);/*生成迷宫*/PrMap(map);/*显示迷宫图*/if(ch=1)PeopleFind(map);/*人工探索*/elseFindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/Result();/*输出结果*/Close();void Init(void)/*图形初始化*/int gd=DETECT,gm;initgraph(&gd,&gm,c:tc);void DrawPeople(int *x,int *y,int n)/*画人工控制图*/*如果将以下两句注释掉,则显示人工走过的路径,*/setfillstyle(SOLID_FILL,WHITE); /*设置白色实体填充样式*/bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢复原通路*/switch(n)/*判断x,y的变化,8个方向的变化*/case 1: (*x)-;break; /*上*/case 2: (*x)-;(*y)+;break ;/*右上*/case 3: (*y)+;break; /*右*/case 4: (*x)+;(*y)+;break; /*右下*/case 5: (*x)+;break; /*下*/case 6: (*x)+;(*y)-;break; /*左下*/case 7: (*y)-;break; /*左*/case 8: (*x)-;(*y)-;break; /*左上*/setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);void PeopleFind(int (*map)N)/*人工手动查找*/int x,y;char c=0;/*接收按键的变量*/x=y=1;/*人工查找的初始位置*/setcolor(11);line(500,200,550,200);outtextxy(570,197,d);line(500,200,450,200);outtextxy(430,197,a);line(500,200,500,150);outtextxy(497,130,w);line(500,200,500,250);outtextxy(497,270,x);line(500,200,450,150);outtextxy(445,130,q);line(500,200,550,150);outtextxy(550,130,e);line(500,200,450,250);outtextxy(445,270,z);line(500,200,550,250);outtextxy(550,270,c);/*以上是画8个方向的控制介绍*/setcolor(YELLOW);outtextxy(420,290,Press Enter to end);/*压回车键结束*/setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显示*/while(c!=13)/*如果按下的不是回车键*/c=getch();/*接收字符后开始各个方向的探索*/if(c=w&mapx-1y!=1)DrawPeople(&x,&y,1);/*上*/elseif(c=e&mapx-1y+1!=1)DrawPeople(&x,&y,2);/*右上*/elseif(c=d&mapxy+1!=1)DrawPeople(&x,&y,3);/*右*/elseif(c=c&mapx+1y+1!=1)DrawPeople(&x,&y,4);/*右下*/elseif(c=x&mapx+1y!=1)DrawPeople(&x,&y,5);/*下*/elseif(c=z&mapx+1y-1!=1)DrawPeople(&x,&y,6); /*左下*/elseif(c=a&mapxy-1!=1)DrawPeople(&x,&y,7); /*左*/else if(c=q&mapx-1y-1!=1)DrawPeople(&x,&y,8); /*左上*/setfillstyle(SOLID_FILL,WHITE); /*消去红色探索物,恢复原迷宫图*/bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x=N-2&y=N-2)/*人工控制成功的话*/yes=1; /*如果成功标志为1*/void WayCopy(int (*oldmap)N,int (*map)N)/*拷贝迷宫数组 */int i,j;for(i=0;i for(j=0;j oldmapj=mapj;int FindWay(int (*map)N,int i,int j)/*递归找路*/if(i=N-2&j=N-2)/*走到出口*/yes=1;/*标志为1,表示成功*/return;mapj=1;/*走过的地方变为1*/WayCopy(oldmap,map); /*拷贝迷宫图*/if(oldmapi+1j+1=0&!yes)/*判断右下方是否可走*/FindWay(oldmap,i+1,j+1);if(yes)/*如果到达出口了,再把值 赋给显示路线的way数组,也正是这个原因,所以具体路线是从最后开始保存*/waywayn0=i;waywayn+1=j;return;WayCopy (oldmap,map)if(oldmapi+1j=0&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/FindWay(oldmap,i+1,j);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapj+1=0&!yes)/*判断右方是否可以走*/FindWay(oldmap,i,j+1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j=0&!yes)/*判断上方是否可以走*/FindWay(oldmap,i-1,j);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j+1=0&!yes)/*判断右上方是否可以走*/FindWay(oldmap,i-1,j+1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi+1j-1=0&!yes)/*判断左下方是否可以走*/FindWay(oldmap,i+1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapj-1=0&!yes)/*判断左方是否可以走*/ FindWay(oldmap,i,j-1);if(yes)waywayn0=i;waywayn+1=j;return;WayCopy(oldmap,map);if(oldmapi-1j-1=0&!yes)/*判断左上方是否可以走*/FindWay(oldmap,i-1,j-1);if(yes)waywayn0=i;waywayn+1=j;return;return;void MapRand(int (*map)N)/*开始的随机迷宫图*/int i,j;cleardevice();/*清屏*/randomize(); /*随机数发生器*/for(i=0;i for(j=0;j if(i=0|i=N-1|j=0|j=N-1)/*最外面一圈为墙壁*/mapj=1;elseif(i=1&j=1|i=N-2&j=N-2)/*出发点与终点表示为可走的*/mapj=0;elsemapj=random(2);/*其它的随机生成0或1*/void PrMap(int (*map)N)/*输出迷宫图*/int i,j;for(i=0;i for(j=0;j if(mapj=0)setfillstyle(SOLID_FILL,WHITE);/*白色为可走的路*/bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);elsesetfillstyle(SOLID_FILL,BLUE);/*蓝色为墙壁*/bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);void Find(void)/*找到通路*/int i;setfillstyle(SOLID_FILL,RED);/*红色输出走的具体路线*/wayn-;for(i=wayn;i=0;i-)bar(100+way1*15-6,50+way0*15-6,100+way1*15+6,50+way0*15+6);sleep(1);/*控制显示时间*/bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6); /*在目标点标红色*/setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/outtextxy(130,400,Find a way!);void NotFind(void)/*没找到通路*/setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/outtextxy(130,400,Not find a way!);void Result(void)/*结果处理*/if(yes)/*如果找到*/Find();else/*没找到路*/NotFind();getch();void Close(void)/*图形关闭*/closegraph();第3章 课程设计总结我的题目是迷宫游戏的设计,对于我们这些新手来说,这是很大的考验,怎么才能让自己的程序在篇幅上简单,在使用价值上丰富?怎样让自己的计划更具有序性,而不会忙无一用?机会是老师,学校,以及无数代教育工作者给的,而能力是自己的,耐性是需要的。经过自己的琢磨,听取了师姐,师兄们的建议,还查阅了很多书籍,才做到了心中有数,才了解了C语言课程设计的真正用意培养自学能力,养成程序编辑的好习惯。我要积极,要把握,要努力。我们自己能做到的仅此而已,因为人力也有所不能及。开始我不知道从哪里下手做这个课件,刚刚拿到时更是一塌糊涂,什么也不懂,后来渐渐的理清了头绪,从头开始做这个课件,从第一项开始。慢慢的查阅的资料越来越多,知道的方法就越来越多,终于在不断努力下完成了这个课件。在设计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医用药技能考试题及答案
- 安全月知识考试题及答案
- 2025洪水公务员面试题及答案
- 旅游商业地产商铺返租与全域旅游经营管理合同
- 股份代持与知识产权保护合同
- 企业员工集资共建职工餐厅协议
- 老师专业考试试题及答案
- 消防安全演习培训内容课件
- 2025至2030节能建材行业发展趋势分析与未来投资战略咨询研究报告
- 愚公移山翻译工作总结
- 生物医药公司采购管理制度
- 煤矿关联交易管理制度
- 器械UDI码管理制度
- 印章管理工作培训
- 园林养护班组管理制度
- 矿业公司股权转让与资源开发合作协议
- 司马懿的课件
- 2025年餐饮系统项目市场调查研究报告
- 2025年人教版高中物理必修3专项复习:电势差与电场强度的关系(解析版)
- 国有融资担保公司笔试真题解析
- 资金过账协议合同协议
评论
0/150
提交评论