




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机软件技术基础计算机软件技术基础课程设计题 目: 贪吃蛇游戏 作 者: 11一、 课题描述本课题是用c#开发的一款简单的贪吃蛇游戏,主要实现以下目标:1. 能简便的开始游戏;2. 能够用上下左右键控制蛇的运动方向,使之向蛇的方向运动;3. 吞吃食物可使蛇的长度变长,撞到墙或者蛇头撞到自己游戏结束;4. 当蛇死亡以后出现游戏得分,游戏结束。二、 系统设计系统设计思路三、 程序设计过程和主要代码1.新建一个windows 应用程序,起名snake;2.重命名form1,改为formmain。3.从工具栏里拖放一个picturebox到formmain上面,设置属性:picturebox1的borderstyle属性选择为fixedsingle,以显示边框,formmain的keypreview属性设定为true,这样整个窗体可以响应键盘按键事件;4.添加picturebox1和formmain的事件,添加的事件有picturesbox1的paint事件picturebox1_paint:用于更新游戏画面formmain的keydown事件formmain_keydown:用于响应用户按键formmain的load事件formmain_load:用于做一些初始化的工作5.添加两个类文件block类:block类是“蛇块”类,这个类就是用于描述蛇身子一节一节的信息,从运行效果图上可以看到就是那一个一个小方块的信息; palette类:就是主画布,是游戏的主要代码;6.实现block类block类用于描述蛇块信息,记录每个蛇块的坐标,颜色,以及大小这些信息,具体代码如下 class block private color _color; /颜色 private int _size; /单位大小 private point _point; /坐标 public block(color color,int size,point p) this._color = color; this._point = p; this._size = size; public point point get return this._point; /绘制自身到画布 public virtual void paint(graphics g) solidbrush sb = new solidbrush(_color); lock(g) try g.fillrectangle(sb, this.point.x * this._size, this.point.y * this._size, this._size - 1, this._size - 1 ); catch 这个类比较简单,point p用于记录该蛇块的“坐标”,由于蛇块是一个块,不是一个点,这里记录的是这个块的坐标。paint函数根据坐标以及蛇块大小计算出实际绘图的坐标,进行绘图,蛇块是一个正方形(矩形),我们用矩形绘制,绘制的大小比size小1个像素,这么做的原因是为了突出蛇块与蛇块之间的间隙,也就是说蛇块与蛇块之间有1个像素的间隙,这就是我们看到游戏效果图中的蛇块是一段一段的原因两种图形的对比如下 7.palette类的实现palette类:游戏的核心处理类,里面定义了画布的大小,背景色,蛇块列表以及游戏速度,移动方向等属性另外还提供了timer计时器,用于定时更新蛇块坐标位置,以及如何在画面上画图的函数,整个代码如下class palette private int _width = 30;/宽度 private int _height = 20;/高度 private color _bgcolor;/背景色 private graphics _gppalette;/画布 private arraylist _blocks;/蛇块列表 private diretion _direction;/前进方向 private timer timerblock;/更新器 private block _food;/当前食物 private int _size = 20;/单位大小 private int _level = 1;/游戏等级 private bool _isgameover = false; private int _speed = new int 500 , 450 , 400 , 350 , 300 , 250 , 200 , 150 , 100 , 50 ;/游戏速度 public palette(int width, int height, int size,color bgcolor,graphics g,int lvl)构造函数,设定类属性值,还有初始化蛇块列表arraylist this._width = width; this._height = height; this._bgcolor = bgcolor; this._gppalette = g; this._size = size; this._level = lvl; this._blocks = new arraylist(); this._blocks.insert(0,(new block(color.red,this._size,new point(width/2,height/2); this._direction = diretion.right; public diretion directionstart函数用于开始游戏,这个函数的内部其实就是设定食物,以及触发计时器这里面定义了计时器的事件触发间隔,是通过level然后找到speed数组里的对应毫秒值设定的。然后触发事件是onblocktimedevent,最后是启动计时器开始计时。 get return this._direction; set this._direction = value; /开始游戏 public void start() this._food = getfood();/生成一个食物 /初始化计时器 timerblock = new system.timers.timer(_speedthis._level); timerblock.elapsed += new system.timers.elapsedeventhandler(onblocktimedevent); timerblock.autoreset = true;onblocktimedevent函数是计时器的执行函数,这个函数用于更新蛇块信息列表,以及检测游戏是否结束等等函数内部调用了两个函数,一个是move函数,一个是checkdead函数 timerblock.start(); /定时更新 private void onblocktimedevent(object source,elapsedeventargs e) this.move();/前进一个单位 if(this.checkdead()/检测是否游戏结束 this.timerblock.stop(); this.timerblock.dispose(); system.windows.forms.messagebox.show(score:+this._blocks.count,game over);checkdead函数用于检测游戏是否结束检测是否结束分两种情况,一种是撞上边界,即蛇头坐标超出画布范围,一种是蛇头撞上了蛇身,也就是蛇头的坐标和蛇身的某个坐标重合,通过for循环来检查第二种情况 /检查游戏是否结束 private bool checkdead() block head = (block)(this._blocks0); if (head.point.x 0 | head.point.y = this._width | head.point.y = this._height) return true; for (int i = 1;ithis._blocks.count;i+) block b = (block)this._blocksi; if (head.point.x = b.point.x & head.point.y = b.point.y) this._isgameover = true; return true;getfood函数用于生成下一个食物,其实就是一个蛇块,生成的规则就是,坐标要在画布范围内,并且食物的坐标不能和贪吃蛇的坐标重合,通过for循环检查食物坐标是否和贪吃蛇的蛇块列表arraylist里的蛇块有冲突 this._isgameover = false; return false; /生成下一个食物,也就是下一个蛇块 private block getfood() block food = null; random r = new random(); bool redo = false; while (true) redo = false; int x = r.next(this._width); int y = r.next(this._height); for(int i=0;ithis._blocks.count;i+) block b = (block)(this._blocksi); if(b.point.x = x & b.point.y = y) redo = true; if(redo = false) food = new block(color.black,this._size,new point(x,y); break; return food; /前进一节move函数用于更新整个蛇块的坐标,前面通过将蛇块信息放到arraylist里来表示贪吃蛇的整个信息,其中根据下标从0到count-1依次表示各个蛇块的信息,移动的解决方案就是在arraylist的0下标处插入一个新的蛇块(蛇头),然后把原来最后一个(count-1)的那个蛇块(蛇尾)去掉实际代码中增加了吃食物的情况判断,也就是说如果新蛇头的坐标和食物的坐标一致,那么就不做删除原蛇尾的操作了,这样产生的效果就是蛇块列表的长度增加了一个,达到吃食物变长的效果, private void move() point p; block head = (block)(this._blocks0); if (this._direction = diretion.up) p = new point(head.point.x,head.point.y - 1); else if (this._direction = diretion.down) p = new point(head.point.x,head.point.y + 1); else if (this._direction = diretion.left) p = new point(head.point.x - 1,head.point.y); else p = new point(head.point.x + 1,head.point.y); block b = new block(color.red, this._size,p); if(this._food.point != p) this._blocks.removeat(this._blocks.count - 1); else this._food = this.getfood(); this._blocks.insert(0,b); this.paintpalette(this._gppalette); /更新画板paintpalette函数需要一个参数,也就是绘图句柄,然后在这个画布上画图也就是我们看到的游戏效果首先用背景色清空画布,然后画食物,其次是通过for循环将贪吃蛇的每个蛇块画在画布上,以此达到游戏效果。 public void paintpalette(graphics gp) gp.clear(this._bgcolor); this._food.paint(gp); foreach (block b in this._blocks) b.paint(gp); /枚举四个方向 public enum diretion left, right, up, down, 8. 主界面的实现在主界面的类里面定义paletteprivate palette p;然后在page_load里实现初始化贪吃蛇,代码如下private palette p; public form1() initializecomponent(); private void form1_load(object sender, eventargs e) int width, height, size; width = height = 20; size = 15; this.picturebox1.width = width * size; this.picturebox1.height = height * size; this.width = picturebox1.width + 40; this.height = picturebox1.height + 60; p = new palette(width, height, size, this.picturebox1.backcolor, graphics.fromhwnd(this.picturebox1.handle), 5); p.start(); formmain_keydown函数,这个函数用于更改贪吃蛇的移动方向,这里设定了wdsa和上下左右都可以使用,更改移动方向的前提就是新的方向不能和当前方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业活动策划执行服务合同书条款细节说明
- 物业管理合同责任及免责条款解析
- 零星装修合同条款详解与模板下载
- 商业银行中小企业贷款信用风险:度量、管理与实例剖析
- 建筑工地安全员c证考试题库及答案解析
- 护理药理学考试题库及答案解析
- 【语文】广东省佛山市第九小学小学四年级下册期末试题(含答案)
- 安全驾驶的考试题库多选及答案解析
- 清徐特岗岗前培训考试题及答案解析
- 2026届新疆维吾尔自治区阿克苏地区库车县数学九年级第一学期期末经典模拟试题含解析
- 拖欠工资协议书
- 电缆沟及盖板作业指导书培训课件
- GB/T 19867.6-2016激光-电弧复合焊接工艺规程
- GB/T 19478-2018畜禽屠宰操作规程鸡
- 三级教育考试卷(焊工)答案
- 无生上课课堂教学评价标准
- 深圳低压电工作业-实际操作培训课件-科目四-作业现场应急处理
- 植物生理学第十三章植物的逆境生理课件
- 中控岗位培训课件
- 宾馆酒店前台责任书
- 2.2 第2课时 基本不等式的综合应用(课件)高一数学(人教A版2019必修第一册)
评论
0/150
提交评论