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自动适应的图片弹窗实例
Jun 29 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
AngularJS directive返回对象属性详解
Mar 28 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
Sep 08 Javascript
vue element项目引入icon图标的方法
Jun 06 Javascript
JavaScript实现创建自定义对象的常用方式总结
Jul 09 Javascript
vue中的自定义分页插件组件的示例
Aug 18 Javascript
Node.js assert断言原理与用法分析
Jan 04 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
第一个无线电台是由谁发明的
2021/03/01 无线电
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP多线程类及用法实例
2014/12/03 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
javascript表单正则应用
2017/02/04 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
java字符串格式化输出实例讲解
2021/01/06 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
雷锋之歌观后感
2015/06/10 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
MySQL创建定时任务
2022/01/22 MySQL
MySQL 计算连续登录天数
2022/05/11 MySQL