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 相关文章推荐
javascript 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
Oct 18 Javascript
jQuery 三击事件实现代码
Sep 11 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
javascript 解决浏览器不支持的问题
Sep 24 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
原生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实现的功能是显示8条基色色带
2006/10/09 PHP
mysql 字段类型说明
2007/04/27 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
Js sort排序使用方法
2011/10/17 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
python实现kNN算法
2017/12/20 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
自定义django admin model表单提交的例子
2019/08/23 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
jupyter 导入csv文件方式
2020/04/21 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
创建索引时需要注意的事项
2013/05/13 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
2014年教师工作总结
2014/11/10 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript