【js小游戏&案例】js开发迷宫,人物移动、障碍感知处理,附带源码

效果图:

序幕:

迷宫渲染:定义一个二维数组、根据定义二维数组中的数字来标识不同的东西(障碍物、人物、终点、草地),然后两重循环将其渲染到页面

移动人物:给人物定义position: relative;,然后根据left,bottom来移动

完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>幼儿迷宫</title>
</head>
<style>
  table {
    border-collapse: collapse;
    padding: 0;
    background: url("./gass.jpg");
    width: 64%;
    height: 100%;
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
  }

  td {
    width: 80px;
    height: 80px;
  }

  tr {
    display: block;
    margin: -5px;
  }
</style>

<body onload="init()" onkeypress="keypress(event)">
  <table id="map">
  </table>
  <script>
    var empty = 0;   //空地或草坪
    var stone = 1;   //石头的标记是1
    var panda = 9;   //熊猫的标记是9
    var point = 6;   //终点
    var stepNumber = 0 //步数

    var mapData = [
      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
      [1, 0, 1, 0, 0, 0, 1, 0, 6, 1],
      [1, 0, 0, 0, 1, 0, 1, 0, 1, 1],
      [1, 1, 1, 1, 1, 0, 1, 0, 0, 1],
      [1, 1, 1, 0, 0, 0, 0, 1, 0, 1],
      [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
      [1, 0, 1, 1, 0, 0, 0, 0, 0, 1],
      [1, 0, 0, 1, 1, 1, 0, 1, 0, 1],
      [1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    ]
    var initPoint = [1, 1];   //初始化熊猫的位置

    var row = mapData.length;  //地图的行
    var column = mapData[0].length;  //地图的列

    function init() {
      //二维数组里,去初始化熊猫的位置
      mapData[initPoint[0]][initPoint[1]] = panda
      loadData(mapData);
    }

    /**
      *  渲染地图
      */
    function loadData(mapData) {
      // 获取地图对象
      var map = document.getElementById("map");

      //渲染一行八列的数据
      var mapHTML = "";
      for (var i = 0; i < row; i++) {
        mapHTML += "<tr>";
        for (var j = 0; j < column; j++) {
          if (mapData[i][j] == 0) {
            mapHTML += "<td></td>";
          } else if (mapData[i][j] == 1) {
            mapHTML += '<td><img src="./qualityControl.png" style="height: 80px; height: 80px; border-radius: 50%;" ></td>';
          } else if (mapData[i][j] == 9) {
            mapHTML += '<td><img src="./location.png" id="panda" style="height: 80px; height: 80px; border-radius: 50%;position: relative;" ></td>';
          }else if (mapData[i][j] == 6) {
            mapHTML += '<td><img src="./endPoint.png" id="panda" style="height: 80px; height: 80px; border-radius: 50%;position: relative;" ></td>';
          }
        }
        mapHTML += "</tr>";
      }
      map.innerHTML = mapHTML;
    }
    /**
       * 障碍检测(可加多个障碍条件)
       * @param yPoint
       * @param xPoint
       * @returns {boolean}
       */
    function checkStone(yPoint, xPoint) {
      return mapData[yPoint][xPoint] == stone;
    }
    // 移动方法
    function move(keynum, Value) {
      stepNumber++
      var pandaPos = document.getElementById("panda")
      if (119 == keynum) {
        const result = Value + 80;
        pandaPos.style.bottom = result + "px";
      } else if (100 == keynum) {
        const result = Value + 80;
        pandaPos.style.left = result + "px";
      } else if (115 == keynum) {
        const result = Value - 80;
        pandaPos.style.bottom = result + "px";
      } else if (97 == keynum) {
        const result = Value - 80;

        pandaPos.style.left = result + "px";
      }

    }
    /**
       * 监听wasd按键事件:w(上) s(下) a(左) d(右)
       * @param e
       */
    var keypress = function keypress(e) {
      var pandaPos = document.getElementById("panda")
      var keynum = window.event ? e.keyCode : e.which;
      if (119 == keynum) {
        var point = initPoint;
        if (point[0] < row - 1) {
          var xPoint = initPoint[1];
          var yPoint = initPoint[0] - 1;
          if (checkStone(yPoint, xPoint)) {
            console.log("碰撞到石头了,停止动作")
            return
          }
          // console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)

          initPoint = [yPoint, xPoint]
          // operatePanda(point);
          const style = window.getComputedStyle(pandaPos);
          const ValueStr = style.bottom;
          const Value = parseInt(ValueStr, 10);
          move(119, Value)
          console.log("向上")
        } else {
          console.log("超出地图范围了,停止动作")
        }
      } else if (97 == keynum) {
        var point = initPoint;
        if (point[1] > 0) {

          var xPoint = initPoint[1] - 1;
          var yPoint = initPoint[0];

          if (checkStone(yPoint, xPoint)) {
            console.log("碰撞到石头了,停止动作")
            return
          }
          // console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)
          initPoint = [yPoint, xPoint]
          // operatePanda(point);
          const style = window.getComputedStyle(pandaPos);
          const ValueStr = style.left;
          const Value = parseInt(ValueStr, 10);
          move(97, Value)
          console.log("向左")
        } else {
          console.log("超出地图范围了,停止动作")
        }

      } else if (115 == keynum) {

        var point = initPoint;
        if (point[0] < row - 1) {
          var xPoint = initPoint[1];
          var yPoint = initPoint[0] + 1;
          if (checkStone(yPoint, xPoint)) {
            console.log("碰撞到石头了,停止动作")
            return
          }
          // console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)

          initPoint = [yPoint, xPoint]
          // operatePanda(point);
          const style = window.getComputedStyle(pandaPos);
          const ValueStr = style.bottom;
          const Value = parseInt(ValueStr, 10);
          move(115, Value)

          console.log("向下")
        } else {
          console.log("超出地图范围了,停止动作")
        }

      } else if (100 == keynum) {

        var point = initPoint;
        if (point[1] < column - 1) {
          var xPoint = initPoint[1] + 1;
          var yPoint = initPoint[0];
          if (checkStone(yPoint, xPoint)) {
            console.log("碰撞到石头了,停止动作")
            return
          }
          // console.log("移动后的位置:x:" + xPoint + " , y:" + yPoint)
          initPoint = [yPoint, xPoint]
          // operatePanda(point);
          const style = window.getComputedStyle(pandaPos);
          const ValueStr = style.left;
          const Value = parseInt(ValueStr, 10);
          move(100, Value)
          console.log("向右")
        } else {
          console.log("超出地图范围了,停止动作")
        }
      }
      // console.log(initPoint)
      if(initPoint[0] == 1 && initPoint[1] == 8){
        console.log(`总共${stepNumber},到达终点`)
      }
    }
  </script>
</body>

</html>

迷宫2.0

描述:点击刷新,随机刷新障碍物位置以及启示位置

http://t.csdn.cn/Ec6w0

猜你喜欢

转载自blog.csdn.net/weixin_52479803/article/details/132046088