




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言课程设计报告模拟驾驶及交通知识学习系统 目录一、引言31.任务背景32.编写目的33.任务概述4二、功能和操作介绍4三、系统设计分析91.程序流程图92.程序模块化分析11三、重要数据的说明16三、核心算法的分析22五程序制作过程难点分析26六、不足之处28七、程序设计过程的体会29八、参考资料30九、程序源代码30一、 引言1.任务背景 随着我国经济的发展,人们的生活水平也迅速提高,在很多方面都发生了翻天覆地的变化。过去人们上班靠步行、自行车,然而如今大多是城市的上班族都开上了自己的小轿车。我国的轿车数量也逐年呈高速增长,当然随之而来的就是城市交通的拥挤和交通事故的频繁发生。如何改善这一现状成为了改善城市质量的关键因素,比如,如果武汉的交通好一点,那么来武汉的人会更多,这对武汉整个城市经济、文化将会带来好处。大家都知道,武汉的公交司机开车的速度往往令人揪心,闯红灯也是难免的,那么如何提高司机的安全意识,改善交通质量呢?近年来,国家颁布了很多交通方面的法律法规,这多少起到了一点作用,但是,我应该正确的认识到,我们还有很多要做。2.编写目的 本次C语言课程设计旨在以实际驾驶为背景锻炼自己的C语言编写能力,对上学期所学知识的一个全面综合的运用,将理论用于实践。此外,这次课程设计涉及到很多以前未曾学过,较之以前更为高级和深奥的知识,而这些都需要自己去查找,去学习,这对于学生自学能力的提高很有好处,也是对学生自我的一个很好的挑战。 另外,此次课程设计对于学生了解软件和硬件的关系和区别有实际的意义,对于学生了解DOS环境也很有好处。 在思维上,打破了以前学习C语言时的固有思想。原来只是知道一个函数一个功能,以为C语言就是这么一回事,就用来做这个,而且那时程序量比较小还真不知道C语言能够用来做什么。现在通过课设,才知道C语言用处的巨大,以及由一个个功能函数组成的模块化,流程化。3.任务概述该程序主要用来对实际驾驶的仿真,因此大部分应该遵循事实,不能够主观臆造。对此,该程序必须具备对小车转弯的控制,刹车,路线图,以及交通灯的控制等功能。该系统给予tc2.0和bc31开发,适用于dos3.0以上的所有dos版本和windows操作系统;本软件设计中加入了鼠标和键盘操作,因此操作过程必须依赖鼠标和键盘才能实现所有功能;本软件对于显示卡无特殊要求。二、 功能和操作介绍以下是在整个程序运行的过程中会出现的重要界面,在这里一一叙述界面一、进入模拟驾驶前制作人说明界面说明:进入此界面后,语言说明部分从上往下运动,到适当位置停止,后按任意键进入下一个界面实现方式:主要用bar()去覆盖以前的汉字,在加入getch(),任意键继续。界面二、小车开始运动前的静态界面,支持鼠标操作说明:在此界面上,可以用鼠标点击“开始”“任务”“帮助”“退出”四个按钮,出现不同的提示界面在静态界面上点击“帮助”说明:点击后弹出一个信息提示窗口,根据其内容进行下一步操作以及小车在运动时的键盘控制。W表示向左转S表示向右转P表示暂停空格键表示急刹车在静态界面上点击“任务”说明:点击后弹出一个信息提示窗口,其内容是自己主观加上去的,避免单独行车的乏味,单调。故加入了一个任务。 根据提示说明,必须到达某家庭接到伤者,并将其送上下左右键代表上下左右运动 ESC表示退出程序 到医院,此为完成了任务。在完成任务后,到达终点线时才会能够得到自己使用时间,和提示是否继续。实现的方式:在设置小车结构体是加入一个标记变量count,在任务的过程中,根据相应的情况改变count 的值,又根据count的值来进行相应的判断。比如:在小车在到达终点线时,如果count=2才会有提示完成任务的界面,否者在到达终点线时没有任何反应。界面三、点击开始进入模拟驾驶说明:在到达指定家庭后,会出现左边所示提示框,说明接到病人,此时count变为1。此时小车的速度为零。 点击“确定”后,提示框消失,继续前进。实现方式:根据小车与house的相对位置来判断,在一定的范围内可以弹出此提示框。闯红灯说明:在交通灯为红灯的时候,如果小车超过了,人行道,会弹出初始框。点击“确定”后,程序后自动在1秒后进入交通知识学习系统。实现方式:根据与交通灯的相对位置和此时交通灯的颜色给出判断。界面四、交通规则学习系统说明:在出现闯红灯提示后,点击“确定”1秒后进入此界面。此界面用到了三种大小的汉字,分别调用了hzk16hzk24,hzk32。 点击“next”进入交通知识学习的下一页。实现方式:此处,关闭了原来的图形模式,用VGAHI模式实现,这种界面比例比较合适,看起来比较好。交通规则学习第二页说明:点击“我接受”,退出交通规则学习系统,关闭当前图形模式。到达界面三,继续前进。 界面四主要是对汉字的处理,由于函数中有一个show_hanzi()函数,此函数的功能比较全面,可以自己确定汉字输出的位置、大小、间距和颜色。此外,该界面与前后界面有图形模式的切换,但是并不影响到程序的正常运行,相反,在切换的过程中由于出现短暂的黑屏,是程序显得更为真实。界面三、到达hospital说明:达到医院,弹出如左图的提示框。点击“确定”即完成了任务。此时的count=1表示接到伤员了。界面三、到达hospital说明:达到医院,弹出如左图的提示框。此时的count=0,表示没有接到伤员界面三、到达终点线说明:达到终点线,弹出如左图的提示框。此框中显示了你完成任务所用的时间点击“确定”进入下一个提示框 此时,count必须为2界面三、到达终点线说明:在前图中点击“确定”后弹出如左图提示框。 通过左右键可以改变选中的按钮,如选中“继续”,按ENTER后,整个过程会重新再来。计时的时间也会清零。如选中“不继续”,按ENTER后,程序结束。三、系统设计分析1.程序流程图否否是退出程序是否继续到达终点线到达hospital点击任务点击开始点击帮助点击“我接受”交通知识学习系统是是否闯红灯到达house空格键P/ESCW/S键盘控制小车的运动速度条清空,计时时间归零,小车置于起始处点击关闭提示框退出程序帮助提示任务提示开始驾驶点击退出主界面、菜单进入程序,开始动画题目、制作人2.程序模块化分析本程序共有 5个主要的模块:1) 汉字显示模块。该模块主要由一个比较大的函数构成,即show_hanzi(int x ,int y,char *s,int flag,int part,int color);该函数具有很好的灵活性,可以根据需要改变汉字的大小、字体、颜色和间距等参数。本程序在所有用到汉字显示的地方均调用该函数来实现。由于本程序用到汉字的地方比较多,因此对整个程序而言,一个好的汉字显示函数可以帮助解决很多问题,达到比较好的效果。此外,为了增加该函数的通用性,在编写函数时将汉字最大的横向显示位置定在620处,因此在调用该函数时,一般采用分行对汉字进行显示,避免了对不同的汉字长度需要去修改汉字显示本身的代码。2) 图形的绘画模块。该模块主要包括以下函数:/*制作人行道,人物能够根据红绿灯做出相应的变化*/void footwalk(int x,int y,int state);/*画人的函数*/void people(int x,int y);/*画简易小车的函数*/void smallcar(SCAR *scar);/*画正常状态按钮的函数*/void draw_button(BUTTON * p,int color);/*画按钮在高亮状态时的函数*/void draw_light(BUTTON *t);/*画横向道路的函数*/void street1(STREET1 *ptp1);/*画纵向道路的函数*/void street2(STREET2 *ptp2);/*画树的函数*/void tree(TREE *ptp);/*画小车的函数*/void draw_car(CAR *pcp);/*小车旋转的函数*/void shift (double angle,int *body,int *win,int *head,int *rear,int *L_h_light,int *R_h_light,int *L_r_light,int *R_r_light,int x,int y) ;/*画房屋的函数*/void house(HOUSE *php);/*画十字路口的函数*/void cross_light(CROSS *prp);/*画医院的函数*/void hospital(HOSPITAL *psp);/*画起始线的函数*/void startline(STARTLINE *pslp);/*画终点线的函数*/void finishline(FINISHLINE *pflp);/*画湖中的船的函数*/void boat(BOAT *pbp);/*画湖的函数*/void lake(LAKE *plp); 由于本程序涉及到的图形类型比较多,故画了大量的图形来完成小车及其背景的设计。 该模块的函数主要放在两个文件里,一个是对整个程序来说主要的图形,比如小车,交通灯等,另外一个文件存放一些比较次要的图形,比如树,湖,船等图形。3) 程序开始时的动画提示模块。包含两个函数即 void start(); void chushi();此模块比较简单,相对于整个程序来说比较独立,仅在程序开始时调用一次。4) 小车运动过程中的判断模块。此模块包含以下函数: /*整个程序运行过程中的判断模块*/void judgehospital(CAR *pcp,HOSPITAL *psp,char *time);/控制是否到达医院void judgehouse(CAR *pcp,HOUSE *php,char *time);/控制是否达到指定房屋void judgechujie(CAR *pcp);/判断是否出界void judgelight(CAR *pcp,CROSS *prp0,char *time);/判断是否闯红灯int judgefinishline(CAR *pcp,FINISHLINE * pflp,char *time);/判断是否到达终点线void tishi(int x,int y,char *time,int flag);/根据判断的结果给出相应的提示 此模块中函数的调用贯穿整个程序的运行,由不同的函数时时检验小车的位置和状态,达到控制小车行为的目的。因此,该模块在整个程序中的地位相当重。5) 小车运动过程中的控制和显示模块。小车的控制函数主要有: /*整个函数主要的控制模块*/CAR *car_control(CAR *pcp,STREET1 *ptp11);/控制小车的运动int other_control(CROSS *prp0,HOUSE *php,CAR *pcp,STREET1 *ptp10,STREET1 *ptp11,STREET1 *ptp12,STREET1 *ptp13,STREET2 *ptp20,STREET2 *ptp21,HOSPITAL *psp,FINISHLINE *pflp,STARTLINE *pslp,LAKE *plp,BOAT *pbp,TREE *ptp);/控制整个背景的运动 这两个函数用在画图前,主要用于对小车及其背景相关参数的改变和更新,以期达到很好的控制小车的目的。第一个函数主要是通过传入的小车和背景前一时刻的参数,由相应的条件判断可以执行的操作,再根据相应的操作去改变这些参数来控制小车,在此函数中,背景为静态的。第二个函数由当前的参数觉得操作,此函数中,小车在屏幕上的高度是不会改变的,这样到达了一个拉屏的效果。由于有前人的经验,鉴于自己的程序涉及的图元比较多,整个界面控制起来可能会比较复杂,因此很快就确定了小车的显示动画采用换页的方法。主要代码如下:while(1) setactivepage(0);/将第0页作为当前页画图 cleardevice(); pcp1=car_control(&cp,&tp11);/调用小车控制函数处理数据speed=other_control(&rp,&hp,pcp1,&tp10,&tp11,&tp12,&tp13,&tp20,&tp21,&sp,&flp,&slp,&lp,&bp,ptp);/调用背景控制函数处理数据 /*数据更新后画出新的图*/ street1(&tp10); street1(&tp11); street1(&tp12); street1(&tp13); street2(&tp20); street2(&tp21); cross_light(&rp); startline(&slp); finishline(&flp); lake(&lp); boat(&bp); for(i=0;i24;i+) tree(&tpi); port(pcp1,speed,&tp11); time=Clock(flag); hospital(&sp); house(&hp); draw_car(pcp1); setvisualpage(0);/将第0页置为可见 /*调用判断函数,并显示判断结果*/ judgechujie(pcp1); judgehouse(pcp1,&hp,time); judgehospital(pcp1,&sp,time); judgelight(pcp1,&rp,time); again=judgefinishline(pcp1,&flp,time); if(again=1)/若到达终点,决定是否继续 break; delay(20); setactivepage(1);/将第1页作为当前页画图 cleardevice(); pcp1=car_control(&cp,&tp11);/调用小车控制函数处理数据 speed=other_control(&rp,&hp,pcp1,&tp10,&tp11,&tp12,&tp13,&tp20,&tp21,&sp,&flp,&slp,&lp,&bp,ptp);/调用背景控制函数处理数据 /*数据更新后画出新的图*/ street1(&tp10); street1(&tp11); street1(&tp12); street1(&tp13); street2(&tp20); street2(&tp21); cross_light(&rp); startline(&slp); finishline(&flp); lake(&lp); boat(&bp); for(i=0;ixspeed)*(pcp-xspeed)+(pcp-yspeed)*(pcp-yspeed)+speed1*speed1); 其中speed1=sqrt(speed*speed+cxs*cxs);在背景不动的情况下,speed=0,cxs=0;flag取决于pcp-xspeed和pcp-yspeed在背景动的情况下,pcp-xspeed和pcp-yspeed均为0,cxs用来表示小车横向的速度,speed用来表示背景的速度(看起来为小车的纵向速度)。另外一个重要数据是时间。 本程序中用Clock()函数来实现时间的计算。char * Clock(int flag) /读系统的时间,来控制钟的运行。 struct time t; long end; static long start; static int First1,count; static char str210=00:00, ; gettime(&t); end=t.ti_hour*3600+t.ti_min*60+t.ti_sec; if(!(First1) start=end; if(end-start=1) /系统时间改变一秒,显示时间加一秒 start=end; count+; if(flag=1) count=0; /*用于确定时间的表示方式*/ if(count/6010) str01=count/60+0; else str00=(count/60)/10+0; str01=(count/60)%10+0; if(count%60x)+=(pcp-xspeed); (pcp-y)-=(pcp-yspeed); /*有按键操作*/ else if(bioskey(1) int ch=bioskey(0); switch(ch) case UP : /向上,小车的纵向速度增加1 if(pcp-yspeedyspeed=(-3) pcp-yspeed+=1; if(pcp-yspeed=3) pcp-yspeed+=0; break; case DOWN : /向下,小车的纵向速度减少1 if(pcp-yspeedyspeed(-3) pcp-yspeed+=-1; if(pcp-yspeed=(-3) pcp-yspeed+=0; break; case RIGHT : /向右,小车的横向速度增加1 if(pcp-xspeedxspeed=(-4) pcp-xspeed+=1; if(pcp-xspeed=4) pcp-xspeed+=0; break; case LEFT: /向左,小车的纵向速度减少1 if(pcp-xspeedxspeed(-4) pcp-xspeed+=-1; if(pcp-yspeed=(-4) pcp-xspeed+=0; break; case W : /W,小车逆时针转动 pcp-angle+=5; break; case S : /S,小车顺时针转动 pcp-angle-=5; break; case SPACE : /急刹车 pcp-xspeed=0; pcp-yspeed=0; break; case P: /暂停 while (bioskey(0)!=P); break; case ESC: /退出 closegraph(); goodbye(); exit(0); default : break; 背景动: if(!bioskey(1)/无按键操作 prp0-y+=speed; ptp10-y+=speed; ptp11-y+=speed; ptp12-y+=speed; ptp13-y+=speed; ptp20-y+=speed; ptp21-y+=speed; php-y+=speed; psp-y+=speed; pflp-y+=speed; pslp-y+=speed; plp-y+=speed; pbp-y+=speed; for(i=0;iy+=speed; ptp+; ptp=ptp1; pcp-x+=cxs; else if(bioskey(1) int ch=bioskey(0); switch(ch) case UP :/上键,背景下移 if(speed=(-3) speed+=1; if(speed=3) speed+=0; break; case DOWN : /下键,背景上移 if(speed(-3) speed-=1; if(speed=(-3) speed-=0; break; case RIGHT : /右键,小车右移 if(cxs=(-4) cxs+; if(cxs=4) cxs+=0; break; case LEFT: /左键,小车左移 if(cxs(-4) cxs-; if(cxs=(-4) cxs-=0; break; case W : /W,小车逆时针转动 pcp-angle+=5; break; case S : / S,小车顺时针转动 pcp-angle-=5; break; case SPACE : speed=0; cxs=0; break; case P: while (bioskey(0)!=P); break; case ESC : closegraph(); goodbye(); exit(0); 五程序制作过程难点分析1)如何去确定界面 在拿到题目时,有很多种想法,经过一段时间的思考和验证,最终在两个方案中犹豫。一种是整个背景都是静止的,在界面上上画上相应的图形然后让小车在这个唯一的背景中运动。但是这个方案存在两个很难解决的问题,一个是完全在一个界面上运动,界面上的图形看起来会很小,那么此时的小车也会异常的小车,让人看起来感觉很不好。另外由于道路的狭窄,小车在转弯时很可能会移出道路的边界线,操作必须十分小心。另一个问题是小车转弯的控制,如是这种方案,那么动画会采用图像的存储于释放来完成,而要保证小车转弯的连贯性,就必须在事先存储很多不同方向的小车模型。这样会很麻烦而且耗内存。另一种方案是采用换页的技术做动画。该方案同样存在问题,换页必须采用VGAMED才会有很好的效果,但是这种图形模式屏幕大小是350*640,界面比较小,放置的图元比较少,要完成任务就必须涉及到拉屏或是类同的方法,而拉屏技术对内存的要求比较高,Borlandc很难满足,而且小车转弯背景的转动也是一个很难解决的问题。那就必须找另外的方法来代替拉屏技术。结果多天的思考和忖度,最终决定用第二种方式并在无疑中想到了本程序中用到的方法,即小车和背景分别在不同的情况下运动。因为若是单独让背景动小车不动那么处理起来会非常麻烦。而本程序的方法实现起来异常的简单,效果也不会太差。2)内存方面的问题 在做鼠标点击菜单中的按钮时,由于某些按钮会调用的子函数会涉及到getimage()函数,刚开始时,程序总是报汉字库不存在。显然汉字库和汉字处理函数时没有问题的。当时用了很长时间去研究这个问题,也请教了很多同学,但是大家都没有遇到过这个问题也就不知道如何解决。我将这个问题放了几天,在拿到其他同学的电脑上去运行,但是问题依旧。最后我将很大的一个鼠标控制语句一点一点的减少,最后就留下一个按钮。此时发现有的按钮可以正常工作,有的却仍然出现汉字库不存在的错误。将两个按钮的内容仔细比较发现,两个按钮调用的子函数不同,而出现问题的按钮的子函数用了getimage()函数,我猜想是不是内存不够的原因,因此将所存的图像大小变为原来的一半,在此运行时就顺利通过了。 从上面的过程可以看出,内存问题是一个很难解决的问题,因为很多时候她都是以不同的方式提示,比如这里说汉字库不存在。一次面对这种问题时,要多方面查找原因。3)在此过程中遇到的比较小的问题 a.在画图前要将鼠标隐藏,否者会出现难看的小方格。 b.画图时,尽量讲一个图元用一个点表示,此外注意图元的扩展性。(大小、颜色等应该很好调节) c.new,clock等不能作为自定义的函数名。 d.单独的点不能被异或掉,直线可以。4)鼠标问题 鼠标在C语言中对于初学者来说都是比较纠结的。刚开始我是用的系统鼠标,操作的比较好。但是在改为自己画的鼠标的时候就出现了很多问题,比如何时去隐藏鼠标,由于自己用的异或方式处理的鼠标,刚开始时出现了很多重影和印迹,后来在逐步运用的过程中队鼠标有了更深的了解才一点一点解决这些。 5).C文件和.CPP文件在数组方面有些不同。比如: int body10=x-20*sf,y+12*sf,x+20*sf,y+12*sf,x+20*sf,y-12*sf,x-20*sf,y-12*sf,x-20*sf,y+12*sf;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化遗产保护传承战略研究试题及答案
- 2025年网络运营主管职业素养测评试题及答案
- 2025年数控精密车削中心项目合作计划书
- 炮台竞智中学数学试卷
- 秦岭六年级上册数学试卷
- 连云港中考原题数学试卷
- 涂层涂层结合强度分析报告
- 每个地区中考数学试卷
- 宁波电大高等数学试卷
- 历年武汉四调数学试卷
- 消防基础知识与常识
- 2025年房地产开发商独家代理销售合作协议范本
- 排污许可审核方案投标文件(技术方案)
- 临床医学特招考试题及答案2025版
- 2025阿拉尔经济技术开发区第二轮(4人)考前自测高频考点模拟试题附答案详解
- 双拥经费管理办法
- 人社部劳动合同2025年
- 广东珠海万山海洋开发试验区发展改革和政策研究局招聘合同制职员笔试模拟试题附答案详解
- 人工智能助力实验学校教育质量提升实施方案
- 商务寄卖行管理办法
- 2025版小学语文新课程标准
评论
0/150
提交评论