原生JS实现贪食蛇(无敌娱乐版)
来源:互联网 发布:天行网络加速器下载 编辑:程序博客网 时间:2024/04/30 00:49
面向对象分析
确定三个类,一个是地图类Map,一个是食物Food,一个是蛇的本体Snake
- Map类
Map类用来一开始的时候布置出一个区域,自有height,width,color等属性,同时持有一个成员_map属性用于保存操作Dom时候生成的div元素,这里是为了实例化之后,可以让其他对象操作该属性。
注意:appendChild()函数用于在Dom中插入一个节点,并具有以下的特点
如果是已经存在的节点执行再次插入操作,那么该节点将自动从它当前的位置删除并在新的位置重新插入:没有必要显式删除该节点
–引自《javascript权威指南》第六版15.6节(David Flanagan著)
function Map() { this.width = 64 * 24; this.height = 64 * 14; this.color = "#4ECC2B"; this.position = "absolute"; this._map = null; this.show = function () { this._map = document.createElement("div"); this._map.style.width = this.width + "px"; this._map.style.height = this.height + "px"; this._map.style.backgroundColor = this.color; this._map.style.position = this.position; this._map.style.left = 0; this._map.style.top = 0; document.getElementsByTagName("body")[0].appendChild(this._map); } }
- Food类
Food类用于在由Map对象生成的区域中随机生成一个“食物”,自身有一个show方法用于操作Dom节点添加元素,在这里我是直接用的img来作为生成的食物,当然也可以如Map类一样生成div。
注意:需要持有一个属性img来保存第一次生成的img节点,今后再次生成食物的时候就直接操作这个属性,这里是利用了appendChild()函数在插入到新位置前会自动删除已经存在的节点的当前位置
function Food() { this.position = "absolute"; this.img = null; …………………………………… this.show = function () { if(this.img == null){ this.img = document.createElement("img"); this.img.src = "./TIM.png"; } ………………………… map._map.appendChild(this.img); } }
- Snake类
最为复杂的类,分析Snake需要具备属性:direction(前进方向),body(身体),方法:move() (配合定时器实现移动),show() (显示,和move配合刷新蛇的位置), setDirection(keyCode)(通过判断keydown事件的键值来更改蛇的行进方向)
在show方法中,采取了和Food类的show方法一样的思路,利用已经存在的body元素;
在move方法中,用蛇头的坐标和食物的坐标判断是否吃到食物,然后将body数组元素加1,(为什么可以随意添加一个坐标0,0的元素呢,当然是因为紧接着这个元素的坐标就会变成倒数第二节的坐标,这个无关紧要,注意坐标变化一定要从尾向头并且除开头部),然后根据direction属性的值,让蛇头的坐标变化,最后调用show方法,展示刷新后的body
function Snake() { this.direction = "right"; this.body = [[4,2,null],[3,2,null],[2,2,null]]; this.show =function(){ for (var index = 0; index < this.body.length; index++) { var element = this.body[index]; if (element[3]==null) { ……………… } ……………… map._map.appendChild(element[3]); } } this.move =function(){ if(this.body[0][0] == food.x && this.body[0][1] == food.y) { this.body.push([0,0,null]); food.show(); } var length =this.body.length; for (var index = length - 1; index > 0; index--) { var element = this.body[index]; var element2 = this.body[index-1]; element[0] = element2[0]; element[1] = element2[1]; } switch (this.direction) { case "right": this.body[0][0] += 1; ……………… break; case "left": ……………… break; case "up": ………… break; case "down": ………… break; default: break; } this.show(); } this.setDirection=function(keycode){ switch (keycode) { case 37: this.direction = 'left'; break; ……………… } } }
跑起来
后续就很简单了,将三个类的对象都保存在一个window全局对象中,给Snake对象的move方法设置定时器操作,就可以让贪食蛇动起来了。这里当然还需要给document的keydown事件绑定一个函数,用于改变Snake对象的direction属性
window.onload = function () { …………………… setInterval("snake.move()",20); window.document.onkeydown=function(){ var code; code = event ? event.keyCode :window.event.keyCode; snake.setDirection(code); } }
还没完
还有很多需要完善的
1. 撞墙死和撞自己死怎么判定?用蛇头的坐标判定,当然都是在move方法里面做判断
2. 怎么实现自动吃?当然也是在坐标上面做文章
上面两个就不做具体实现了
阅读全文
0 0
- 原生JS实现贪食蛇(无敌娱乐版)
- 贪食蛇JS源码
- js贪食蛇游戏
- JS贪食蛇...
- js贪食蛇--2
- js小练-贪食蛇
- JS贪食蛇代码优化
- 贪食蛇基础版
- VBA实现贪食蛇游戏
- 原生js实现贪吃蛇
- Android贪食蛇-版本1.1(基本功能实现版)
- 用js写的贪食蛇小游戏
- JS小游戏 贪食蛇v1.0
- 用原用JS写一个贪食蛇
- vxworks下实现贪食蛇游戏
- 经典游戏贪食蛇的java实现,
- 用html5实现贪食蛇游戏
- 贪食蛇游戏(java实现)
- 二叉树的C/C++实现
- Python--numpy模块
- mysql 分页优化
- JMM与并发
- hdu 1025 最长子序列,lower_bound的使用,二分查找
- 原生JS实现贪食蛇(无敌娱乐版)
- Spring-事务管理-4
- FragmentPagerAdapter使用
- J2EE的概念以及容器概念总结
- javascript 中关于call方法的详解 和 this
- Java程序员如何培养自学能力?
- atexit()函数
- 关于端口
- 统计难题 【字典树模版】