您好,欢迎访问三七文档
1目录1.课程设计目的……………………………………………………………32.课程设计任务与要求…………………………………………………32.1课程设计内容…………………………………………………………32.2课程设计要求…………………………………………………………32.3课程设计环境…………………………………………………………33.课程设计方案……………………………………………………………33.1方案论证………………………………………………………………33.2程序整体设计说明………………………………………………………33.3设计思路………………………………………………………………43.4设计总体流程图………………………………………………………43.5设计的具体实现………………………………………………………54.程序测试…………………………………………………………………84.1测试内容与结果………………………………………………………84.2程序运行效果图………………………………………………………95.课程设计总结…………………………………………………………1026.参考文献…………………………………………………………………11附录源程序…………………………………………………………………111.课程设计目的:复习、巩固才C、C++的基础知识,进一步加深对VC技术的理解和掌握;课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。培养学生在项目开发中团队合作精神、创新意识及能力2.课程设计任务与要求2.1课程设计内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC的课程设计。最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。2.2课程设计要求对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;说明书、流程图要清楚;3记录设计情况(备查,也为编写设计说明书作好准备);2.3课程设计环境Windows7操作系统,VC6.0开发环境。3.课程设计方案3.1方案论证方案一:基于MFC设计该方案的好处是系统自动生成软件框架,设计者只需填充编写的代码即可,程序设计比较复杂,对于编程能力不强的同学来说难度较大。方案二:基于easyX设计该方案的好处是设计者只需编写程序文件,完成后编译即可生成可执行文件,编程前需要先安装easyX图形库。由于编程能力不强,方案二设计简单,易于调试,故选择方案二。3.2程序整体设计说明一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。游戏界面:1)开始游戏(加载并开始)2)暂停游戏(从当前进度结束)3)重新开始(在某一时刻暂停后可以继续接着玩)游戏设置:1)蛇的颜色(红色)2)游戏帮助(游戏控制说明)3)积分(每次吃掉一个食物增加10分,并显示出来)3.3设计思路这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。3.4设计总体流程图载入游戏并初始化判断是否开始蛇开始移动是根据键盘控制蛇移动方向否否43.5设计的具体实现1)食物类structFood/*食物的结构体定义*/{intx;/*食物的横坐标*/inty;/*食物的纵坐标*/intaddFood;/*判断是否要出现食物的变量*/};2)蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。structSnake/*蛇的结构体定义*/{intx[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的列坐标*/inty[MAX_JOINTS];/*保存蛇身每一节位于屏幕上的行坐标*/intjoint;/*蛇的节数*/intdirection;/*蛇移动方向*/intlife;/*蛇的生命,0活着,1死亡*/};3)初始化游戏游戏开始界面的初始化:voidInitGraph(){cleardevice();setbkcolor(BLUE);/*设置背景颜色*/蛇头和食物坐标是否重合否是否5setcolor(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)//需要出现新食物6{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;i0;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;isnake.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.判断是否撞到障碍物7for(intobs_i=0;obs_ivox.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;isnake.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;}编好程序后进行
本文标题:贪吃蛇课程设计报告
链接地址:https://www.777doc.com/doc-2081810 .html