首页 贪吃蛇课程设计报告

贪吃蛇课程设计报告

举报
开通vip

贪吃蛇课程设计报告目录1.课程设计目的……………………………………………………………32.课程设计任务与要求………………&helli...

贪吃蛇课程设计报告
目录1.课程 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 目的……………………………………………………………32.课程设计任务与要求…………………………………………………32.1课程设计内容…………………………………………………………32.2课程设计要求…………………………………………………………32.3课程设计环境…………………………………………………………33.课程设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ……………………………………………………………33.1方案论证………………………………………………………………33.2程序整体设计 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 ………………………………………………………33.3设计思路………………………………………………………………43.4设计总体流程图………………………………………………………43.5设计的具体实现………………………………………………………54.程序测试…………………………………………………………………84.1测试内容与结果………………………………………………………84.2程序运行效果图………………………………………………………95.课程设计总结…………………………………………………………106.参考文献…………………………………………………………………11附录源程序…………………………………………………………………111.课程设计目的:·复习、巩固才C、C++的基础知识,进一步加深对VC技术的理解和掌握;·课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。·培养学生在项目开发中团队合作精神、创新意识及能力2.课程设计任务与要求2.1课程设计内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC的课程设计。最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。2.2课程设计要求·对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;·系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;·说明书、流程图要清楚;· 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 设计情况(备查,也为编写设计说明书作好准备);2.3课程设计环境Windows7操作系统,VC6.0开发环境。3.课程设计方案3.1方案论证方案一:基于MFC设计该方案的好处是系统自动生成软件框架,设计者只需填充编写的代码即可,程序设计比较复杂,对于编程能力不强的同学来说难度较大。方案二:基于easyX设计该方案的好处是设计者只需编写程序文件,完成后编译即可生成可执行文件,编程前需要先安装easyX图形库。由于编程能力不强,方案二设计简单,易于调试,故选择方案二。3.2程序整体设计说明一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。游戏界面:1)开始游戏(加载并开始)2)暂停游戏(从当前进度结束)3)重新开始(在某一时刻暂停后可以继续接着玩)游戏设置:1)蛇的颜色(红色)2)游戏帮助(游戏控制说明)3)积分(每次吃掉一个食物增加10分,并显示出来)3.3设计思路这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。3.4设计总体流程图3.5设计的具体实现1)食物类structFood/*食物的结构体定义*/{intx;/*食物的横坐标*/inty;/*食物的纵坐标*/intaddFood;/*判断是否要出现食物的变量*/};2)蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。structSnake/*蛇的结构体定义*/{intx[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的列坐标*/inty[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的行坐标*/intjoint;/*蛇的节数*/intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/};3)初始化游戏游戏开始界面的初始化: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();}4)绘制游戏场景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);//右边}}5)结束游戏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);}6)判断是否需要出现食物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);}以上三种判断以后,如果蛇死就跳出内循环,重新开始。9)吃到食物后画蛇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_JOINTS200#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,170,_T("班级:24041001"));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(){inti,key;intgamespeed=200;//控制游戏速度*intscore=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;//置蛇的初始节数为2PrScore(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;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);}//endofwhile(!kbhit)if(snake.life==1)break;//如果蛇死,则跳出循环key=getch();//接收按键switch(key){//判断按键,是否往相反方向移动,按Esc键则退出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;}}//endofwhile(1)}voidfun_pause(){while(true){charc=getch();if(c=='P'||c=='p'){break;}}}voidfun_reset(){play();}voidfun_obstacle(){rnd1=random(50,580);rnd2=random(60,550);while(rnd1%10!=0)rnd1++;while(rnd2%10!=0)rnd2++;vox.push_back(rnd1);voy.push_back(rnd2);setfillstyle(RGB(255,204,51));bar(rnd1,rnd2,rnd1+10,rnd2-10);}是是游戏结束否蛇头是否撞墙或者自身否否随机生成下一个食物根据键盘控制蛇移动方向是蛇开始移动判断是否开始载入游戏并初始化蛇头和食物坐标是否重合否是否
本文档为【贪吃蛇课程设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
油条
暂无简介~
格式:doc
大小:225KB
软件:Word
页数:0
分类:
上传时间:2020-04-04
浏览量:1