版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录课程设计目的……………3课程设计任务与要求…………………32.1课程设计内容…………32.2课程设计要求…………32.3课程设计环境…………3课程设计方案……………33.1方案论证………………33.2程序整体设计说明………33.3设计思路………………43.4设计总体流程图………43.5设计的具体实现………5程序测试…………………84.1测试内容与结果………84.2程序运行效果图………9课程设计总结…………106.参考文献…………………11附录源程序…………………11课程设计目的:复习、巩固才C、C++的基础知识,进一步加深对VC技术的理解和掌握;课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。培养学生在项目开发中团队合作精神、创新意识及能力课程设计任务与要求2.1课程设计内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC的课程设计。最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。2.2课程设计要求对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;说明书、流程图要清楚;记录设计情况(备查,也为编写设计说明书作好准备);2.3课程设计环境Windows7操作系统,VC6.0开发环境。课程设计方案3.1方案论证方案一:基于MFC设计该方案的好处是系统自动生成软件框架,设计者只需填充编写的代码即可,程序设计比较复杂,对于编程能力不强的同学来说难度较大。方案二:基于easyX设计该方案的好处是设计者只需编写程序文件,完成后编译即可生成可执行文件,编程前需要先安装easyX图形库。由于编程能力不强,方案二设计简单,易于调试,故选择方案二。3.2程序整体设计说明一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。游戏界面:1)开始游戏(加载并开始)2)暂停游戏(从当前进度结束)3)重新开始(在某一时刻暂停后可以继续接着玩)游戏设置:1) 蛇的颜色(红色)2) 游戏帮助(游戏控制说明)3) 积分(每次吃掉一个食物增加10分,并显示出来)3.3设计思路这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。3.4设计总体流程图是是游戏结束否蛇头是否撞墙或者自身否否随机生成下一个食物根据键盘控制蛇移动方向是蛇开始移动判断是否开始载入游戏并初始化是是游戏结束否蛇头是否撞墙或者自身否否随机生成下一个食物根据键盘控制蛇移动方向是蛇开始移动判断是否开始载入游戏并初始化蛇头和食物坐标是否重合否是否蛇头和食物坐标是否重合否是否3.5设计的具体实现食物类structFood /*食物的结构体定义*/{ intx; /*食物的横坐标*/ inty; /*食物的纵坐标*/ intaddFood; /*判断是否要出现食物的变量*/};2)蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。structSnake /*蛇的结构体定义*/{intx[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ inty[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/ intjoint; /*蛇的节数*/ intdirection; /*蛇移动方向*/ intlife; /*蛇的生命,0活着,1死亡*/};初始化游戏游戏开始界面的初始化:voidInitGraph(){ cleardevice(); setbkcolor(BLUE);/*设置背景颜色*/ setcolor(WHITE);/*设置前景颜色*/ cleardevice(); setfont(25,0,_T("微软雅黑")); outtextxy(170,150,"GreedySnake");/*在坐标(170,150)处输出字符串*/ outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }绘制游戏场景setlinestyle(PS_SOLID,5)用于绘制实心的宽度为5个像素的线型,bar(i,40,i+7,47);为画一个左上角为(i,40),右下角为(i+7,47)的矩形条,rectangle(i,40,i+10,49)也用于画矩形。voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //画围墙 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上边 bar(i,40,i+7,47); bar(i,551,i+7,558); //下边 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左边 bar(591,i,598,i+7); //右边 }}结束游戏PrScore(score)用于输出分数。voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微软雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//关闭音乐 getch(); exit(0);}判断是否需要出现食物if(food.addFood==1) //需要出现新食物{food.x=rand()%400+60; food.y=rand()%350+60; //食物出现后必须在整格内才能让蛇吃到 while(food.x%10!=0) {food.x++;} while(food.y%10!=0){food.y++;} food.addFood=0; //画面上有食物 } if(food.addFood==0) //画面上有食物,则显示 {setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }7)在没有按键的情况下,蛇自己移动身体for(i=snake.joint-1;i>0;i--) //蛇的每个节往前移动 {snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四个方向,来决定蛇头的移动 switch(snake.direction){caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; }8)a.从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //显示失败 snake.life=1; //蛇死*/ break; } }b.判断蛇是否撞到墙壁if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //本次游戏结束 snake.life=1; //蛇死 }c.判断是否撞到障碍物for(intobs_i=0;obs_i<vox.size();obs_i++){ if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); }以上三种判断以后,如果蛇死就跳出内循环,重新开始。吃到食物后画蛇if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物后 { //把画面上的食物清除setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新的一节先放在看不见的位置,下次循环就取前一节的位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snake.joint++; //蛇的身体长一节 food.addFood=1; //画面上需要出现新食物 score+=10; //------------------------- PrScore(score); //输出新得分 } //画蛇 setcolor(RED); for(i=0;i<snake.joint;i++) { rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); } Sleep(gamespeed); //延时控制蛇的速度 //去除蛇的最后一节 setcolor(0); rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10); 10)按键操作key=getch();//接收按键 switch(key){//判断按键,是否往相反方向移动 case'w':case'W':{if(snake.direction!=MV_DOWN)snake.direction=MV_UP;}break; case'd':case'D':{if(snake.direction!=MV_LEFT)snake.direction=MV_RIGHT;}break; case'a':case'A':{if(snake.direction!=MV_RIGHT)snake.direction=MV_LEFT;}break; case's':case'S':{if(snake.direction!=MV_UP)snake.direction=MV_DOWN;}break; case'p':case'P':fun_pause();break; case'r':case'R':fun_reset();break; }编好程序后进行编译、运行,生成可执行文件,就可以玩贪吃蛇游戏了。4.程序测试4.1测试内容与结果1) 开始:程序运行后,会出来蓝色背景界面和提示语Ready?,按任意键开始,注意不要在中文输入法下玩。开始后只有两节的红色蛇和一个绿色的食物,并且蛇是运动的。2) 方向键和WSAD键:蛇开始运行之后,当点击上下左右键(或WSAD)蛇就会按相应的方向运动,蛇不能180度转弯,只能进行90度的转弯。程序检测时蛇确实会按点击方向运动且不会向相反方向运动,所有方向键使用正确。3) 暂停/继续:当程序正在运行时,点击暂停/继续按钮“P”,蛇停在当前的位置,再次点击“P”蛇又从当前位置继续运动。此按钮符合要求,所以暂停/继续按钮使用正确,功能能够实现。4) 重新开始:当游戏结束或想重新开始一局时,点击按钮“R”,游戏又回到最初的状态,一个食物,一个运动着的红色蛇块,且游戏积分清零。所以重新开始功能能够实现。5) 界面右侧能够出现按键提示和分数显示等有关信息。4.2程序运行效果图5.课程设计总结在设计这个程序中我主要学会了如何运用以下有关C语言和C++的知识:1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2)分析函数先从main()函数入手。Main()函数是C++源程序编译时的开始,从main()函数开始读函数可将其他函数的功能理解得更透彻。3)在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行处理的函数,其功能我都有所了解。5)学会了有关头文件的使用方法,及系统调配问题的解决方法等。6)了解到了注释的重要性。通过这次试验,让我学到很多这个学期没有接触过的很多知识,完成一个贪吃蛇的项目;第一步就是先理清思路,设计主界面,主界面是以一块封闭的画布,并在画布内设计蛇体和食物。蛇头如果碰到墙或者与蛇身的某一部分碰到就会死亡;如果蛇头碰到食物,就会自动增加一节蛇身,并更改得分。想要写出好的程序,还是要有扎实的基础,这样遇到问题就不会一筹莫展来。在编程时我们要有想象力,不要拘泥于现有的贪吃蛇游戏,而是要把自己想到的再加上所学的知识,遇到问题不能怕,而是要专心找出问题的原因,再回来看看书本的知识,不懂的还可以问问老师。编程过程还要养成良好的编程习惯,这样不仅自己能够很好看懂自己的代码,也让人家容易看懂自己的代码,而不至于代码知识自己会看,出来问题只有自己会解决而其他人都不会解决;遇到问题时要考虑最简单的解决方案,只有简单的方案不能满足要求时再考虑复杂的方案。最主要编程还是要多与人沟通,不会的不能立即问别人,但是一段时间后解决不了时还是应该向别人请教请教,“三人行必有我师”正是这个意思。通过这次实验,我深刻地体会到了面向对象与面向过程的区别。程序在最初设计时由于面向对象的思想不够成熟,导致在最后想要增加一些新的功能时,出现了一些麻烦。总之,我们还需要进一步提升自己的能力。6.参考文献《C语言程序设计》武雅丽清华大学出版社《C++面向对象程序设计》谭浩强清华大学出版社《C语言课程设计案例精编》李丽娟中国水利水电出版社附录:源程序/////////////////////////////////////////////////程序名称:贪吃蛇//制作:莫新存//编译环境:VisualC++6.0,EasyX//////////////////////////////////////////////#include<iostream>#include<graphics.h>#include<stdlib.h>#include<conio.h>#include<dos.h>#include<time.h>#include<stdio.h>#include<vector>#definerandom(a,b)(rand()%((b)-(a)))+(a)#pragmacomment(lib,"Winmm.lib")//加入背景音乐时使用usingnamespacestd;#defineMAX_JOINTS 200#defineMV_RIGHT1#defineMV_LEFT2#defineMV_UP3#defineMV_DOWN4intrnd1,rnd2;vector<int>vox;vector<int>voy;voidInitGraph(void); /*图形界面初始化函数*/voidDrawFence(void); /*绘制游戏场景*/voidGameOver(intscore); /*结束游戏*/voidGamePlay(void); /*玩游戏具体过程*/voidPrScore(intscore);/*显示分数*/voidfun_pause();/*暂停游戏*/voidfun_reset();/*重置游戏*/voidfun_obstacle();/*设置障碍物*/structFood{ /*食物的结构体定义*/ intx; /*食物的横坐标*/ inty; /*食物的纵坐标*/ intaddFood; /*判断是否要出现食物的变量*/};structSnake{ /*蛇的结构体定义*/ intx[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ inty[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/ intjoint; /*蛇的节数*/ intdirection; /*蛇移动方向*/ intlife; /*蛇的生命,0活着,1死亡*/};voidplay(){ initgraph(800,600); InitGraph(); DrawFence(); GamePlay(); getch(); }intmain(){mciSendString("playmo.mp3",NULL,0,NULL);//播放音乐 play(); return0;}//初始化voidInitGraph(){ cleardevice(); setbkcolor(BLUE); setcolor(WHITE); cleardevice(); setfont(25,0,_T("微软雅黑")); outtextxy(170,150,"GreedySnake"); outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }//绘制游戏场景voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //画围墙 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上边 bar(i,40,i+7,47); bar(i,551,i+7,558); //下边 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左边 bar(591,i,598,i+7); //右边 }}//结束游戏voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微软雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//关闭音乐 getch(); exit(0);}//输出成绩voidPrScore(intscore){ charstr_score[10]; //setfillstyle(YELLOW); //bar(50,15,220,35); //setcolor(6); //setfont(25,0,_T("微软雅黑")); //setfillstyle(BLACK); setbkmode(TRANSPARENT); //---new--- BeginBatchDraw(); setfillstyle(BLACK); bar(601,0,800,600); setfont(60,0,_T("微软雅黑")); setcolor(YELLOW); outtextxy(625,30,_T("贪吃蛇")); setfont(30,0,_T("微软雅黑")); setcolor(LIGHTGREEN); outtextxy(625,140,_T("制作:莫新存")); outtextxy(625,200,_T("学号:19")); setfont(25,0,_T("微软雅黑")); setcolor(CYAN); outtextxy(625,380,_T("上:W")); outtextxy(625,400,_T("下:S")); outtextxy(625,420,_T("左:A")); outtextxy(625,440,_T("右:D")); outtextxy(625,460,_T("分数:")); outtextxy(625,490,_T("暂停(P键)")); outtextxy(625,520,_T("重新游戏(R键)")); setcolor(LIGHTBLUE); sprintf(str_score,"%i",score); outtextxy(680,460,str_score); EndBatchDraw(); if(score>0&&score%50==0)fun_obstacle();}voidGamePlay(){ int i,key; int gamespeed=200; //控制游戏速度* int score=0; //记录游戏得分 structFoodfood; //食物结构体变量 structSnakesnake; //蛇结构体变量 food.addFood=1; //1表示需要出现新食物,0表示已经存在食物 snake.life=0; //置蛇的生命状态为活着 snake.direction=MV_RIGHT; //置蛇头方向往右 snake.x[0]=100;snake.y[0]=100; //置蛇头初始位置 snake.x[1]=110;snake.y[1]=100; snake.joint=2; //置蛇的初始节数为2 PrScore(score); //显示游戏得分 //重复玩游戏,直到按Esc键结束 srand(time(NULL)); while(1) { while(!kbhit()) { mciSendString("playmo.mp3",NULL,0,NULL);//播放音乐 if(food.addFood==1){ //需要出现新食物 food.x=rand()%400+60; food.y=rand()%350+60; //食物出现后必须在整格内才能让蛇吃到 while(food.x%10!=0) { food.x++; } while(food.y%10!=0){ food.y++; } food.addFood=0; //画面上有食物 } if(food.addFood==0){ //画面上有食物,则显示 setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }//在没有按键的情况下,蛇自己移动身体 for(i=snake.joint-1;i>0;i--){ //蛇的每个节往前移动 snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四个方向,来决定蛇头的移动 switch(snake.direction){ caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; } //从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来 for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //显示失败 snake.life=1; //蛇死*/ break; } } //判断蛇是否撞到墙壁 if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //本次游戏结束 snake.life=1; //蛇死 } for(intobs_i=0;obs_i<vox.size();obs_i++){ //-----判断是否撞到障碍物---- if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); } //以上三种判断以后,如果蛇死就跳出内循环,重新开始 if(snake.life==1) break; if(snake.x[0]==food.x&&snake.y[0]==food.y){//吃到食物后 //把画面上的食物清除 setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新的一节先放在看不见的位置,下次循环就取前一节的位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snak
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026重庆八中宏帆中学校财务会计招聘备考题库附答案详解(黄金题型)
- 2026广东佛山市禅城区人民医院康复医院第一批自主招聘合同制人员10人备考题库及一套参考答案详解
- 2026广东广州南沙人力资源发展有限公司招聘实习教师备考题库附答案详解(巩固)
- 2026广东佛山禅城区南庄镇上元幼儿园教师招聘1人备考题库附答案详解(完整版)
- 2026甘肃智通科技工程检测咨询有限公司招聘备考题库及答案详解(必刷)
- 2026中共广州市海珠区委社会工作部招聘雇员1人备考题库(广东)及答案详解(真题汇编)
- 2026黑龙江黑河市孙吴县社区卫生服务中心招聘2人备考题库及1套完整答案详解
- 2026福建福州市鼓楼区南街家在鼓楼小区事务服务中心招聘1人备考题库及一套参考答案详解
- 2206内蒙古聚英人力资源服务有限责任公司定向招聘劳务派遣人员7人备考题库含答案详解(巩固)
- 2026年福建泉州市丰泽区市场监督管理局公开招聘工作人员备考题库附答案详解(轻巧夺冠)
- 医学课题申报书技术指标
- 交通安全协管员考试题库及答案解析
- 地铁区间高架桥施工安全风险评估及改进方案
- 2024煤矿地质工作细则
- 苏州文华东方酒店公区概念设计方案文本
- 2025年安徽中烟工业公司岗位招聘考试笔试试卷(附答案)
- 2025中小学教师考试《教育综合知识》试题及答案
- 暖通可行性研究报告
- (国网)社会单位一般作业人-网络信息安全准入考试复习题及答案
- 员工异地办公管理制度
- sm指数测试试题及答案
评论
0/150
提交评论