版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、郑州轻工业学院实训报告实训名称:贪吃蛇 指导教师: 姓名: 学号: 班级: 提交日期: 一.实验目的通过开发一款贪吃蛇游戏程序,熟练掌握c#编程语言、和面向对象程序设计方法,独立完成一个游戏程序的开发。二.实验题目 本次实训的题目为贪吃蛇。通过使用c#编程语言来实现。三.功能描述1.游戏的基本功能描述1) 游戏场地是一片矩形区域的空地构成,蛇可以在这片定义的区域中自由移动。2) 定义一个block来构成石块,蛇头,蛇身以及豆。蛇由蛇头和蛇身组成。3) 当游戏开始之后,定义的区域中出现一颗豆和一条蛇,并且蛇不停地移动,蛇移动的方向与蛇头的方向一致。4) 通过space或者暂停键可以使游戏停止,蛇
2、停止移动,分数停止积分。5) 当蛇移动时,玩家可以使用“”、“”、“”和“”四个方向键改变蛇的移动方向。6) 当蛇头与豆的位置重合时,豆被蛇吃掉,同时在草坪中再生成一颗新的豆,蛇身增加一节。7) 当蛇头碰到石块时,蛇死亡,游戏结束。8) 当蛇头咬到蛇身时,则蛇死亡,游戏结束。9) 当蛇头碰到草坪四周时,蛇立即毙命,游戏结束。10) 游戏分为不同的级别,第一关游戏速度为200,当蛇吃五个豆子就可以过关,级别显示为2,速度增加100变为300.第二关为吃够10个豆子,速度增加50,以后以此类推。11) 游戏菜单中设有游戏帮助,玩家可以通过点击帮助了解游戏的玩法。12) 对于不是第一次玩的玩家可以改
3、变蛇的运动速度,来增加难度。在菜单中设有加速和减速两个键,单击可以改变速度。13) 游戏菜单中还有时间显示。14) 当游戏暂停时,可以通过“继续”键使游戏继续进行。四.需求分析本游戏用户可以自己练习和娱乐。本游戏需要满足以下几点要求:(1) 利用方向键“、”来改变蛇的运行方向。 (2) 空格键暂停游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。可行性分析:贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。贪吃蛇的核心算法是如何实现蛇的移动和吃掉食物后如何变成新的蛇体。没有碰到食物的时候,
4、把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。玩家可以根据自己的水平选择不同的级别进行游戏挑战。贪吃蛇游戏中定义如下:1)空白区域(lawn):定义的区域是贪吃蛇游戏的场地。豆、石头和蛇只能存在于空白区域的范围之内。根据个人爱好还可以添加背景,改变区域的大小和颜色。2)蛇(snake):在贪吃蛇游戏中,蛇由若干节组成,其中第一节是蛇头,在蛇头上面定义两个点,作为蛇
5、的眼睛,其余是蛇身。在游戏过程中,有且仅有一条蛇,并且蛇在不停地移动。如果蛇吃了豆,则蛇生长一节。如果蛇头碰到蛇身,蛇死亡,游戏结束。如果蛇头离开所定义的区域,则蛇死亡游戏结束。当蛇头撞到定义的石块上的时候游戏结束。在定义蛇的时候可以改变蛇的初始长度,也可以改变蛇的颜色和大小。3)豆(bean):在贪吃蛇游戏中,豆是蛇的食物。在游戏过程中,有且仅有一颗豆。如果蛇吃了豆,则重新生成一颗豆。豆的出现是随机性的。4)石块(stone):游戏中石块和豆是同时出现的,不同的是,豆是随机产生的,而石块是固定的,它的坐标在写代码的时候就定义好了,不能够改变。它的大小和颜色也可以随便的改变。5)菜单(menu
6、strip):在贪吃蛇游戏中有游戏菜单,里面有开局、暂停、继续、加速、减速、帮助等菜单。还有label控件,显示速度、时间、日期和积分的。五.设计说明snake的每一节都有位置和大小等属性。而bean和stone也具有这两个属性。抽象出这三者的共同特征,抽象出一般类block,用于描述一个块。block派生出bean和snakeblock两个类,其中snakeblock类用于描述蛇的一节。为了使游戏的运行更易于控制,定义game类用于启动、暂停和继续游戏。根据需求分析可知,lawn仅包含大小和颜色两个属性。为了减少类的数量,可将其大小和颜色等属性添加到game类中。综上所述,在贪吃蛇游戏中,有
7、block(块)、bean(豆)、sankeblock(节)、snake(蛇)、game(游戏)和mainform(用户接口)六个类。游戏逻辑构思图如下:定义空白区域游戏开始生成石块生成豆生成蛇重新开局吃到蛇身增加豆增加级别统计分数石块碰到石壁游戏结束游戏的设计如下:游戏图标及名称豆子成绩显示速度显示游戏菜单蛇身级别显示石块游戏的定义区域日期及时间显示六.源代码using system;using system.collections.generic;using system.componentmodel;using system.data;using system.drawing;using
8、 system.linq;using system.text;using system.windows.forms;namespace windowsformsapplication1 public partial class mainform : form int a = 200;/定义初速度为200 private game game;/ datetime c; public mainform() initializecomponent(); game = new game(lawn.width, lawn.height); timer1.enabled = true; timer1.in
9、terval = a; timer1.enabled = false; velocity.text = a.tostring(); block是用来构成bean(豆)和snake(蛇)还有stone(石块)的最基本的单位,是bean和snakeblock的基类。block类的参考代码如下。 class block protected point origion; /block的左上顶点 public const int width = 10; /block的宽度 public const int height = 10; /block的高度 protected color color; /bl
10、ock的颜色 public block() origion = new point(0, 0); color = new color(); public block(int x, int y, color _color) origion = new point(x, y); color = _color; public point origion get return origion; public void display(graphics g) solidbrush brush = new solidbrush(color); g.fillrectangle(brush, origion.
11、x, origion.y, width, height); pen pen = new pen(color.black); g.drawrectangle(pen, new rectangle(origion.x, origion.y, width - 1, height - 1); public void clear(graphics g, color backgroundcolor) solidbrush brush = new solidbrush(backgroundcolor); g.fillrectangle(brush, origion.x, origion.y, width,
12、height); 这是对豆的定义,是由block派生而来的,在系统开始时,使豆产生,它的出现位置为随机生成。其代码如下: class bean : block public static int f = 0;/吃到豆子的个数 public bean(color _color) origion = new point(0, 0); color = _color; public void creat(graphics g, color backgroundcolor, int lawnwidth, int lawnheight, snake snake) clear(g, backgroundco
13、lor); bool bgetaposition = false; /是否找到生成豆的位置 random random = new random(); while (!bgetaposition) origion.x = random.next(0, lawnwidth - 1) / width * width; origion.y = random.next(0, lawnheight - 1) / height * height; int i; for (i = 0; i snake.length; i+) if (origion = snake.blocksi.origion) brea
14、k; if (i = snake.length) bgetaposition = true; display(g); f+; new public void display(graphics g) solidbrush brush = new solidbrush(color); g.fillrectangle(brush, origion.x, origion.y, width, height); pen pen = new pen(color.black); g.drawrectangle(pen, new rectangle(origion.x, origion.y, width - 1
15、, height - 1); /display(g); snakeblock表示蛇的一节,是由block派生而来的。它组成蛇身,其代码如下所示: class snakeblock : block private bool ishead; public bool ishead get return ishead; public snakeblock(int x, int y, color _color, bool _ishead) origion = new point(x, y); color = _color; ishead = _ishead; public void changehead
16、tobody() if (ishead) ishead = false; public void display(graphics g, direction direction) base.display(g); if (ishead) /绘制蛇眼 solidbrush brush = new solidbrush(color.black); switch (direction) case direction.up: case direction.down: g.fillrectangle(brush, origion.x + width / 4, origion.y + height / 2
17、, 2, 2); g.fillrectangle(brush, origion.x + width / 4 * 3, origion.y + height / 2, 2, 2); break; case direction.left: case direction.right: g.fillrectangle(brush, origion.x + width / 2, origion.y + height / 4, 2, 2); g.fillrectangle(brush, origion.x + width / 2, origion.y + height / 4 * 3, 2, 2); br
18、eak; 控制蛇头运动的方向 public enum direction up, down, left, right ;对蛇的编码也是由block派生而来的,在这里面可以定义蛇的颜色和长度。 class snake public static bool eatebean; private int length; public direction direction; private color color; public list blocks; private const int init_length = 10; public int length get return length; p
19、ublic snake(color _color, direction _direction) direction = _direction; color = _color; blocks = new list(); public void creat(graphics g, color backgroundcolor, int lawnwidth, int lawnheight) clear(g, backgroundcolor); blocks.clear(); length = init_length; int x; int y; random random = new random()
20、; x = random.next(lawnwidth / 4, lawnwidth / 4 * 3) / block.width * block.width; y = random.next(lawnheight / 4 - 1, lawnheight / 4 * 3) / block.height * block.height; blocks.add(new snakeblock(x, y, color, true);蛇运动的方向控制 switch (direction) case direction.up: for (int i = 1; i length; i+) blocks.add
21、(new snakeblock(x, y + block.height * i, color, false); break; case direction.down: for (int i = 1; i length; i+) blocks.add(new snakeblock(x, y - block.height * i, color, false); break; case direction.left: for (int i = 1; i length; i+) blocks.add(new snakeblock(x + block.width * i, y, color, false
22、); break; case direction.right: for (int i = 1; i length; i+) blocks.add(new snakeblock(x - block.width * i, y, color, false); break; display(g); public void grow() int x = 2 * blocksblocks.count - 1.origion.x - blocksblocks.count - 2.origion.x; int y = 2 * blocksblocks.count - 1.origion.y - blocksb
23、locks.count - 2.origion.y; blocks.insert(length, new snakeblock(x, y, color, false); length+; public void move() int x = 0; int y = 0; blocks0.changeheadtobody(); switch (direction) case direction.up: x = blocks0.origion.x; y = blocks0.origion.y - block.height; break; case direction.down: x = blocks
24、0.origion.x; y = blocks0.origion.y + block.height; break; case direction.left: x = blocks0.origion.x - block.width; y = blocks0.origion.y; break; case direction.right: x = blocks0.origion.x + block.width; y = blocks0.origion.y; break; blocks.insert(0, new snakeblock(x, y, color, true); blocks.remove
25、at(blocks.count - 1); public void display(graphics g) for (int i = 0; i length; i+) blocksi.display(g, direction); public void clear(graphics g, color backgroundcolor) for (int i = 0; i blocknum - 1; i-) blocksi.clear(g, backgroundcolor); blocks.removeat(i); length = blocknum; 石块的定义定义如下,在空白区域中定义一个位置
26、(坐标),使之固定不动,在蛇头撞到这个坐标的时候,参数传到判断蛇生死的函数,时蛇死亡,游戏结束。 public bool meetstone(point origion) if (blocks0.origion.x = (origion.x + 40) & blocks0.origion.y = (origion.y + 40) | (blocks0.origion.x = (origion.x + 300) & blocks0.origion.y = (origion.y + 80) | (blocks0.origion.x = (origion.x + 150) & blocks0.ori
27、gion.y = (origion.y + 200)| (blocks0.origion.x = (origion.x + 100) & blocks0.origion.y = (origion.y + 400) return true; else return false; 当蛇碰到一个豆时,使豆成为蛇体的一部分,其颜色和大小跟蛇一样,蛇身增加。 public bool caneatbean(bean bean) if (blocks0.origion = bean.origion) return true; else return false; public int caneatsnake
28、() for (int i = 3; i blocks.count; i+) if (blocks0.origion = blocksi.origion) return i; return 0; public void eatbean(bean bean, graphics g, color backgroundcolor, int lawnwidth, int lawnheight) bean.clear(g, backgroundcolor); grow(); bean.creat(g, backgroundcolor, lawnwidth, lawnheight, this); eate
29、bean = true; public bool isalive(int lawnwidth, int lawnheight) if (blocks0.origion.x 0) return false; if (blocks0.origion.y lawnwidth) return false; if (blocks0.origion.y + block.height lawnheight) return false; else return true; game控制游戏的运行,负责在游戏开始时生成bean、stone和snake,以及负责在游戏运行中snake的移动、snake的生长、be
30、an的重生和石块的生产。并随时检测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 = random.next(0, _lawnwidth - 1) / block.w
31、idth * block.width; int y = random.next(0, _lawnheight - 1) / block.height * block.height; direction direction = (direction)random.next(1, 4); snake = new snake(color.red, direction); bean = new bean(color.red); issnakealive = false; lawnwidth = _lawnwidth; lawnheight = _lawnheight; public void begi
32、n(graphics g, color backgroundcolor, int lawnwidth, int lawnheight) issnakealive = true; snake.clear(g, backgroundcolor); snake.creat(g, backgroundcolor, lawnwidth, lawnheight); bean.creat(g, backgroundcolor, lawnwidth, lawnheight, snake); 游戏中石块的填充,可以根据自己制定的坐标来固定石块,可以改变其颜色。 solidbrush brush = new so
33、lidbrush(color.darkviolet); pen pen = new pen(color.darkviolet); g.fillrectangle(brush, origion.x + 40, origion.y + 40, 10, 10); g.drawrectangle(pen, new rectangle(origion.x + 40, origion.y + 40, 10, 10); g.fillrectangle(brush, origion.x + 300, origion.y + 80, 10, 10); g.drawrectangle(pen, new recta
34、ngle(origion.x + 300, origion.y + 80, 10, 10); g.fillrectangle(brush, origion.x + 150, origion.y + 200, 10, 10); g.drawrectangle(pen, new rectangle(origion.x + 150, origion.y + 200, 10, 10); g.fillrectangle(brush, origion.x + 100, origion.y + 400, 10, 10); g.drawrectangle(pen, new rectangle(origion.
35、x + 100, origion.y + 400, 10, 10); public void ontime(graphics g, color backgroundcolor, int lawnwidth, int lawnheight) if (issnakealive) snake.clear(g, backgroundcolor); snake.move(); snake.display(g); bean.display(g); if (snake.caneatbean(bean) bean.clear(g, backgroundcolor); snake.eatbean(bean, g, backgroundcolor, lawnwidth, lawnheight); bean.display(g); int blocknum = snake.caneatsnake(); if (blocknum 0) snake.removeafter(g, backgroundcolor, blocknum); issn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安溪县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年绥中县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年梁山县医疗事业单位人员招聘考试备考题库及答案解析
- 2026年佳县医疗事业单位人员招聘考试模拟试题及答案解析
- 2026年夏邑县社区工作者招聘笔试参考题库及答案解析
- 2026年桓仁满族自治县医疗事业单位人员招聘笔试备考试题及答案解析
- 2026年正定县带编教师招聘笔试备考试题及答案解析
- 2026年富裕县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年鱼台县医疗事业单位人员招聘笔试模拟试题及答案解析
- 2026年修文县医疗事业单位人员招聘笔试模拟试题及答案解析
- 泸州兴泸水务集团营业员笔试题库
- 广元市公开招募2026年养老服务管理专员政策性岗位工作人员的(67 )考试备考题库及答案详解
- 旁站监理工作监理实施细则
- 2026年江苏压力容器考试试题及答案
- (2026年)重症后管理专家共识应用经验分享学习与解读课件
- 上海八年级数学上册-一元二次方程的应用-实际问题(同步练习)
- 2026年全市统计基本单位名录库题库
- 大学新教师入职培训
- 科室内部投诉管理制度
- 羊水栓塞案例分析
- 2026年陕西水务发展集团及所属企业招聘(20人)参考考试试题及答案解析
评论
0/150
提交评论