码迷,mamicode.com
首页 > 编程语言 > 详细

javascript -- (贪吃蛇游戏)

时间:2016-08-24 13:08:22      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

界面设置

/***body**/

<body>

  <h1>贪吃蛇游戏</h1>

  /***score记录成绩**/

  <p id="score">0</p>

  /***地图**/

  <div id="snake_map">

    /***地图的绘制通过js实现**/

  </div>

  /***三个按钮**/

  <div class = "box">

    <button type="button" name="button" id="reset">重新开始</button>

    <button type="button" name="button" id="createSpeed">升速</button>

    <button type="button" name="button" id="stop">暂停</button>

  </div>

</body>

/***body部分结束**/

/***style**/

<style>

  * {

    margin: 0;

    padding: 0;

  }

  h1 {

    text-align: center;

  }

  #score {

    text-align: center;

    font-size: 2em;

  }

  #snake_map {

    /***宽和高通过js实现**/

    margin: 0 auto;

    border: 1px solid rgb(196, 231, 232);

    background: rgb(31, 169, 156);

  }

  /***路径地图的行样式**/

  .row {

    height: 20px;

  }

  .cell {

    height: 20px;

    width: 20px;

    box-sizing: border-box;

    border: 1px solid lightgray;

    float:left;

  }

  /***蛇身的样式**/

  activeSnake {

    /***蛇身和随机出现的小方块通过js实现**/

    background: rgb(10, 75, 70);

  }

  .mask {

    background: rgb(106, 249, 184);

  }

  .box {

    width: 300px;

    margin: auto;

    margin-top: 15px;

  }

  .box button {

    border: 1px solid blue;

    width: 80px;

    height: 30px;

    background: rgb(31, 169, 156);

  }

</style>

/***style部分结束**/

/***javascript**/

<script type="text/javascript" >   //或者外部导入

  /***获取标签元素**/

  var score = document.getElementById(‘score‘);

  var map = document.getElementById(‘snake_map‘);

  /***为了动态改变地图的大小,以下设置两个变量,用于存储行数和列数(即方格的个数)**/

  var rowNumber = 30;//行数

  var cellNumber = 20;//列数

  /***设置地图的宽和高**/

  var mapWidth = cellNumber * 20;

  var mapHeight = rowNumber * 20;

  map.style.width = mapWidth + ‘px‘;

  map.style.height = mapHeight + ‘px‘;

  /***speed为定时器中的时间参数**/

  var speed = 300;

  /***创建一个二维数组,用来记录地图上的所有div的位置**/

  var snakeDivPosition = [];

  /***通过双层for循环来创建地图元素**/

  for(var i = 0; i < rowNumber; i++) {

    /***创建行div**/

    var rowDiv = document.createElement(‘div‘);

    /***css样式设置**/

    rowDiv.className = ‘row‘;

    /***将行div添加到路径地图中**/

    map.appendChild(rowDiv);

    /***创建一个行级数组,用来存储当前行中的每个div方块**/

    var rowArray = [];

    for(var j = 0; j < cellNumber; j++) {

      /***创建每一行中的列元素**/

      var cellDiv = document.createElement(‘div‘);

      /***css样式设置**/

      cellDiv.className = ‘cell‘;

      /***将列元素添加到当前行中**/

      rowDiv.appendChild(cellDiv);

      /***同时将方块添加到行数组中**/

      rowArray.push(cellDiv);

    }

    /***当前内层循环结束,将行数组添加到二维数组中**/

    snakeDivPosition.push(rowArray);

  }

  /***创建蛇身模型**/

  /***创建一个一维数组,用来存储蛇身的长度**/

  var snake = [];

  /***固定蛇身的起始长度**/

  for(var i = 0; i < 3; i++) {

    /***为蛇身设置颜色样式**/

    snakeDivPosition[0][i].className = ‘cell activeSnake‘;

    /***存储在蛇身数组中**/

    snake[i] = snakeDivPosition[0][i];

  }

  /***定义变量来控制蛇身**/

  /***蛇头的起始位置偏移量**/

  var x = 2;

  var y = 0;

  /***分数计时器**/

  var scoreCount = ‘0‘

  /***记录随机出现的小方块所在的位置**/

  var maskX = 0;

  var maskY = 0;

  /***记录蛇身移动的方向,初始为向右**/

  var direction = ‘right‘;

  /***用来判断是否需要改变蛇的移动方向**/

  var changeDir = true;

  /***延迟定时器**/

  var delayTimer = null;

  /***添加键盘事件监听方向键来改变蛇的移动方向**/

  document.onkeydown = function(event){

    /***判断是否需要改变方向true(需要)false(不需要)**/

    if(!changeDir) {

      return;//return空表示直接结束函数,后续代码不执行

    }

    /***获取事件**/

    event = event||window.event;

    /***为了合理处理蛇的移动,需要判断蛇头和蛇身*

    *假设蛇向右移动,则左键、右键无效*/

    if(direction == ‘right‘ && event.keyCode == 37) {

      return;

    }

    if(direction == ‘left‘ && event.keyCode == 39) {

      return;

    }

    if(direction == ‘up‘ && event.keyCode == 40) {

      return;

    }

    if(direction == ‘down‘ && event.keyCode == 38) {

      return;

    }

    /***通过keyCode确定蛇的移动方向**/

    switch(event.keyCode) {

      case 37:

        direction = ‘left‘;

        break;

      case 38:

        direction = ‘up‘;

        break;

      case 39:

        direction = ‘right‘;

        break;

      case 40:

        direction = ‘down‘;

        break;

    }

    changeDir = false;

    delayTimer = setTimeout(function() {

      /***设置是否需要改变方向**/

      changeDir = true;

    },speed);

  }

  /***moveTimer获取定时器**/

  var moveTimer;

  /***游戏开始运行**/

  function change() {

    moveTimer = setInterval(function() {

      /***关闭延迟定时器*

      *根据direction设置的方向来设置蛇头的位置**/

      switch(direction) {

        case ‘left‘:

          x--;

          break;

        case ‘right‘:

          x++;

          break;

        case ‘up‘:

          y--;

          break;

        case ‘down‘:

          y++;

          break;

      }

      /***判断是否游戏结束**/

      if(x < 0|| x >= cellNumber || y < 0|| y >= rowNumber) {

        alert(‘game over‘);

        /***结束蛇移动的定时器**/

        clearInterval(moveTimer);

        return;/***终止键盘事件**/

      }  

      /***判断是否触碰到自身**/

      for(var i = 0; i < snake.length; i++) {

        /***将此时蛇头移动的位置与之前所有的组成蛇的div的位置进行比较,如果相同,游戏结束**/

        if(snake[i] == snakeDivPosition[y][x]) {

          alert(‘game over‘);

          clearInterval(moveTimer);

          return;

        }

      }

      /***判断蛇头移动的位置是否有mask**/

      if(maskX == x && maskY == y) {

        snakeDivPosition[maskY][maskX].className = ‘cell activeSnake‘;

        /***蛇头添加div**/

        snake.push(snakeDivPosition[maskY][maskX]);

        /***记录分数**/

        scoreCount++;

        /***更新当前分数**/

        score.innerHtML = scoreCount;

        /***随机生成新的mask**/

        createMask();

      } else {

        /***让蛇移动,蛇尾去掉自身的颜色,变成格子的颜色**/

        snake[0].className = ‘cell‘;

        /***将蛇尾div从数组中移出**/

        snake.shift();

        /***定位到的新的蛇头加入到蛇数组中**/

        snakeDivPosition[y][x].className = ‘cell activeSnake‘;

        snake.push(snakeDivPosition[y][x]);

      }

    },speed);

  }

  /***定义随机函数**/

  function random(min,max) {

    return Math.floor(Math.random()*(max-min+1) + min);

  }

  function createMask() {

    /***随机产生新的mask的x值和y值**/

    maskX = random(0,cellNumber - 1);

    maskY = random(0,rowNumber - 1);

    /***如果随机产生的mask的坐标在蛇身上**/

    if(snakeDivPosition[maskY][maskX].className == ‘cell activeSnake‘) {

      /***重新生成**/

      createMask();

    } else {

      snakeDivPosition[maskY][maskX].className = ‘cell mask‘;

    }

  }

  change();

  createMask();

</script>

javascript -- (贪吃蛇游戏)

标签:

原文地址:http://www.cnblogs.com/zhao12354/p/5802338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!