您好,欢迎访问三七文档
基于VC#.NET的贪吃蛇游戏的目录1.实验目的………………………………………………………………2.实验任务与要求………………………………………………………2.1实验内容………………………………………………………………2.2实验要求………………………………………………………………2.3实验环境………………………………………………………………3.设计方案…………………………………………………………………3.1程序功能………………………………………………………………3.2设计思想………………………………………………………………3.3设计总体流程图………………………………………………………3.4设计的具体实现………………………………………………………4.程序测试…………………………………………………………………4.1测试内容与结果………………………………………………………4.2程序运行效果图………………………………………………………5.实验总结………………………………………………………………参考文献……………………………………………………………………附录……………………………………………………………………………附录A:主要源程序………………………………………………………附录B:软件使用说明书…………………………………………………1.实验目的:复习、巩固VC#.NET的基础知识,进一步加深对VC#.NET技术的理解和掌握;课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。培养学生在项目开发中团队合作精神、创新意识及能力2.实验任务与要求2.1实验内容贪吃蛇游戏开发,首先它可以为大家提供一种当前比较流行的休闲小游戏。贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着很多人,它的制作方法对于很多同学而言都是很神秘的。所以我们希望通过这学期所学知识把它剖析开来,真真正正的了解它的本质和精髓。在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此决定选择这个题目作为VC#.NET的课程设计。最后一部分就是游戏的模块划分,根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,游戏设置(蛇的颜色、食物的颜色、游戏难度设置),游戏帮助(游戏控制说明)与积分。2.2实验要求对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;说明书、流程图要清楚;记录设计情况(备查,也为编写设计说明书作好准备);2.3实验环境WindowsXP操作系统,VS.NET2005开发环境。3.设计方案3.1程序功能游戏界面:1)开始游戏(加载并开始)2)暂停游戏(从当前进度结束)3)重新开始(在某一时刻暂停后可以继续接着玩)4)停止游戏(停止正在玩的游戏,再次开始时是重新开始)游戏设置:1)蛇的颜色(白色、蓝色、黄色)2)游戏难度设置(1级、2级、3级)3)游戏帮助(游戏控制说明)4)积分(每次吃掉一个食物增加5分,并显示出来)3.2设计思想首先,该游戏有两个类,以及一个枚举类型,列举了蛇块移动的四个方向;一个蛇块类,用来描述蛇块的信息和将自身绘制到画布上;另一个是画蛇类,画蛇类里要有开始函数,调用开始函数可以使游戏开始,游戏死亡函数,让游戏会结束,既然是贪吃蛇,就少不了蛇的移动,食物的生成,游戏是动态的,在贪吃蛇吃食物的过程中,每吃一个界面就需要更新一下,当然需要用到定时更新函数和刷新画板,保持游戏的动态和连贯性。大概思想是这样的,里面需要注意的是,蛇什么情况下死亡,有两种情况,第一,蛇撞到墙,第二,舌头蛇尾相接。蛇在移动时,如果遇到食物,就把食物吃了,蛇的身子会长一节,如果前方没有食物,就响应键盘,按照方向移动。蛇可以沿着墙壁走,但是沿着墙壁走和撞墙是有区别的,这些细节要区分开。其次,设计主界面,即一个Form框,在框里放一个PictureBox框,设置画布类来作为贪吃蛇游戏的背景。界面里要有开始按钮,暂停、重新开始、退出这些按钮。开始就是要初始化并加载游戏,暂停是当游戏在进行时,可以短时间内终止,重新开始,是继续暂停时的游戏,退出要将该游戏系统关闭,便可以退出。为了满足游戏的动态画面效果和适应不同级别的人群,要设置游戏蛇块颜色的菜单,食物颜色的菜单,以及游戏等级菜单,来最大可能地满足不同需求的人群,扩大市场的需求,为了更细心体贴,再设置一个帮助菜单更好,引导人们更方便地使用一些功能。大体上就是这样吧,有了思想在敲打代码的过程中就有了目标,思路会清晰,不过一些细节性的问题要注意。3.3设计总体流程图载入游戏并初始化判断是否开始游戏等级蛇颜色设置退出否蛇开始移动是根据键盘控制蛇移动方向蛇头和食物坐标是否重合随机生成下一个食物是否蛇头是否撞墙以及头尾是否相接游戏结束是否游戏菜单帮助选择哪个级别1级2级3级选择颜色白色蓝色黄色3.4设计的具体实现1)、蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块的信息。a)、蛇块类的私有变量:privateColor_color;//颜色privateint_size;//大小privatePoint_point;//坐标b)、构造函数:publicsnakeBlock(Colorcolor,intsize,Pointp)c)、获取记录蛇块的坐标:publicPointPoint//属性d)、Paint函数:publicvirtualvoidPaint(Graphicsg)Paint函数根据坐标以及蛇块大小计算出实际绘图的坐标,进行绘图,蛇块是一个正方形(矩形),我们用矩形绘制,在代码中我们看到,绘制的大小比size小1个像素,这么做的原因是为了突出蛇块与蛇块之间的间隙,也就是说蛇块与蛇块之间有1个像素的间隙,这就是我们看到游戏效果图中的蛇块是一段一段的原因。2)、画蛇类画蛇类是真个游戏的核心处理类,里面定义了画布的大小,背景色,蛇块列表以及游戏速度,移动方向等属性另外还提供了timer计时器,用于定时更新蛇块坐标位置,以及如何在画面上画图的函数。a)、Start函数用于开始游戏,这个函数的内部其实就是设定食物,以及触发计时器。这里面定义了计时器的事件触发间隔,是通过level然后找到speed数组里的对应毫秒值设定的。然后触发事件是OnBlockTimedEvent,最后是启动计时器开始计时。代码如下:publicvoidStart(){this._food=GetFood();//生成一个食物timerBlock=newSystem.Timers.Timer(_speed[this._level]);timerBlock.Elapsed+=newSystem.Timers.ElapsedEventHandler(OnBlockTimedEvent);timerBlock.AutoReset=true;timerBlock.Start();}b)、OnBlockTimedEvent函数是计时器的执行函数,这个函数用于更新蛇块信息列表,以及检测游戏是否结束,函数内部调用了两个函数,一个是Move函数,一个是CheckDead函数。代码如下:privatevoidOnBlockTimedEvent(objectsource,ElapsedEventArgse)//定时更新{this.Move();if(this.CheckDead()){this.timerBlock.Stop();//停止引发事件this.timerBlock.Dispose();//释放资源intscore=(this._blocks.Count-1)*5;System.Windows.Forms.MessageBox.Show(游戏失败,得分为:+score,GameOver!);}}c)、checkDead函数用于检测游戏是否结束,检测是否结束分两种情况,一种是撞上边界,即蛇头坐标超出画布范围,一种是蛇头撞上了蛇身,也就是蛇头的坐标和蛇身的某个坐标重合,通过for循环来检查第二种情况。代码如下:privateboolCheckDead()//检查游戏是否结束{snakeBlockhead=(snakeBlock)(this._blocks[0]);//超出画布范围if(head.Point.X-10||head.Point.Y-10||head.Point.X=this._width-1||head.Point.Y=this._height-1)returntrue;for(inti=1;ithis._blocks.Count;i++){snakeBlockb=(snakeBlock)this._blocks[i];//是否头尾相接if(head.Point.X==b.Point.X&&head.Point.Y==b.Point.Y){this._isGameOver=true;returntrue;}}this._isGameOver=false;returnfalse;}d)、GetFood函数用于生成下一个食物,其实就是一个蛇块,生成的规则就是,坐标要在画布范围内,并且食物的坐标不能和贪吃蛇的坐标重合,具体代码如下通过for循环检查食物坐标是否和贪吃蛇的蛇块列表ArrayList里的蛇块有冲突。代码如下:privatesnakeBlockGetFood()//生成下一个食物,也就是下一节蛇块{snakeBlockfood=null;Randomr=newRandom();boolredo=false;while(true){redo=false;intx=r.Next(this._width);inty=r.Next(this._height);for(inti=0;ithis._blocks.Count;i++){snakeBlockb=(snakeBlock)(this._blocks[i]);if(b.Point.X==x&&b.Point.Y==y){redo=true;}if(redo==false){food=newsnakeBlock(Color.Gold,this._size,newPoint(x,y));break;}}returnfood;}}e)、Move函数用于更新整个蛇块的坐标,我们前面通过将蛇块信息放到ArrayList里来表示贪吃蛇的整个信息,其中根据下标从0到Count-1依次表示各个蛇块的信息,实际代码中增加了吃食物的情况判断,也就是说如果新蛇头的坐标和食物的坐标一致,那么就不做删除原蛇尾的操作了,这样产生的效果就是蛇块列表的长度增加了一个,达到吃食物变长的效果。代码如下:privatevoidMove()//蛇体移动{Pointp=newPoint();//下一个位置snakeBlockhead=(snakeBlock)(this._blocks[0]);if(this._direction==Direction.Up)p=newPoint(head.Point.X,head.Point.Y-1);elseif(this._direction==Direction.Down)p=newPoint(head.Point.X,head.Point.Y+1);elseif(this._direction==Direction.Left)p=newPoint(head.Point.X-1,head.Point.Y);elsep=newPoint(head.Point.X+1,head.Point.Y);//生成新坐标,将成为蛇头snakeBlockb=newsnakeBlock(Color.Red,this._size,p);//如果下一个坐标不是当前
本文标题:贪吃蛇课程设计报告
链接地址:https://www.777doc.com/doc-5688884 .html