用面向对象写的贪吃蛇

下面展示一些 内联代码片

1.第一种方法是用循环进行的蛇的移动
2.第二种是掐头去尾的方式进行移动的错节,用的是链表的方式实现

// html
<div id="a"></div>
css
 * {
   margin: 0;
   padding: 0;
   box-sizing: border-box;
  }
  #a {
   border: 1px solid red;
   width: 400px;
   height: 400px;
  }
  div {
   border: 1px solid black;
  }
// An highlighted block
 var width = 20,
   height = 20,
   arr = [],
   time = null
  //构造蛇初始化属性
  function sinit(x, y, color) {
   this.x = x
   this.y = y
   this.color = color
   this.next = null;
   this.last = null;
   this.head = null;
   this.wei = null;
   this.xx = null
   this.yy = null
   this.fodd = null
   this.fangxiang = {
    left: {
     x: -1,
     y: 0
    },
    right: {
     x: +1,
     y: 0
    },
    top: {
     x: 0,
     y: -1
    },
    bottom: {
     x: 0,
     y: +1
    }
   }
  }
  sinit.prototype.gouzao = function() {
   this.div = document.createElement("div");
   this.div.style.width = width + 'px';
   this.div.style.height = height + 'px';
   this.div.style.backgroundColor = this.color;
   this.div.style.position = "absolute"
   this.left = this.x * width;
   this.top = this.y * height;
   this.div.style.left = this.left + 'px'
   this.div.style.top = this.top + 'px'
   this.main = document.querySelector("#a")
   this.main.appendChild(this.div)
  }
  sinit.prototype.deletes = function() {
   this.main.removeChild(this.div)
  }
  //初始化
  sinit.prototype.init = function() {
   var a = new sinit(2, 0, 'red')
   this.head = a
   a.gouzao()
   arr.push([2, 0]);
   var b = new sinit(1, 0, 'green')
   b.gouzao()
   arr.push([1, 0]);
   var c = new sinit(0, 0, 'green')
   this.wei = c
   c.gouzao()
   arr.push([0, 0]);
   a.last = null
   a.next = b
   b.last = a
   b.next = c
   c.last = b
   c.next = null
   this.moren = this.fangxiang.right
  }
  var ff = false
  var bool = true
  sinit.prototype.zou = function() {
   this.arrs = [
    this.head.x + this.moren.x,
    this.head.y + this.moren.y
   ];
   console.log(this.arrs[1])
   //撞墙 
   if (this.arrs[0] >= 19 || this.arrs[1] >= 19 || this.arrs[0] <= 0 || this.arrs[1] < 0) {
    clearInterval(time)
   }
   //运动
   this.yunxing.yx.call(this);
   if (bool) {
    this.yunxing.each.call(this);
    bool = false
   }
   //吃长大
   if (this.arrs[0] == this.xx && this.arrs[1] == this.yy) {
    bool = true
    this.fodd.deletes()
    ff = true
   } else {
    ff = false
   }
  };
  sinit.prototype.yunxing = {
   yx: function() {
    var newbody = new sinit(this.head.x, this.head.y, 'red')
    newbody.next = this.head.next
    newbody.next.last = newbody
    newbody.last = null
    this.head.deletes();
    newbody.gouzao();
    var newhead = new sinit(this.head.x + this.moren.x, this.head.y + this.moren.y, 'green')
    this.head = newhead
    newhead.last = null
    newhead.next = newbody
    newbody.last = newhead
    newhead.gouzao();
    arr.unshift([this.head.x + this.moren.x, this.head.y + this.moren.y])
    if (!ff) {
     this.wei.deletes();
     this.wei = this.wei.last
     arr.pop()
    }
   },
   each: function() {
    this.xx = ((Math.ceil(Math.random() * 19)).toString());
    this.yy = ((Math.ceil(Math.random() * 19)).toString());
    var ss = new sinit(this.xx, this.yy, 'red');
    this.fodd=ss
    ss.gouzao();
   }
  }
  var ss = new sinit()
  ss.init();
  window.addEventListener("keyup", function(e) {
   console.log(e.keyCode)
   //下40,左37,上38,右39
   if (e.keyCode == 39 && ss.moren != ss.fangxiang.left) {
    ss.moren = ss.fangxiang.right
   } else if (e.keyCode == 40 && ss.moren != ss.fangxiang.top) {
    ss.moren = ss.fangxiang.bottom
   } else if (e.keyCode == 37 && ss.moren != ss.fangxiang.right) {
    ss.moren = ss.fangxiang.left
   } else if (e.keyCode == 38 && ss.moren != ss.fangxiang.bottom) {
    ss.moren = ss.fangxiang.top
   }
  })
  time = setInterval(function() {
   ss.zou()
  }, 150)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用面向对象的方,实现贪吃蛇。 1. 利用面向对象的思想实现——一个食物对象、一个蛇对象、一个游戏总控对象。 2. 在使用××.prototype= {}重原型对象的时候,一定要加上一句constructor:该对象。不然会造成实例化出来的实例的constructor为object。 3. 在underscore中,使用_.random(a,b)即可获得a-b中的一个随机数。 4. 在求食物的随机位置的时候,用到了panel.clientHeight/this.height - 1) * this.height。 原理是使用盒子的高度/小球的高度,可以算得最多放多少个小球。因为要控制小球不能超过边界,所以总数量要减去1,数量×高度即为随机位置的最大值。 5. 在蛇对象中,用body数组存放蛇身体每一个部分对象。蛇的绘制过程就是遍历body,在面板上绘制。 6. 蛇的移动分为两部分。 ① 蛇节移动到前一个蛇节的位置。直到蛇头后一个蛇节移动到蛇头的位置。 ② 根据direction判断蛇头如何移动。 注意:在游戏绘制的过程中,界面的每一次绘制都要**删除**之前的绘制,不然会叠加到一起。 7. 在蛇的闭包中建一个局部数组,存储蛇对象,可以更加方便的删除操作。 8. 只有在原型对象中的方和属性,外界是可以调用的。 9. 蛇的移动(动画)必然需要定时器协助。定时器的时间,即象征着刷新速度,也就是难度。 10. this所在的函数在哪一个对象中,this就指向谁。单独一个函数的时候,如果调用之前对象的this,需要备份指针(将对象的this赋值给另一个变量)。 11. JavaScript原生的键盘按下事件(keydown) 中,事件有一个keyCode属性,其值代表按下的键。其中:37—left、38—top、39—right、40—bottom。 12. 边界控制。通过判断蛇头与最大X和Y的关系,判断是否碰到边界。 13. confirm()方用于显示一个带有指定消息和确认及取消按钮的对话框。 14. window.location.reload(); 重新加载当前文档 15. window.close() 方用于关闭浏览器窗口。 16. 与食物的碰撞检测:如果蛇头和食物坐标重叠,将蛇尾添加到body中。并重新绘制一个食物点,将之前的食物删掉。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值