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 相关文章推荐
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
原生javaScript做得动态表格(注释写的很清楚)
Dec 29 Javascript
javasctipt如何显示几分钟前、几天前等
Apr 30 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
Vue.js之slot深度复制详解
Mar 10 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
jQuery中库的引用方法
Jan 06 jQuery
Vue下拉框回显并默认选中随机问题
Sep 06 Javascript
微信小程序实现左滑动删除效果
Mar 30 Javascript
js实现简单的随机点名器
Sep 17 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
JS实现多功能计算器
2020/10/28 Javascript
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
使用Python生成XML的方法实例
2017/03/21 Python
python实现小球弹跳效果
2019/05/10 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
Python 实现集合Set的示例
2020/12/21 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
暑假社会实践证明格式
2014/10/28 职场文书
国家助学金受助感言
2015/08/01 职场文书
聘任书格式及范文
2015/09/21 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫