js实现贪吃蛇小游戏(容易理解)


Posted in Javascript onJanuary 22, 2017

话不多说,请看代码:

<!doctype html>
<html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>贪吃蛇</title>
 <link rel="stylesheet" href="style.css">
 <script src="style.js" ></script>
 </head>
 <body>
 <div id="container"></div>
 </body>
</html>

第一步:初始化地图,创建蛇圈。
第二步:创建蛇,随机生产食物。
第三步:让蛇移动起来。
第四步:通过js绑定键盘事件,控制蛇移动方向。

var box={width:50,height:50};//每一个方块的高度
var snake=[];//保存蛇每一节身体对应的span
var DIR={
 DIR_RIGHT:1,
 DIR_LEFT:2,
 DIR_TOP:3,
 DIR_BOTTOM:4
};
var dir=DIR.DIR_BOTTOM;
var food=null; //始终记录当前的食物 
window.onload=function(){
 //1.初始化地图
 initMap();
 //2.创建蛇
 //2.5随机显示食物
 showFood();
 createSnake();
 //3.让蛇动起来
 setInterval(snakeMove,100);
 //4.控制蛇移动
 document.onkeyup=function(e){
 switch(e.keyCode){
 case 37:dir=DIR.DIR_LEFT;break;
 case 38:dir=DIR.DIR_TOP;break;
 case 39:dir=DIR.DIR_RIGHT;break;
 case 40:dir=DIR.DIR_BOTTOM;break; 
 } 
 }
};
function isInSnakeBody(left,top){
 for(var i=0;i<snake.length;i++){
 if(snake[i].offsetTop==top&&snake[i].offsetLeft==left){
 return true;
 }
 }
}
//这种随机生成食物的方法效率低---随着蛇身体的增长,随机生成食物的时间会变慢。
function showFood(){
 var con=document.getElementById("container");
 food=document.createElement("span");
 food.className="food";
 food.style.width=box.width+"px";
 food.style.height=box.height+"px";
 var left,top;
 do{
 left=Math.floor((con.offsetWidth-2)/box.width*Math.random())*box.width;
 top=Math.floor((con.offsetHeight-2)/box.height*Math.random())*box.height;
 }while(isInSnakeBody(left,top));
 food.style.left=left+"px";
 food.style.top=top+"px";
 con.appendChild(food);
}
function initMap(){
 var con=document.getElementById("container");
 var row=Math.floor(con.offsetWidth/box.width);
 var rol=Math.floor(con.offsetHeight/box.height);
 var num=row*rol;
 var newSpan=null;
 for(var i=1;i<=num;i++){
 newSpan=document.createElement("span");
 newSpan.style.width=box.width+"px";
 newSpan.style.height=box.height+"px";
 con.appendChild(newSpan);
 } 
}
function createSnake(){
 var newBody=null;
 var con=document.getElementById("container");
 for(var i=1;i<=5;i++){
 newBody=document.createElement("span");
 newBody.style.width=box.width+"px";
 newBody.style.height=box.height+"px";
 newBody.style.left=(i-1)*box.width+"px";
 newBody.style.top="0px";
 newBody.className="snake";
 con.appendChild(newBody);
 snake.push(newBody);
 }
}
function snakeMove(){
 var con=document.getElementById("container");
 //蛇头移动
 var head=snake[snake.length-1];
 var newTop=head.offsetTop,newLeft=head.offsetLeft;
 switch(dir){
 case DIR.DIR_LEFT:newLeft-=box.width; break;
 case DIR.DIR_RIGHT:newLeft+=box.width; break;
 case DIR.DIR_TOP:newTop-=box.height; break;
 case DIR.DIR_BOTTOM:newTop+=box.height; break;
 default:break;
 }
 //如果超出边界,计算蛇头下一个位置的坐标
 if(newLeft>con.offsetWidth-2-1){newLeft=0;}
 if(newLeft<0){newLeft=con.offsetWidth-2-box.width;}
 if(newTop<0){newTop=con.offsetHeight-2-box.height;}
 if(newTop>con.offsetHeight-2-1){newTop=0;}
 //判断新蛇头的位置是不是在蛇身体里面
 //for(var i=0;i<snake.length-1;i++){
 // if(snake[i].offsetLeft==newLeft&&snake[i].offsetTop==newTop){
 // alert("Game over!!");
 // window.location.href=window.location.href;
 // } 
 //}
 //1.如果吃到食物
 if(newLeft==food.offsetLeft&&newTop==food.offsetTop){
 food.className="snake";
 snake.push(food);
 showFood();
 return;
 }
 //2.如果没吃到
 //除蛇头外身体移动
 for(var i=0;i<snake.length-1;i++){
 snake[i].style.top=snake[i+1].offsetTop+"px";
 snake[i].style.left=snake[i+1].offsetLeft+"px";
 }
 head.style.left=newLeft+"px";
 head.style.top=newTop=newTop+"px";
}
*{
 padding:0;
 margin:0;
}
html,body{
 width:100%;
 height:100%;
}
body{
 position:relative;
}
div#container{
 position:absolute;
 top:0;
 bottom:0;
 left:0;
 right:0;
 margin:auto;
 width:800px;
 height:500px;
 border:1px solid black;
 font-size:0px;
}
span{
 display:inline-block;
 border:1px solid black;
 box-sizing:border-box;
}
span.snake{
 position:absolute;
 background-color:red;
}
span.food{
 position:absolute;
 background-color:blue;
}

最后的效果图如下:

 js实现贪吃蛇小游戏(容易理解)

js实现贪吃蛇小游戏(容易理解)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js 实现复制到粘贴板的功能代码
May 13 Javascript
checkbox设置复选框的只读效果不让用户勾选
Aug 12 Javascript
JavaScript数组各种常见用法实例分析
Aug 04 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
javascript 数组的正态分布排序的问题
Jul 31 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
再谈Javascript中的异步以及如何异步
Aug 19 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
Feb 05 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 Javascript
jQuery zTree树插件动态加载实例代码
May 11 jQuery
Vue-Router模式和钩子的用法
Feb 28 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
Jan 22 #Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
Jan 22 #Javascript
js实现图片360度旋转
Jan 22 #Javascript
Vue 过渡(动画)transition组件案例详解
Jan 22 #Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
Jan 22 #Javascript
boostrapTable的refresh和refreshOptions区别浅析
Jan 22 #Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 #Javascript
You might like
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
php db类库进行数据库操作
2009/03/19 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
移动节点的jquery代码
2014/01/13 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
投标诚信承诺书
2014/05/26 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
项目投资合作意向书
2014/07/29 职场文书
办理收楼委托书范本
2014/10/09 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
警告通知
2015/04/25 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
夏洛特的网观后感
2015/06/15 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
JS实现简单的九宫格抽奖
2022/06/28 Javascript