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 判断是否存在函数的方法
Jan 03 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
javascript实现超炫的向上滑行菜单实例
Aug 03 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
May 31 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
Jun 13 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
JS验证码实现代码
Sep 14 Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 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
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
js判断变量是否未定义的代码
2020/03/28 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
vue v-model的用法解析
2020/10/19 Javascript
Python遍历pandas数据方法总结
2018/02/09 Python
python 定时修改数据库的示例代码
2018/04/08 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
销售员岗位职责范本
2015/04/11 职场文书