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 相关文章推荐
javascript去除空格方法小结
May 21 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
jQuery操作cookie
Aug 08 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
js replace()去除代码中空格的实例
Feb 14 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
AngularJS实现图片上传和预览功能的方法分析
Nov 08 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
May 07 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
Jun 08 Javascript
javascript实现移动端红包雨页面
Jun 23 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
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
四个PHP非常实用的功能
2015/09/29 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
php生成图片验证码的方法
2016/04/15 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
js a标签点击事件
2017/03/30 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
音乐器材管理制度
2014/01/31 职场文书
教师简历自我评价
2014/02/03 职场文书
培训通知
2015/04/17 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
经典爱情感言
2015/08/03 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
python实现三次密码验证的示例
2021/04/29 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS