郑州轻工业学院实训报告实训名称:贪吃蛇指导教师:姓名:学号:班级:提交日期:一.实验目的通过开发一款贪吃蛇游戏程序,熟练掌握C#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。
二.实验题目本次实训的题目为贪吃蛇。
通过使用C#编程语言来实现。
三.功能描述1.游戏的基本功能描述1)游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区域中自由移动。
2)定义一个Block来构成石块,蛇头,蛇身以及豆。
蛇由蛇头和蛇身组成。
3)当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇不停地移动,蛇移动的方向与蛇头的方向一致。
4)通过space或者暂停键可以使游戏停止,蛇停止移动,分数停止积分。
5)当蛇移动时,玩家可以使用“↑”、“↓”、“←”和“→”四个方向键改变蛇的移动方向。
6)当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成一颗新的豆,蛇身增加一节。
7)当蛇头碰到石块时,蛇死亡,游戏结束。
8)当蛇头咬到蛇身时,则蛇死亡,游戏结束。
9)当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。
10)游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个豆子就可以过关,级别显示为2,速度增加100变为300.第二关为吃够10个豆子,速度增加50,以后以此类推。
11)游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏的玩法。
12)对于不是第一次玩的玩家可以改变蛇的运动速度,来增加难度。
在菜单中设有加速和减速两个键,单击可以改变速度。
13)游戏菜单中还有时间显示。
14)当游戏暂停时,可以通过“继续”键使游戏继续进行。
四.需求分析本游戏用户可以自己练习和娱乐。
本游戏需要满足以下几点要求:(1)利用方向键“↑、↓、←、→”来改变蛇的运行方向。
(2)空格键暂停游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
可行性分析:贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。
贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。
没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。
而在吃到食物的时候,则只需把食物入队即可。
实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。
玩家可以根据自己的水平选择不同的级别进行游戏挑战。
贪吃蛇游戏中定义如下:1) 空白区域(Lawn):定义的区域是贪吃蛇游戏的场地。
豆、石头和蛇只能存在于空白区域的范围之内。
根据个人爱好还可以添加背景,改变区域的大小和颜色。
2) 蛇(Snake):在贪吃蛇游戏中,蛇由若干节组成,其中第一节是蛇头,在蛇头上面定义两个点,作为蛇的眼睛,其余是蛇身。
在游戏过程中,有且仅有一条蛇,并且蛇在不停地移动。
如果蛇吃了豆,则蛇生长一节。
如果蛇头碰到蛇身,蛇死亡,游戏结束。
如果蛇头离开所定义的区域,则蛇死亡游戏结束。
当蛇头撞到定义的石块上的时候游戏结束。
在定义蛇的时候可以改变蛇的初始长度,也可以改变蛇的颜色和大小。
3) 豆(Bean):在贪吃蛇游戏中,豆是蛇的食物。
在游戏过程中,有且仅有一颗豆。
如果蛇吃了豆,则重新生成一颗豆。
豆的出现是随机性的。
4)石块(stone):游戏中石块和豆是同时出现的,不同的是,豆是随机产生的,而石块是固定的,它的坐标在写代码的时候就定义好了,不能够改变。
它的大小和颜色也可以随便的改变。
5)菜单(MenuStrip):在贪吃蛇游戏中有游戏菜单,里面有开局、暂停、继续、加速、减速、帮助等菜单。
还有Label控件,显示速度、时间、日期和积分的。
五.设计说明Snake的每一节都有位置和大小等属性。
而Bean和stone也具有这两个属性。
抽象出这三者的共同特征,抽象出一般类Block,用于描述一个块。
Block派生出Bean和SnakeBlock两个类,其中SnakeBlock 类用于描述蛇的一节。
为了使游戏的运行更易于控制,定义Game类用于启动、暂停和继续游戏。
根据需求分析可知,Lawn仅包含大小和颜色两个属性。
为了减少类的数量,可将其大小和颜色等属性添加到Game类中。
综上所述,在贪吃蛇游戏中,有Block(块)、Bean(豆)、SankeBlock (节)、Snake(蛇)、Game(游戏)和MainForm(用户接口)六个类。
游戏逻辑构思图如下:吃到 豆游戏的设计如下: 游戏开始生成蛇生成豆生成石块蛇身增加统计分数 石块碰到石壁游戏结束 增加级别重新开局游戏图标及名称游戏菜单石块速度显示成绩显示级别显示日期及时间显示游戏的定义区域蛇身豆子六.源代码using System;using ;using ;using ;using ;using ;using WindowsFormsApplication1{public partial class MainForm : Form{int a = 200;rigion)break;}if (i ==bGetAPosition = true;}Display(g);f++;}new public void Display(Graphics g){SolidBrush brush = new SolidBrush(color);(brush, , , WIDTH, HEIGHT);Pen pen = new Pen;(pen, new Rectangle, , WIDTH - 1, HEIGHT - 1));}- blocks[ - 2].;int y = 2 * blocks[ - 1]. - blocks[ - 2].;(length, new SnakeBlock(x, y, color, false)); length++;}public void Move(){int x = 0;int y = 0;blocks[0].ChangeHeadToBody();switch (direction){case :x = blocks[0].;y = blocks[0]. - ;break;case :x = blocks[0].;y = blocks[0]. + ;break;case :x = blocks[0]. - ;y = blocks[0].;break;case :x = blocks[0]. + ;y = blocks[0].;break;}(0, new SnakeBlock(x, y, color, true));- 1);}public void Display(Graphics g){for (int i = 0; i < length; i++){blocks[i].Display(g, direction);}}public void Clear(Graphics g, Color backGroundColor){for (int i = 0; i < length; i++){blocks[i].Clear(g, backGroundColor);}}public void RemoveAfter(Graphics g, Color backGroundColor, int blockNum) {for (int i = length - 1; i > blockNum - 1; i--){blocks[i].Clear(g, backGroundColor);(i);length = blockNum;}}石块的定义定义如下,在空白区域中定义一个位置(坐标),使之固定不动,在蛇头撞到这个坐标的时候,参数传到判断蛇生死的函数,时蛇死亡,游戏结束。
public bool MeetStone(Point origion){if ((blocks[0]. == + 40) && blocks[0]. == + 40)) || (blocks[0]. == + 300) &&blocks[0]. == + 80)) || (blocks[0]. == + 150) && blocks[0]. == + 200))||(blocks[0]. == + 100) && blocks[0]. == + 400)))return true;elsereturn false;}当蛇碰到一个豆时,使豆成为蛇体的一部分,其颜色和大小跟蛇一样,蛇身增加。
public bool CanEatBean(Bean bean){if (blocks[0].Origion ==return true;elsereturn false;}public int CanEatSnake(){for (int i = 3; i < ; i++){if (blocks[0].Origion == blocks[i].Origion)return i;}return 0;}public void EatBean(Bean bean, Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight){(g, backGroundColor);Grow();(g, backGroundColor, lawnWidth, lawnHeight, this);eatebean = true;}public bool IsAlive(int lawnWidth, int lawnHeight)if (blocks[0]. < 0)return false;if (blocks[0]. < 0)return false;if (blocks[0]. + > lawnWidth)return false;if (blocks[0]. + > lawnHeight)return false;elsereturn true;}}Game控制游戏的运行,负责在游戏开始时生成Bean、Stone和Snake,以及负责在游戏运行中Snake的移动、Snake的生长、Bean的重生和石块的生产。
并随时检测Snake的生死状态。
Game类的参考代码如下:class Game{Point origion;public Snake snake;public Bean bean;public bool isSnakeAlive;public int lawnWidth;public int lawnHeight;public Game(int _lawnWidth, int _lawnHeight){Random random = new Random();int x = (0, _lawnWidth - 1) / * ;int y = (0, _lawnHeight - 1) / * ;Direction direction = (Direction)(1, 4);snake = new Snake, direction);bean = new Bean;isSnakeAlive = false;lawnWidth = _lawnWidth;lawnHeight = _lawnHeight;}public void Begin(Graphics g, Color backGroundColor, int lawnWidth, int lawnHeight)isSnakeAlive = true;(g, backGroundColor);(g, backGroundColor, lawnWidth, lawnHeight);(g, backGroundColor, lawnWidth, lawnHeight, snake);游戏中石块的填充,可以根据自己制定的坐标来固定石块,可以改变其颜色。