当前位置:文档之家› 贪吃蛇游戏系统课程设计

贪吃蛇游戏系统课程设计

一、课程设计的目的和要求1.通过C#课程设计,使学生能将学到的面向对象的程序设计思想用到具体的工作和学习中,加深对类与对象的理解,要求学生能够对现实生活中许多具体的事物抽象出类,并掌握继承与派生,基类、虚方法和抽象方法和多态性的概念。

2.通过这次课程设计掌握《C#语言程序设计》的编程思想,为后续课程打下基础。

3.培养我们实际操作能力和实践能力,为以后的工作打下坚实的基础。

二、课程设计内容编写一个C# GUI版贪吃蛇小游戏程序我们的需求是:一条蛇在封闭的围墙内爬行,玩家可以通过方向键来控制蛇的运动方向,围墙内随机出现一食物,蛇头碰到食物时表示食物被吃掉,此时蛇身加长一节,同时游戏成绩加10分,接着又出现食物等待蛇吃周而复所,直到蛇撞墙或身体交叉而死游戏结束。

基本要求:1、要求利用C#完成游戏的设计2、要求在设计过程中建立清晰的类层次3、程序应具有容错功能4、程序界面美观,逻辑层次清楚,结构合理,文档清晰三、课程设计基本要求1) 要求利用面向对象的方法以及C#的编程思想来完成系统的设计;2) 要求在设计的过程中,建立清晰的类层次;3) 在系统中至少要定义四个类,每个类中要有各自的属性和方法;4) 在系统的设计中,至少要用到面向对象的一种机制。

5) 程序应具有容错功能。

6)程序运行结果正确,操作方便,界面美观,逻辑层次清楚,程序结构合理,文档规范清晰。

目录1:需求分析1.1程序功能说明1.2程序设计的分析2:系统的主要功能模块2.1程序功能图示3:程序的输入,输出和相应的算法3.1程序的输入3.2程序的输出3.3程序的一些重要方法的实现算法和方法4:程序的测试4.1程序测试的内容和结果5:程序运行效果图6:部分程序代码6.1 蛇类代码6.2 食物类代码7:程序的注意事项8:程序的不足之处一:需求分析1:程序的功能说明:一条蛇在封闭的围墙内爬行,玩家可以通过方向键来控制蛇的运动方向,围墙内随机出现一食物,蛇头碰到食物时表示食物被吃掉,此时蛇身加长一节,同时游戏成绩加10分,接着又出现食物等待蛇吃周而复所,直到蛇撞墙或身体交叉而死游戏结束。

2:程序设计的分析通过程序所要实现的功能可以看出,该程序中有,蛇,食物两个主要的对象,所以我们可以定义两个类:蛇类,和食物类;在蛇类中封装了蛇的所有的属性和操作。

蛇的属性有:蛇的长度,蛇的初始位置,蛇的运动方向,蛇的存活状态,蛇的运动速度。

蛇的操作有:蛇的移动,蛇吃食物,画出蛇所有的状态。

食物的属性有:食物的出现位置,食物的存活状态。

食物类的操作:创建一个新的食物,画出食物的位置。

在该程序中还有一个FROM类,用来画出和显示蛇和食物的状态和位置,该类提供给蛇和食物的运动平台,蛇和事物在该FORM的面板范围内运行。

程序中还有其他的功能要一一的实现。

如:在用户点击“开始”按钮后程序才能开始运行。

用户如果点击“暂停”按钮,则该程序暂停,但并不终止程序,在用户再次点击“开始”按钮后,程序继续运行。

如果程序运行结束,即程序出现“GAME OVER”,或用户点击“结束”按钮则程序结束,并且退出。

在程序运行过程中,用户控制的蛇,每吃到一个食物,那么该玩家的得分就加10,并且还要记录该玩家总共吃了多少食物。

如果玩家“GAME OVER ”则要判断该玩家的得分是否大于最高分,如果大于,则提示该玩家获得了最高分。

玩家可以查看最高分,玩家点击“显示”按钮则将显示最高分。

二:系统主要功能图示三:系统的输入,输出和相关算法. 1:输入:在该程序中几乎没有什么从键盘输入的数据,所有的程序所运用的数据都是有程序本身提供的,由用户来选择,程序将根据用户的选择来处理相应的数据.,如在玩家选择游戏级别的时候,程序会根据玩家选择的级别来调整蛇的速度. 2:输出:在该程序中,输出的数据有,玩家所得到的分数,蛇吃到的食物的个数,以及目前的最高得分.,当玩家所控制的蛇死亡后,要输出一个消息”GAME OVER”表示蛇的死亡,并且将蛇的生存状态改为false,如果在玩家控制的蛇死亡后,并且玩家的得分已经超过了之前的最高分,则输出一个消息”恭喜你,创了新的记录”并且将该分记录为最高分. 以上是程序的主要的输出.3:程序中的一些相关操作的实现方法和算法1:蛇的移动.蛇的移动主要通过的改变蛇的坐标位置,然后通过重绘蛇的位置,这样就实现了蛇的移动.具体的为:从构成蛇身的所有节点的最后一点开始,依次将前一个节点的坐标点赋值为后一个节点.这样就实现了蛇身的移动,接下来是蛇头的移动.蛇头的移动要根据蛇的运动方向来做出相应的移动.如果蛇是向右移动,则蛇头的Y坐标点不变,X坐标点加上相应的移动步长. 如果蛇是想左移动,则蛇头的Y坐标不变,X坐标点减去相应的步长. 如果蛇是向上移动的,则蛇头的X坐标不变,Y坐标减去相应的移动步长,如果蛇是向下移动的,则蛇头的X坐标不变,Y坐标点加上相应的步长..这样就构成了整个蛇的坐标点的变换,然后通过,重绘面板则实现了蛇的移动.2:蛇吃食物蛇吃食物是在蛇经过该食物时,并且蛇头的坐标位置和该食物的坐标位置是一致的那么,将该食物的坐标点,添加到该蛇的最后一位上.这样就实现了蛇吃食物并且蛇身加长.四:程序的测试该程序由于输入的数据几乎没有,所以在测试也相对比较简单,只要运行该程序,在执行程序的过程中发现错误,在程序完成的初期,该程序中的错误非常多,如在蛇运行的过程中,蛇移动的步长是程序所设定的步长的两倍,所以蛇在移动时的步长太大,无法吃到食物,.还有在蛇的移动正常时,但是蛇经过食物却不能够将食物”吃”掉..经过检查原来蛇的的坐标点和食物的坐标点不重合,相差几个单位,但是这几个单位是用眼睛看不出来的,所以对程序的代码进行了仔细的检查,才发现了这个错误.在点击”开始按钮后程序并不能够执行,经过仔细的分析和检查,终于发现,原来程序对”开始”按钮没有进行事件监听.所以点击”开始”按钮后程序不知道该做什么事情,所以没有响应..程序中的错误都是通过白盒和黑盒测试相结合的方法来进行测试,这样程序的错误才能够找的完全和查找方便.五:程序运行效果图:程序的界面:当程序运行,点击开始按钮后的截面图:当程序运行,蛇每吃到一个食物后,得分和个数都会增加.用户可以调节蛇的运动速度.当玩家点击了显示按钮后,将显示目前该游戏的最高分.当玩家所控制的蛇死亡后图当玩家控制的蛇死亡了后,如果玩家的得分大于最高分,则提示创了记录,如图:六:程序中部分重要代码1:蛇类的实现代码enum Direction//定义蛇的移动方向的枚举类型{UP,DOWN,LEFT,RIGHT}class Snake{int maxScore = 0; //最高分public const int side = 10; //蛇身每个节点的长度Point[] body=new Point[1000]; //蛇最大长度Direction direction; //蛇的初始移动方向Boolean live; //蛇的存活状态int number; //蛇身节点个数int score = 0;int speed =200; //蛇的移动速度public int MaxScore{get{return maxScore;}set{maxScore = value;}}public int Speed{get{return speed;}set{speed = value;}}public int Score{get{return (number-2)*10;}}public Direction Direction{get{return direction;}set{direction = value;}}public Boolean Live{get{return live;}}public int Number{get{return number;}}public Point[] Body{get{return body;}}public Snake() //蛇的初始化,长度为,方向为向右,存活状态为活{Point node1 = new Point(100,40);Point node2 = new Point(90,40);body[0] = node1;body[1] = node2;number = 2;direction = Direction.RIGHT;live = true;}public void Move(Size range) //蛇的移动方法,参数为蛇的移动范围{for (int i = this.number-1; i > 0; i--){body[i] = body[i - 1]; //从蛇尾开始将蛇身的每前一个节点坐标值赋给后一个坐标点}switch (this.direction) //根据蛇的移动方向来设定蛇头的移动方向{case Direction.UP:body[0].Y -= side; break;case Direction.DOWN:body[0].Y += side; break;case Direction.LEFT:body[0].X -= side; break;case Direction.RIGHT:body[0].X += side; break;}//如果蛇头的位置超过了参数的范围,则将蛇的存活状态设为false,即蛇死亡if(body[0].X<0||body[0].X>range.Width-side||body[0].Y<0||body[0].Y>range.Height-side){this.live = false;}for (int i = 1; i <= number - 1;i++ ) //蛇如果撞到自身,蛇也死亡{if(body[0].X==body[i].X && body[0].Y==body[i].Y){this.live = false;}}}//蛇吃食物的方法,参数传递的是蛇将要吃的食物public void Eat(Food food){body[number] =food.Position; //通过将要吃的食物的坐标点值赋给蛇的最后一位,以实现蛇吃食物this.number++; //蛇身的长度加}public void Draw(Graphics g) //画蛇的方法,传递的参数为画蛇所用的面板{Brush brush = Pens.DarkRed.Brush;g.DrawRectangle(Pens.DarkRed,body[0].X,body[0].Y,side,side);g.FillRectangle(brush,body[0].X,body[0].Y,side,side);for (int i = 1; i <= number - 1;i++ ){g.DrawRectangle(Pens.Red, body[i].X, body[i].Y, side, side);}if (this.live == false){g.DrawString("GAME OVER!", new Font("楷体_GB2312", 36, FontStyle.Bold), brush, new Point(120, 200));try{FileStream aFile = new FileStream(@"../../temp.txt", FileMode.Open);StreamReader sr = new StreamReader(aFile);this.maxScore = Int32.Parse(sr.ReadLine());sr.Close();}catch (IOException ex){ }if(this.Score>this.maxScore){g.DrawString("*恭喜你创造了新的记录!*", new Font("楷体_GB2312", 12, FontStyle.Bold), brush, new Point(120, 350));this.maxScore = this.Score ;try{FileStream aFile = new FileStream(@"../../temp.txt",FileMode.OpenOrCreate);StreamWriter sw=new StreamWriter(aFile);sw.WriteLine(this.maxScore.ToString());sw.Close();}catch(IOException ex){}}}}public void resetSnake() //重新设置蛇的状态{Point node1 = new Point(100, 40);Point node2 = new Point(90, 40);body[0] = node1;body[1] = node2;number = 2;direction = Direction.RIGHT;live = true;}}2:食物类代码class Food{Point position; //食物的出现位置Boolean exist; //食物的存在状态public Food(){position = this.creatFood() ;exist = true;}public Point Position{get{return position;}set{position = value;}}public Boolean Exist{get{return exist;}set{exist = value;}}public Point creatFood() //随机创建一个食物返回的值为食物的坐标点{Point position = new Point();Random ran = new Random();position.X = ran.Next(1, 33) * 10;position.Y = ran.Next(1, 30) * 10;return position;}public void Draw(Graphics g) //在传递过来的绘图面板中绘制一个食物{g.FillRectangle(Pens.Black.Brush, position.X, position.Y, 10, 10);}}七:程序的注意事项:本程序由于个人技术有限,所以在很多方面还没有完善,如,在用方向键控制蛇的运动方向时,不能够两个键一起按,或是两个键之间的时间间隔非常短,那样蛇会出现异常死亡的状况.所以在使用的时候还请注意.参考文献:<<C#入门经典>> ,<<C#编程宝点>>,<<C#GUI编程指南>>等。

相关主题