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 相关文章推荐
JavaScript 10件让人费解的事情
Feb 15 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
Kindeditor在线文本编辑器如何过滤HTML
Apr 14 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
Javascript对象字面量的理解
Jun 22 Javascript
javascript使用闭包模拟对象的私有属性和方法
Oct 05 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
Mar 07 Javascript
vue中axios解决跨域问题和拦截器的使用方法
Mar 07 Javascript
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
JS sort方法基于数组对象属性值排序
Jul 10 Javascript
.netcore+vue 实现压缩文件下载功能
Sep 24 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
PHP开发中常用的8个小技巧
2008/08/27 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
node中的session的具体使用
2018/09/14 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
python实现ping的方法
2015/07/06 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
python 下划线的不同用法
2020/10/24 Python
Python排序函数的使用方法详解
2020/12/11 Python
2014年学习雷锋活动总结
2014/03/01 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
环保标语口号
2014/06/13 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
JavaScript实现简单拖拽效果
2021/09/15 Javascript