js实现经典贪吃蛇小游戏


Posted in Javascript onMarch 19, 2020

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

<script>
  
  class Map{
    constructor(){
      this.w = 800;
      this.h = 400;
      this.c = "#ccc";
      this.createEle();
    }
    createEle(){
      this.mapEle = document.createElement("div");
      this.mapEle.style.cssText = `width:${this.w}px;height:${this.h}px;background:${this.c};margin:0 auto;position:relative;border:solid 10px black;`;
      document.body.appendChild(this.mapEle);
    }
  }
  class Food{
    constructor(){
      this.w = 20;
      this.h = 20;
      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;`;
      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 = 20;
      this.h = 20;
      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;`;
      }
      this.body[0].ele.innerHTML = "0";
 
      setTimeout(()=>{
        this.move();
      },300);
    }
    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();
  document.onkeydown = function(eve){
    var e = eve || window.event;
    var code = e.keyCode || e.which;
    s.direct(code);
  }
 
</script>

js实现经典贪吃蛇小游戏

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

Javascript 相关文章推荐
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
Javascript拓展String方法小结
Jul 08 Javascript
使用jquery.upload.js实现异步上传示例代码
Jul 29 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
对jQuary选择器的全面总结
Jun 20 Javascript
使用node.js搭建服务器
May 20 Javascript
vuejs事件中心管理组件间的通信详解
Aug 09 Javascript
vue2 全局变量的设置方法
Mar 09 Javascript
从零开始实现Vue简单的Toast插件
Dec 03 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 Javascript
javascrpt密码强度校验函数详解
Mar 18 #Javascript
Node.js Domain 模块实例详解
Mar 18 #Javascript
js判断密码强度的方法
Mar 18 #Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 #Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 #Javascript
JavaScript正则表达式验证登录实例
Mar 18 #Javascript
JS正则表达式验证密码强度
Mar 18 #Javascript
You might like
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
php构造函数的继承方法
2015/02/09 PHP
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
node.js超时timeout详解
2014/11/26 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
python 性能提升的几种方法
2016/07/15 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
为什么python比较流行
2020/06/19 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
SQL语言面试题
2013/08/27 面试题
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
土木工程专业个人求职信
2013/12/05 职场文书
大学毕业感言
2014/01/10 职场文书
自我鉴定注意事项
2014/01/19 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
公司出差管理制度范本
2015/08/05 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS