贪吃蛇课程设计报告.doc_第1页
贪吃蛇课程设计报告.doc_第2页
贪吃蛇课程设计报告.doc_第3页
贪吃蛇课程设计报告.doc_第4页
贪吃蛇课程设计报告.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录1. 课程设计目的32. 课程设计任务与要求32.1课程设计内容32.2课程设计要求32.3课程设计环境33. 课程设计方案3 3.1方案论证33.2程序整体设计说明33.3设计思路43.4设计总体流程图43.5设计的具体实现54. 程序测试84.1测试内容与结果84.2程序运行效果图95. 课程设计总结106.参考文献11附录 源程序11 1. 课程设计目的:l 复习、巩固才C、C+的基础知识,进一步加深对VC技术的理解和掌握;l 课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。l 培养学生在项目开发中团队合作精神、创新意识及能力2. 课程设计任务与要求2.1 课程设计内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC的课程设计。最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色操作说明等)与积分。2.2课程设计要求l 对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;l 系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;l 说明书、流程图要清楚;l 记录设计情况(备查,也为编写设计说明书作好准备);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) 食物类 struct Food/*食物的结构体定义*/int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int addFood;/*判断是否要出现食物的变量*/;2)蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。struct Snake/*蛇的结构体定义*/ int xMAX_JOINTS; /*保存蛇身每一节位于屏幕上的列坐标*/int yMAX_JOINTS; /*保存蛇身每一节位于屏幕上的行坐标*/int joint;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/*蛇的生命,0活着,1死亡*/;3) 初始化游戏 游戏开始界面的初始化: void InitGraph()cleardevice();setbkcolor(BLUE); /*设置背景颜色*/setcolor(WHITE); /*设置前景颜色*/cleardevice();setfont(25, 0, _T(微软雅黑);outtextxy(170,150,Greedy Snake); /*在坐标(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)也用于画矩形。void DrawFence()int i;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; i0; i-)/蛇的每个节往前移动 snake.xi = snake.xi-1;snake.yi = snake.yi-1;/1,2,3,4 表示右,左,上,下四个方向,来决定蛇头的移动 switch(snake.direction) case MV_RIGHT: snake.x0 += 10; break;case MV_LEFT: snake.x0 -= 10; break;case MV_UP: snake.y0 -= 10; break;case MV_DOWN: snake.y0 += 10; break;8)a.从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来 for (i=3; isnake.joint; i+) if (snake.xi=snake.x0 & snake.yi=snake.y0) GameOver(score);/显示失败snake.life = 1; /蛇死*/break; b.判断蛇是否撞到墙壁 if (snake.x0595 | snake.y0455) GameOver(score);/本次游戏结束snake.life = 1; /蛇死 c.判断是否撞到障碍物for(int obs_i = 0; obs_ivox.size(); obs_i+) if(voxobs_i=snake.x0 & voyobs_i=snake.y0) GameOver(score);以上三种判断以后,如果蛇死就跳出内循环,重新开始。9) 吃到食物后画蛇if (snake.x0=food.x & snake.y0=food.y) /吃到食物后/把画面上的食物清除 setcolor(0);rectangle(food.x, food.y, food.x+10, food.y-10);/新的一节先放在看不见的位置,下次循环就取前一节的位置snake.xsnake.joint =-20; snake.ysnake.joint =-20;snake.joint+;/蛇的身体长一节food.addFood = 1;/画面上需要出现新食物score += 10;/-PrScore(score);/输出新得分/画蛇setcolor(RED);for (i=0; isnake.joint; i+)rectangle(snake.xi, snake.yi,snake.xi+10, snake.yi-10);Sleep(gamespeed); /延时控制蛇的速度/去除蛇的最后一节setcolor(0);rectangle(snake.xsnake.joint-1, snake.ysnake.joint-1,snake.xsnake.joint-1+10,snake.ysnake.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语言课程设计案例精编 李丽娟 中国水利水电出版社附录:源程序 / 程序名称:贪吃蛇/ 制作:莫新存/ 编译环境:Visual C+ 6.0 ,EasyX/#include #include #include #include #include #include #include #include #define random(a,b) (rand()%(b)-(a)+(a)#pragma comment(lib,Winmm.lib) /加入背景音乐时使用using namespace std;#define MAX_JOINTS200#define MV_RIGHT 1#define MV_LEFT 2#define MV_UP 3#define MV_DOWN 4int rnd1,rnd2;vectorvox;vectorvoy;void InitGraph(void);/*图形界面初始化函数*/void DrawFence(void);/*绘制游戏场景*/void GameOver(int score);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/void PrScore(int score); /*显示分数*/void fun_pause(); /*暂停游戏*/void fun_reset(); /*重置游戏*/void fun_obstacle(); /*设置障碍物*/struct Food/*食物的结构体定义*/int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int addFood;/*判断是否要出现食物的变量*/;struct Snake/*蛇的结构体定义*/int xMAX_JOINTS; /*保存蛇身每一节位于屏幕上的列坐标*/int yMAX_JOINTS; /*保存蛇身每一节位于屏幕上的行坐标*/int joint;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/*蛇的生命,0活着,1死亡*/;void play()initgraph(800,600);InitGraph();DrawFence();GamePlay();getch();int main () mciSendString(play mo.mp3, NULL, 0, NULL); /播放音乐play();return 0;/初始化 void InitGraph()cleardevice();setbkcolor(BLUE);setcolor(WHITE);cleardevice();setfont(25, 0, _T(微软雅黑);outtextxy(170,150,Greedy Snake);outtextxy(219,254,Ready?);getch();setbkcolor(0);cleardevice();/绘制游戏场景void DrawFence()int i;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; i0 & score%50=0) fun_obstacle();void GamePlay()int i, key;int gamespeed =200;/控制游戏速度*int score = 0;/记录游戏得分struct Food food;/食物结构体变量struct Snake snake;/蛇结构体变量food.addFood = 1;/1表示需要出现新食物,0表示已经存在食物snake.life = 0;/置蛇的生命状态为活着snake.direction = MV_RIGHT;/置蛇头方向往右snake.x0 = 100; snake.y0 = 100;/置蛇头初始位置snake.x1 = 110; snake.y1 = 100;snake.joint = 2;/置蛇的初始节数为2PrScore(score);/显示游戏得分/重复玩游戏,直到按Esc键结束srand(time(NULL);while (1) while (!kbhit()mciSendString(play mo.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; i0; i-)/蛇的每个节往前移动 snake.xi = snake.xi-1;snake.yi = snake.yi-1;/1,2,3,4 表示右,左,上,下四个方向,来决定蛇头的移动 switch(snake.direction)case MV_RIGHT: snake.x0 += 10; break;case MV_LEFT: snake.x0 -= 10; break;case MV_UP: snake.y0 -= 10; break;case MV_DOWN: snake.y0 += 10; break;/从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来for (i=3; isnake.joint; i+)if (snake.xi=snake.x0 & snake.yi=snake.y0)GameOver(score);/显示失败snake.life = 1; /蛇死*/break;/判断蛇是否撞到墙壁if (snake.x0595 | snake.y0455)GameOver(score);/本次游戏结束snake.life = 1; /蛇死for(int obs_i = 0; obs_ivox.size(); obs_i+)/-判断是否撞到障碍物-if(voxobs_i=snake.x0 & voyobs_i=snake.y0) GameOver(score);/以上三种判断以后,如果蛇死就跳出内循环,重新开始if (snake.life = 1)break;if (snake.x0=food.x & snake.y0=food.y) /吃到食物后/把画面上的食物清除setcolor(0);rectangle(food.x, food.y, food.x+10, food.y-10);/新的一节先放在看不见的位置,下次循环就取前一节的位置snake.xsnake.joint =-20; snake.ysnake.joint =-20;snake.joint+;/蛇的身体长一节food.addFood = 1;/画面上需要出现新食物score += 10;/-PrScore(score);/输出新得分/画蛇setcolor(RED);for (i=0; isnake.joint; i+)rectangle(snake.xi, snake.yi,snake.xi+10,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论