js实现网页版贪吃蛇游戏


Posted in Javascript onFebruary 22, 2020

使用原生 js 实现贪吃蛇小游戏,首先这个 小游戏的目录结构如下: 有 贪吃蛇 , 食物 ,地图 ,还有 游戏

js实现网页版贪吃蛇游戏

当我们在浏览器打开 index.html 的时候,会出现 移动的小蛇 ,随机生成的食物(这里只有一个,当前食物被吃掉,才会初始化下一个),用户通过键盘上的方向键控制小蛇移动的方向

js实现网页版贪吃蛇游戏

当小蛇触碰到了墙,即画布边缘的时候,游戏结束!

js实现网页版贪吃蛇游戏

接下来就是代码实现啦 ~

食物模块

//食物的自调用函数
 (function(){

 //创建一个数组 来存放元素
 var elements=[];

 //食物就是一个对象 有宽 有高 有颜色 有横纵坐标 先有构造函数 然后创建对象
 function Food(width,height,color,x,y){
 //元素的宽和高 默认20
 this.width=width||20;
 this.height=height||20;
 //元素的颜色 默认绿色
 this.color=color||"green";
 //元素的横纵坐标 默认为0 
 this.x=x||0;
 this.y=y||0;
 }
 
 //为元素添加初始化的方法 最好放原型里 公用 在页面上显示 所以需要map
 Food.prototype.init=function(map) {
 //先删除食物
 //外部无法访问的函数
 remove();
 // 创建元素
 var div=document.createElement("div");
 // 把元素追加到map中
 map.appendChild(div);
 // 设置元素的样式 宽 高 颜色 
 div.style.width=this.width+"px";
 div.style.height=this.height+"px";
 div.style.backgroundColor=this.color;
 //先脱离文档流
 div.style.position="absolute";
 //横纵坐标随机产生的
 this.x=parseInt(Math.random()*(map.offsetWidth/this.width))*this.width;
 this.y=parseInt(Math.random()*(map.offsetHeight/this.height))*this.height;
 //元素的横纵坐标
 div.style.left=this.x+"px";
 div.style.top=this.y+"px";

 //把div元素追加到elements数组中
 elements.push(div);
 }; 

 //私有的函数 删除食物的
 function remove(){
 //elements数组中有这个食物
 for(var i=0;i<elements.length;i++){
 var ele=elements[i];
 //找到这个食物的父级元素 从地图上删除食物
 ele.parentNode.removeChild(ele);
 //删除数组的div元素 在i处删除一项
 elements.splice(i,1);
 }
 }

 //把Food暴露给window
 window.Food=Food;
 }());

小蛇模块

//小蛇的自调用函数
 (function(){

 //定义一个数组 存放小蛇
 var elements=[];

 // 小蛇的构造函数
 function Snake(width,height,direction){
 //每个部分的宽和高
 this.width=width||20;
 this.height=height||20;
 //小蛇的身体部分
 this.body=[
 {x:3,y:2,color:"red"},//小蛇的头部
 {x:2,y:2,color:"orange"},//小蛇的身体
 {x:1,y:2,color:"orange"}//小蛇的身体
 ];
 //方向
 this.direction=direction||"right";
 }

 //通过原型添加方法,给小蛇添加初始化方法
 Snake.prototype.init=function(map){
 remove();
 //循环遍历
 for(var i=0;i<this.body.length;i++){
 //每一个数组元素都是一个对象
 var obj=this.body[i];
 //创建div 
 var div=document.createElement("div");
 //追加到map中
 map.appendChild(div);
 //设置div的样式
 div.style.position="absolute";
 div.style.width=this.width+"px";
 div.style.height=this.height+"px";
 //横纵坐标
 div.style.left=obj.x*this.width+"px";
 div.style.top=obj.y*this.height+"px";
 //背景颜色
 div.style.backgroundColor=obj.color;
 //方向暂定
 //把div追加到elements数组中 目的是为了删除
 elements.push(div);
 }
 };

 //通过原型添加move方法 
 Snake.prototype.move=function(food,map) {
 //小蛇的身体部分 把前一个的横纵坐标给下一个
 var i=this.body.length-1;
 //逆序循环
 for(;i>0;i--){
 this.body[i].x=this.body[i-1].x;
 this.body[i].y=this.body[i-1].y;
 }

 // 判断方向 改变小蛇的头部的坐标
 switch(this.direction){
 case "right":
 this.body[0].x+=1;
 break;
 case "left":
 this.body[0].x-=1;
 break;
 case "top":
 this.body[0].y-=1;
 break;
 case "bottom":
 this.body[0].y+=1;
 break;
 }

 //判断有没有吃到食物
 //小蛇的头的坐标和食物的坐标一致
 var headX=this.body[0].x*this.width;
 var headY=this.body[0].y*this.height;
 //判断小蛇的头部坐标和食物的坐标是否相同
 if(headX==food.x&&headY==food.y){
 //获取小蛇的最后的尾巴
 var last=this.body[this.body.length-1];
 //加入到数组中 以对象的方式加入
 this.body.push({
 x:last.x,
 y:last.y,
 color:last.color
 });
 //把食物删除 初始化食物
 food.init(map);
 }
 };

 //添加私有的删除函数
 function remove(){
 var i=elements.length-1;
 //逆序 找到这个元素的父元素 删除
 for(;i>=0;i--){
 var ele=elements[i];
 //从地图上删除元素
 ele.parentNode.removeChild(ele);
 //从数组中删除
 elements.splice(i,1);
 }
 }

 //把Snake暴露给window
 window.Snake=Snake;
 }());

游戏模块

//游戏的自调用函数
 (function(){

 var that=null;
 //游戏的构造函数
 function Game(map){
 this.food=new Food();//食物对象
 this.snake=new Snake();//小蛇对象
 this.map=map;//地图
 that=this;//保留当前的实例对象到that变量中 此时that 就是this
 }

 //游戏初始化
 Game.prototype.init=function(){
 //食物初始化
 this.food.init(this.map);
 //小蛇初始化
 this.snake.init(this.map);//先让小蛇显示
 //调用设置小蛇移动的方法
 this.runSnake(this.food,this.map);
 //调用按键的方法
 this.bindKey();
 };

 //添加原型函数 设置小蛇可以自由移动
 Game.prototype.runSnake=function(food,map){
 //此时的this是实例对象
 //setInterval 方法是通过window调用的 this指向改变了
 var timeId=setInterval(function(){
 this.snake.move(food,map);
 this.snake.init(map);
 //横坐标的最大值 map的属性在style标签中
 var maxX=map.offsetWidth/this.snake.width;
 //纵坐标的最大值
 var maxY=map.offsetHeight/this.snake.height;
 var headX=this.snake.body[0].x;
 var headY=this.snake.body[0].y;
 // 横坐标方向的检测
 if(headX<0||headX>=maxX){
 //撞墙了 停止定时器
 clearInterval(timeId);
 alert("游戏结束");
 }
 //纵坐标方向的检测
 if(headY<0||headY>=maxY){
 //撞墙了 停止定时器
 clearInterval(timeId);
 alert("游戏结束");
 }
 }.bind(that),200);//绑定到that中 即实例对象
 };

 //获取用户的按键 改变小蛇的方向
 Game.prototype.bindKey=function(){
 //这里的this 应该是触发keydown事件的对象 --document
 //所以这里的this就是document
 //获取用户的按键
 document.addEventListener("keydown",function(e){
 switch(e.keyCode){
 case 37: 
 this.snake.direction="left";
 break;
 case 38: 
 this.snake.direction="top";
 break;
 case 39: 
 this.snake.direction="right";
 break;
 case 40: 
 this.snake.direction="bottom";
 break;
 }
 }.bind(that),false);//绑定实例对象
 };

 //暴露给window
 window.Game=Game;
 }());

主页面

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>贪吃蛇</title>
 <style>
 .map {
 width: 1800px;
 height: 800px;
 background-color: gray;
 position: relative;
 margin: 0 auto;
 }
 </style>
</head>
<body>
 <!-- 画出地图 设置样式 -->
 <div class="map"></div>
 <script src="../js/food.js"></script>
 <script src="../js/snake.js"></script>
 <script src="../js/game.js"></script>
 <script>

 //初始化游戏对象
 var game=new Game(document.querySelector(".map"));
 //初始化游戏
 game.init();
 </script>
</body>
</html>

小编还为大家准备了精彩的专题:javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
jquery 问答知识整理
Feb 11 Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 Javascript
JQuery EasyUI的使用
Feb 24 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
详解Vue2.0里过滤器容易踩到的坑
Jun 01 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
Jan 25 Javascript
解决vue打包之后静态资源图片失效的问题
Feb 21 Javascript
JavaScript对象原型链原理解析
Jan 22 Javascript
js实现轮播图效果 纯js实现图片自动切换
Aug 09 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 #Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 #Javascript
JavaScript中this函数使用实例解析
Feb 21 #Javascript
如何通过JS实现转码与解码
Feb 21 #Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 #Javascript
微信小程序使用 vant Dialog组件的正确方式
Feb 21 #Javascript
JS实现判断移动端PC端功能
Feb 21 #Javascript
You might like
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
php事务处理实例详解
2014/07/11 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python黑魔法之参数传递
2016/02/12 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
NumPy中的维度Axis详解
2019/11/26 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
车工岗位职责
2013/11/26 职场文书
预备党员党课思想汇报
2014/01/13 职场文书
九年级数学教学反思
2014/02/02 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python