JavaScript实现简单贪吃蛇效果


Posted in Javascript onMarch 09, 2020

本文实例为大家分享了js实现简单贪吃蛇效果的具体代码,供大家参考,具体内容如下

上代码之前,先给大家看一下效果:

JavaScript实现简单贪吃蛇效果

是不是想说:我能这样玩一天…

话不多说,代码如下:

<script>
 class Map{
 constructor(){
  // 提前设定将来的地图的样式数据
  this.w = 450;
  this.h = 250;
  this.c = "#DDD";
  // 执行创建地图方法
  this.createEle();
 }
 createEle(){
  this.mapEle = document.createElement("div");
  this.mapEle.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.c};margin:100px auto;position:relative;border:solid 10px #AAA;`;
  document.body.appendChild(this.mapEle);
 }
 }
 class Food{
 constructor(){
  // 提前设定将来的食物的样式数据
  this.w = 10;
  this.h = 10;
  this.c = "red";
  this.x = 0;
  this.y = 0;
  // 执行创建食物方法
  this.createEle();
 }
 createEle(){
  this.foodEle = document.createElement("div");
  this.foodEle.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.c};position:absolute;left:${this.x * this.w}px;top:${this.y * this.h}px;border-radius:10px`;
  m.mapEle.appendChild(this.foodEle);
 }
 randomPos(){
  // 随机位置,随机产生的是格子的位置,不是真正的像素
  this.x = random(0,(m.w-this.w) / this.w);
  this.y = random(0,(m.h-this.h) / this.h);
  // 设置位置时,要换算成像素,然后再生效
  this.foodEle.style.left = this.x * this.w + "px";
  this.foodEle.style.top = this.y * this.h + "px";
 }
 }
 class Snake{
 constructor(){
  // 提前设定将来的蛇节的样式数据
  this.w = 10;
  this.h = 10;
  // 因为蛇由多个设计组成,每个蛇节都有自己的独立信息,所以数据结构设计成如下格式
  this.body = [{
  ele:null,
  x:4,
  y:3,
  c:randomColor()
  },{
  ele:null,
  x:3,
  y:3,
  c:randomColor()
  },{
  ele:null,
  x:2,
  y:3,
  c:randomColor()
  }];
  // 提前设置默认方向
  this.d = "right";

  // 开始创建蛇节元素,设置样式
  this.createEle();
 }
 createEle(){
  // 使用循环多次创建,因为有多个蛇节
  for(var i=0;i<this.body.length;i++){
  // 创建之前,需要判断元素是否已经存在,如果已经存在,不需要创建
  if(!this.body[i].ele){
   this.body[i].ele = document.createElement("div");
   m.mapEle.appendChild(this.body[i].ele);
  }
  this.body[i].ele.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.body[i].c};position:absolute;left:${this.body[i].x * this.w}px;top:${this.body[i].y * this.h}px;border-radius: 10px`;
  }

  // 延迟之后,开始移动
  setTimeout(()=>{
  this.move();
  },200);
 }
 move(){
  // 从最后一个元素向前找前一个元素的坐标,直到第一个
  for(var i=this.body.length-1; i>0; i--){
  this.body[i].x = this.body[i-1].x;
  this.body[i].y = this.body[i-1].y;
  }
  // 第一个元素根据默认方向,决定想哪走
  switch(this.d){
  case "left":
   this.body[0].x -= 1;
   break;
  case "right":
   this.body[0].x += 1;
   break;
  case "top":
   this.body[0].y -= 1;
   break;
  case "bottom":
   this.body[0].y += 1;
   break;
  } 
  // 移动过程中,判断是否撞到边界,任意一个边界都不行
  if(this.body[0].x < 0 || this.body[0].y < 0 || this.body[0].x > ((m.w-this.w) / this.w) || this.body[0].y > ((m.h-this.h) / this.h)){
  alert("撞墙了");
  return;
  }
  // 移动过程中,判断是否与食物的坐标重复,如果重复
  if(this.body[0].x === f.x && this.body[0].y === f.y){
  // 给蛇增加一个蛇节
  this.body.push({
   ele:null,
   x:this.body[this.body.length-1].x,
   y:this.body[this.body.length-1].y,
   c:randomColor()
  })
  // 刷新食物的坐标
  f.randomPos();
  }

  // 移动过程中,判断蛇头的坐标是否与某个任意一个蛇节的坐标重复
  for(var i=1;i<this.body.length;i++){
  if(this.body[0].x == this.body[i].x && this.body[0].y == this.body[i].y){
   // 如果重复,撞到自己,结束程序
   alert("撞到自己了");
   return;
  }
  }
  this.createEle();
 }
 direct(type){
  switch(type){
  case 37:
   if(this.d === "right") break;
   this.d = "left";
   break;
  case 38:
   if(this.d === "bottom") break;
   this.d = "top";
   break;
  case 39:
   if(this.d === "left") break;
   this.d = "right";
   break;
  case 40:
   if(this.d === "top") break;
   this.d = "bottom";
   break;
  }
 }
 }

 function random(a,b){
 return Math.round(Math.random()*(a-b)+b)
 }
 function randomColor(){
 return `rgb(${random(0,255)},${random(0,255)},${random(0,255)})`
 }

 var m = new Map();
 
 var f = new Food();
 f.randomPos();
 var s = new Snake();
 // 当按下键盘时,将按下的键盘的code值,传给蛇的专属处理方法
 document.onkeydown = function(eve){
 var e = eve || window.event;
 var code = e.keyCode || e.which;
 s.direct(code);
 }
</script>

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中的屏蔽的使用示例
Jul 30 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
May 29 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
Jun 08 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
Jun 02 Javascript
js实现简单的选项卡效果
Feb 23 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
详解搭建es6+devServer简单开发环境
Sep 25 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
jQuery实现查看图片功能
Dec 01 jQuery
如何理解Vue前后端数据交互与显示
May 10 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
原生js无缝轮播插件使用详解
Mar 09 #Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 #Javascript
JavaScript享元模式原理与用法实例详解
Mar 09 #Javascript
JavaScript装饰者模式原理与用法实例详解
Mar 09 #Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 #Javascript
JavaScript中的this基本问题实例小结
Mar 09 #Javascript
Nuxt页面级缓存的实现
Mar 09 #Javascript
You might like
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
python更改已存在excel文件的方法
2018/05/03 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
人力资源部门的主要职能
2014/02/22 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
离婚协议书范本2014
2014/10/27 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
入党转正介绍人意见
2015/06/03 职场文书
闪闪红星观后感
2015/06/08 职场文书
暑假打工感想
2015/08/07 职场文书