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 相关文章推荐
表单提交验证类
Jul 14 Javascript
在js中单选框和复选框获取值的方式
Nov 06 Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
Javascript浅谈之引用类型
Dec 18 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
Dec 10 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
JS库之ParticlesJS使用简介
Sep 12 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
Dec 12 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
Dec 13 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 json与xml序列化/反序列化
2013/10/28 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
python中return不返回值的问题解析
2020/07/22 Python
Python学习笔记之装饰器
2020/08/06 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
海上钢琴师观后感
2015/06/03 职场文书