欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript实现贪吃蛇

程序员文章站 2024-03-23 09:58:04
...

javascript实现贪吃蛇

逆战班小总结

分析

蛇:每隔一段时间就移动一点距离,其实就是每隔一会就重新加载显示蛇的身体
蛇的组成:有多个小div,组成每一节的身体
蛇的移动:从蛇头开始,每隔小div 的坐标,给下一节身体的坐标
方向的控制:右,蛇头的x坐标+1,左,蛇头的x坐标-1,下,蛇头的y坐标+1,上,蛇头的y坐标-1,其他身体部分,都是依次将自己的坐标给下一节身体
键盘事件:用来控制上下左右
食物:显示,被吃,消失,再显示
地图:显示蛇、显示食物,有一定的区域

分3个对象,蛇、地图、食物
蛇:身体组成部分、显示身体的方法、吃食物、碰撞身体 - 死亡
地图:创建地图
食物:组成部分、消失、显示

html结构

<button id="btn">开始</button>
<span>分数:<b>0</b></span>

js代码

 // 贪吃蛇游戏
 // 设置样式的函数
 function setStyle(ele,Obj){
  for(var attr in Obj){
   ele.style[attr] = Obj[attr];
  }
 }
 // 获取随机数
 function getRandom(a,b){
  var max = Math.max(a,b);
  var min = Math.min(a,b);
  return parseInt(Math.random()*(max-min))+min;
 }
 // 获取随机颜色
 function getColor(){
  return `rgb(${getRandom(0,256)},${getRandom(0,256)},${getRandom(0,256)})`;
 }
 // 地图
 function Map(){
  this.map = document.createElement("div");
  setStyle(this.map,{
   width:"800px",
   height:"400px",
   border:"10px solid #ccc",
   backgroundColor:"#abcdef",
   position:"relative"
  });
  document.body.appendChild(this.map);
 }
 var map = new Map();
 // 食物
 function Food(){
  this.food = document.createElement("div");
  // 获取随机的left和top
  var l = map.map.clientWidth - 10;
  var t = map.map.clientHeight - 10;
  setStyle(this.food,{
   width:"10px",
   height:"10px",
   backgroundColor:getColor(),
   position:"absolute",
   left:parseInt(getRandom(0,l-10)/10)*10 + "px",
   top:parseInt(getRandom(0,t-10)/10)*10 + "px",
   border:"1px solid #000"
  });   
  // 将食物放到地图中
  map.map.appendChild(this.food);
 }   
 var food = new Food();
 // 蛇
 function Snake(){
  // 身体组成部分
  this.body = [
   {
    x:20,
    y:0
   },
   {
    x:10,
    y:0
   },
   {
    x:0,
    y:0
   }
  ];
  this.score = 0;
  this.direction = "down";
  this.timer = null;
  this.flag = true;
  var _this = this;
  // 应该监听一下键盘事件,敲击键盘能改变方向
  document.onkeypress=function(e){
   var e = e || window.event;
   var keycode = e.keyCode || e.which;
   switch(keycode){
    case 119: // "w键"
     _this.direction = "up";
    break;
    case 115: // "s键"
     _this.direction = "down";
    break;
    case 97: // "a键"
     _this.direction = "left";
    break;
    case 100: // "d键"
     _this.direction = "right";
    break;
   }
  }
  // 让蛇显示
  this.show();
 }
 // 让蛇显示
 Snake.prototype.show = function(){
  // 获取地图中原来的蛇的身体的div
  var snakes = document.querySelectorAll(".snake");
  if(snakes.length!=0){
   for(var i=snakes.length-1;i>=0;i--){
    map.map.removeChild(snakes[i]);
   }
  }
  // 通过遍历身体,创建身体
  for(var i=0;i<this.body.length;i++){
   var div = document.createElement("div");
   setStyle(div,{
    width:"10px",
    height:"10px",
    background:"#000",
    position:"absolute",
    left:this.body[i].x + "px",
    top:this.body[i].y + "px"
   });
   div.className = "snake";
   if(i==0){
    setStyle(div,{
     background:"#f00",
     borderRadius:"50%"
    });
   }
   map.map.appendChild(div);
  }
 }
 // 让蛇移动
 Snake.prototype.move = function(){
  // 根据方向移动
  // 每节身体的坐标的替换
  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.direction){
   case "right":
    this.body[0].x = this.body[1].x + 10;
   break;
   case "left":
    this.body[0].x = this.body[1].x - 10;
   break;
   case "up":
    this.body[0].y = this.body[1].y - 10;   
   break;
   case "down":
    this.body[0].y = this.body[1].y + 10;   
   break;   
  }
  // 将移动后的身体坐标展示出来
  if(this.flag){
   this.show();
   this.die();
   this.eat();
  }
 }
 // 吃到食物
 Snake.prototype.eat = function(){
     if(this.body[0].x == food.food.offsetLeft && this.body[0].y == food.food.offsetTop){
         // 吃到了 - 让食物消失、创建新的食物
         map.map.removeChild(food.food);
         food = new Food();
         // 让蛇的身体加加一节
         this.body.push({
             x:this.body[this.body.length-1].x,
             y:this.body[this.body.length-1].y,
         });
         this.score++;
         document.querySelector("span b").innerText = this.score;
     }
 }
 // 死亡
 Snake.prototype.die = function(){
     // 撞墙
     if(this.body[0].x<0 || this.body[0].y<0 || this.body[0].x>map.map.clientWidth || this.body[0].y>map.map.clientHeight){
         alert("死亡");
         this.flag = false;
         clearInterval(this.timer);
     }
     // 撞身体 - 判断蛇头是否和其他身体的坐标一样
     for(var i=1;i<this.body.length;i++){
         if(this.body[i].x == this.body[0].x && this.body[i].y==this.body[0].y){
             alert("死亡");
             this.flag = false;
             clearInterval(this.timer);
         }
     }
 }
 var snake = new Snake();
 document.querySelector("#btn").onclick = function(){
  snake.timer = setInterval(function(){
   snake.move();
  },200);
 }

效果图

javascript实现贪吃蛇
javascript实现贪吃蛇

相关标签: 笔记 javascript