贪吃蛇面向对象完整版

<!DOCTYPE html>
  <html>
    <head>
      <meta charset="UTF-8">
      <title></title>
    </head>
    <body>
    </body>
  </html>
  <script>
    var t=null;

    //地图系统
    function Map(){
      this.width="800px";
      this.height="600px";
      this.background="#ccc";
      this.position="relative";
      this._map=null;
    }
    Map.prototype.init=function(){
      this._map=document.createElement("div");
      document.body.appendChild(this._map);
      this._map.style.width=this.width;
      this._map.style.height=this.height;
      this._map.style.background=this.background;
      this._map.style.position=this.position;

    }
    var map=new Map;
    map.init()

    //食物系统
    function Food(){
      this.width="20px";
      this.height="20px";
      this.background="green";
      this._food=null;
      this.position="absolute"
    }
    Food.prototype.init=function(){
      this._food=document.createElement("div");
      map._map.appendChild(this._food);
      this._food.style.width=this.width;
      this._food.style.height=this.height;
      this._food.style.background=this.background;
      this._food.style.position=this.position;
      this.x=Math.floor(Math.random()*40);
      this.y=Math.floor(Math.random()*30);
      this._food.style.left=this.x*20+"px";
      this._food.style.top=this.y*20+"px";
    }
    var food=new Food;
    food.init()

    制造小蛇;
    function Snake(){
      this.width="20px";
      this.height="20px";
      this.position="absolute"
      this.body=[
        {x:1,y:2,color:"red",son:null},
        {x:2,y:2,color:"red",son:null},
        {x:3,y:2,color:"blue",son:null}
      ]
      this.fangxiang="right";
      this.setsnake=function(code){
        switch(code){
          case 37:
          if(this.fangxiang==="right"){
          return;
          }

          this.fangxiang="left";

          break;
          case 38:
          if(this.fangxiang==="down"){
          return;
          }


          this.fangxiang="up";

          break;
          case 39:
          if(this.fangxiang==="left"){
          return;
          }


          this.fangxiang="right";

          break;
          case 40:
          if(this.fangxiang==="up"){
          return;
          }


        this.fangxiang="down";

        break;
        }
      }
    }
    Snake.prototype.init=function(){
      for(var i=0;i<this.body.length;i++){
        if(this.body[i].son==null){
          this.body[i].son=document.createElement("div");
          map._map.appendChild(this.body[i].son)
          this.body[i].son.style.width=this.width;
          this.body[i].son.style.height=this.height;
          this.body[i].son.style.position=this.position;
          this.body[i].son.style.background=this.body[i].color
        }
      this.body[i].son.style.left=this.body[i].x*20+"px"
      this.body[i].son.style.top=this.body[i].y*20+"px"

      }

    }
    Snake.prototype.move=function(){

      var length=this.body.length-1;
      for(var i=0;i<length;i++){
        this.body[i].x=this.body[i+1].x;
        this.body[i].y=this.body[i+1].y;
      }

    switch(this.fangxiang){
    case "right":
      this.body[length].x=this.body[length].x+1;
    break;
    case "left":
      this.body[length].x=this.body[length].x-1;
    break;
    case "up":
      this.body[length].y=this.body[length].y-1;
    break;
    case "down":
      this.body[length].y=this.body[length].y+1;
    }
    this.init()

    //实现小蛇的一些功能
    if(this.body[length].x<0||this.body[length].x>39||this.body[length].y<0||this.body[length].y>29){

      clearInterval(t)
      alert("瞎子吗?越界了")
      for(var j=0;j<this.body.length;j++){
        if(this.body[j].son!=null){
        map._map.removeChild(this.body[j].son)
        }
      }
    }
    if(this.body[length].x==food.x&&this.body[length].y==food.y){
      map._map.removeChild(food._food);
      food.init()
      this.body.unshift({x:null,y:null,color:"red",son:null});
    }
    //由于出现了bug,现阶段没办法解决,所以舍弃贪吃蛇自己吃自己的功能
    // for(var u=0;u<this.body.length;u++){
      // if(this.body[u]==this.body[length]){
      // return false;
      // }
    // else if(this.body[length].x==this.body[u].x&&this.body[length].y==this.body[u].y){
      // clearInterval(t)
      // alert("你是猪吗")
      // }
    // }
    }
    var snake=new Snake;
    snake.init()
    t=setInterval(function(){
    snake.move()
    },100)
    document.onkeydown=function(ev){
      var ev=ev||window.event;
      setTimeout(function(){
        snake.setsnake(ev.keyCode)
      },100)
    }


  </script>

转载于:https://www.cnblogs.com/shangjun6/p/10375172.html

利用面向对象的方法,实现贪吃蛇。 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、付费专栏及课程。

余额充值