贪吃蛇实训报告

上传人:仙*** 文档编号:45643053 上传时间:2021-12-08 格式:DOC 页数:25 大小:229.01KB
返回 下载 相关 举报
贪吃蛇实训报告_第1页
第1页 / 共25页
贪吃蛇实训报告_第2页
第2页 / 共25页
贪吃蛇实训报告_第3页
第3页 / 共25页
点击查看更多>>
资源描述
郑州轻工业学院实训报告实训名称:贪吃蛇 指导教师: 姓名: 学号: 班级: 提交日期: 一.实验目的通过开发一款贪吃蛇游戏程序,熟练掌握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 System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using 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.Interval = 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; /Block的颜色 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.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, 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, backGroundColor); 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) break; 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, 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 ChangeHeadToBody() 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, 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); break; 控制蛇头运动的方向 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; public 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(); 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(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); 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 - blocksblocks.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 = blocks0.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.RemoveAt(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; 石块的定义定义如下,在空白区域中定义一个位置(坐标),使之固定不动,在蛇头撞到这个坐标的时候,参数传到判断蛇生死的函数,时蛇死亡,游戏结束。 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.Origion.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() 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); eatebean = 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的生长、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 = random.Next(0, _lawnWidth - 1) / Block.WIDTH * 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 Begin(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 SolidBrush(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 Rectangle(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.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); isSnakeAlive = false; MessageBox.Show(就算再饿也不能咬自己啊,死了吧!); if (!snake.IsAlive(lawnWidth, lawnHeight)|snake.MeetStone(origion) isSnakeAlive = false; Timer组件用于在用户定义的时间间隔引发事件。在游戏的运行过程中,通过时间函数可以判断蛇的生死,蛇吃豆子的多少。还有日期的显示,时间的显示。统计蛇吃豆子的多少。当吃够规定的豆的时候,级别增加,游戏的速度增加,蛇运动速度增加。 private void timer1_Tick(object sender, EventArgs e) Date.Text = DateTime.Today.ToLongDateString(); time.Text = DateTime.Now.ToLongTimeString(); Success.Text = (Bean.f *10).ToString(); if (Bean.f = 5) jibie.Text = (1 + (Bean.f + 1) % 5).ToString(); timer1.Enabled = true; timer1.Interval = 100; Velocity.Text = (a + 100).ToString(); if (Bean.f = 10 ) jibie.Text = (2 + (Bean.f + 1) % 10).ToString(); timer1.Enabled = true; timer1.Interval = 80; Velocity.Text = (a + 150).ToString(); if (Bean.f = 20) jibie.Text = (3 + (Bean.f + 1) % 20).ToString(); timer1.Enabled = true; timer1.Interval = 70; Velocity.Text = (a + 200).ToString(); if (Bean.f = 30) jibie.Text = (3 + (Bean.f + 1) % 30).ToString(); timer1.Enabled = true; timer1.Interval = 60; Velocity.Text = (a + 250).ToString(); if (Bean.f = 40) jibie.Text = (3 + (Bean.f + 1) % 40).ToString(); timer1.Enabled = true; timer1.Interval = 50; Velocity.Text = (a + 300).ToString();
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!