手写简单的贪吃蛇

发布: 2016-07-04 23:11:00标签: js基础

手写简单的贪吃蛇

<!DOCTYPE html>
<html>
<head lang='en'>
  <meta charset='UTF-8'>
  <meta name='viewport'
        content='width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'>
  <meta http-equiv='X-UA-Compatible' content='ie=edge'>
  <title></title>
  <style>
    *{margin:0;padding:0}
    li{list-style:none}
    body,html{height:90%;width:100%;background:#eee;}
    #end{position:absolute;width:100%;height:100%;background:#f00;text-align:center;line-height:400px;font-size:80px;opacity:0.5;filter:alpha(opacity = 50);top:-1000px;transition:all 1s;color:#000;}
    #container{width:80%;max-width:800px;height:70%;margin:70px auto;background:#fff;position:relative;border-radius:10px;box-shadow:3px 3px 3px 0 #069;overflow:hidden;}
    li,#head{height:30px;width:30px;position:absolute;top:0;}
    li{background:#000;left:-30px;}
    #head{border-radius:10px;background:#f00;left:-30px;}
    #box{width:40%;margin:0 auto;}
    button{display:block;margin:5px 30px;float:right;padding:5px 10px}
    #box div{line-height:30px;font-size:16px;float:left;}
    #box span{display:block;width:400px;color:#f00;font-size:20px;}
    #playGame{background:#069;color:#fff;}
  </style>
</head>
<body>
<div id='container'>
  <span id='end'>Game Over</span>
  <ul id='snake'>
    <li class='food'></li>
    <li class='food'></li>
    <li class='food'></li>
  </ul>
  <div id='head'></div>
</div>
<div id='box'>
  <button id='playGame'>开始游戏</button>
  <div>
    <span id='show'></span>
  </div>
</div>

<script>
  //获取标签
  var _con = document.getElementById('container');
  var _head = document.getElementById('head');
  var _lis = document.getElementsByClassName('food');
  var show = document.getElementById('show');
  var snake = document.getElementById('snake');
  var _end = document.getElementById('end');
  var _palyGame = document.getElementById('playGame');
  var sore = 0;
  flag = true;
  //出现食物
  var _li = document.createElement('li');
  snake.appendChild(_li);
  //调用函数开始游戏
  playGame.onclick = function(){
    if(flag == false){return}
    //重置样式
    _palyGame.style.background = '#ccc';
    _end.style.top = -_end.offsetHeight + 'px';
    _head.style.top = 0;
    _head.style.left = 0;
    for(var k = _lis.length - 1;k >= 0;k--){
      _lis[k].style.top = 0;
      _lis[k].style.left = -_lis[0].offsetWidth + 'px';
      if(_lis.length >3){
        snake.removeChild(snake.lastChild)
      }
    }
    flag = false;
    startGame();
  };
  //游戏函数
  function startGame(){
    var foodpos = foodShow();
    _li.style.left = foodpos.x + 'px';
    _li.style.top = foodpos.y + 'px';
    var _speedx = _head.offsetWidth;
    var _speedy = 0;
    var timer = setInterval(function(){
      //蛇身跟随
      for(var i = _lis.length - 1;i > 0;i--){
        _lis[i].style.left = _lis[i - 1].style.left;
        _lis[i].style.top = _lis[i - 1].style.top;
      }
      _lis[0].style.left = _head.style.left;
      _lis[0].style.top = _head.style.top;
      //蛇头运动
      _head.style.left = _head.offsetLeft + _speedx + 'px';
      _head.style.top = _head.offsetTop + _speedy + 'px';
      document.onkeyup = function(e){
        e = e || window.event;
        if(e.keyCode == 37){
          _speedx = -_head.offsetWidth;
          _speedy = 0;
        }
        if(e.keyCode == 38){
          _speedx = 0;
          _speedy = -_head.offsetHeight;
        }
        if(e.keyCode == 39){
          _speedx = _head.offsetWidth;
          _speedy = 0;
        }
        if(e.keyCode == 40){
          _speedx = 0;
          _speedy = _head.offsetHeight;
        }
      };
      //判断边界
      //四周墙壁
      if(_head.offsetLeft < 0 || _head.offsetLeft + _head.offsetWidth > _con.offsetWidth || _head.offsetTop
        < 0 || _head.offsetTop + _head.offsetHeight > _con.offsetHeight){
        clearInterval(timer);
        show.textContent = '碰壁结束游戏!你的成绩:' + sore;
        _end.style.top = 0;
        _palyGame.style.background = '#069';
        flag = true;
      }
      //自身
      for(var i = _lis.length-1;i >= 0;i--){
        if(_lis[i].offsetLeft == _head.offsetLeft && _lis[i].offsetTop == _head.offsetTop){
          clearInterval(timer);
          show.textContent = '小蛇咬到了自己结束游戏!你的成绩:' + sore;
          _end.style.top = 0;
          _palyGame.style.background = '#069';
          flag = true;
        }
      }
      //蛇吃食物
      if(_li.offsetLeft == _head.offsetLeft && _li.offsetTop == _head.offsetTop){
        //增加一个class名字为food的li
        var _addli = document.createElement('li');
        snake.appendChild(_addli);
        _addli.className = 'food';
        //重新刷新位置
        foodpos = foodShow();
        _li.style.left = foodpos.x + 'px';
        _li.style.top = foodpos.y + 'px';
        //判断重新刷新
        shuaxin();
        function shuaxin(){
          for(var j = _lis.length-1;j >= 0;j--){
            if(_lis[j].offsetLeft == _li.offsetLeft && _lis[j].offsetTop == _li.offsetTop){
              console.log(_li.offsetLeft + '---')
              foodpos = foodShow();
              _li.style.left = foodpos.x + 'px';
              _li.style.top = foodpos.y + 'px';
              console.log(_li.style.left)
              shuaxin()
            }
          }
        }
        sore++;
        show.textContent = '你的成绩:' + sore;
        //蛇身随机颜色
        for(var i = _lis.length - 1;i > 0;i--){
          var n1 = parseInt(Math.random() * 255);
          var n2 = parseInt(Math.random() * 255);
          var n3 = parseInt(Math.random() * 255);
          var n4 = 1 - (Math.random() / 2);
          _lis[i].style.background = 'rgba(' + n1 + ',' + n2 + ',' + n3 + ',' + n4 +')';
        }
      }
    },500);
  };
  //随机出现食物的位置
  function foodShow(){
    var _col = Math.floor(_con.offsetWidth / _head.offsetWidth);
    var _row = Math.floor(_con.offsetHeight / _head.offsetWidth);
    var _x = parseInt(Math.random() * _col) * _head.offsetWidth;
    var _y = parseInt(Math.random() * _row) * _head.offsetHeight;
    return{x:_x,y:_y};
  }
</script>
</body>
</html>