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 FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
jQuery-serialize()输出序列化form表单值的方法
Dec 26 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
Dec 24 Javascript
js实现文字滚动效果
Mar 03 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
基于BootstrapValidator的Form表单验证(24)
Dec 12 Javascript
js定时器实例分享
Dec 20 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
Angular2实现组件交互的方法分析
Dec 19 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python多线程thread及模块使用实例
2020/04/28 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
个人剖析材料范文
2014/09/30 职场文书
病危通知单
2015/04/17 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
七年级话题作文之执着
2019/11/19 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书