汉字消除游戏,连线消除电影名

105 阅读2分钟

效果

recording.gif

第三方库

hammer.js:旋转 拖拽 移动 缩放

源码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>连字</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Expires" content="0">
</head>
<style>

  * {
    box-sizing: border-box;
    padding: 0;
    margin: 0;
  }

  body {
    width: 100vw;
    height: 100vh;
  }

  #myBox {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    top: 20%;
    display: flex;
    flex-wrap: wrap;
  }

  .box {
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .fontBox {
    width: 85%; 
    height: 85%;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px solid black;
    border-radius: 7px;
  }
</style>
<body>
  <div id="myBox" >
  </div>
</body>

<script type="text/javascript" src="./js/hammer.js"></script>
<script>
  const fontColor = [
    '#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', 
    '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080'
  ]
  const fontArr = [
    {
      allFont: [
        '号', '指', '环', '王', '游', '仙', '境', '侠',
        '克', '加', '勒', '爱', '梦', '阿', '蝙', '蝠',
        '尼', '坦', '比', '丽', '丝', '凡', '达', '玩',
        '器', '泰', '海', '盗', '员', '动', '总', '具',
        '圣', '亡', '死', '特', '人', '冰', '雪', '奇',
        '复', '仇', '与', '比', '霍', '战', '大', '缘',
        '联', '者', '特', '波', '利', '哈', '球', '星',
        '盟', '刚', '金', '形', '变', '钢', '铁', '侠',
      ],
      name: [
        '泰坦尼克号','加勒比海盗','指环王','爱丽丝梦游仙境','蝙蝠侠','阿凡达','玩具总动员','冰雪奇缘',
        '钢铁侠','哈利波特与死亡圣器','霍比特人','变形金刚','复仇者联盟','星球大战'
      ],
      firstFont: ['泰','加','指','爱','蝙','阿','玩','冰','钢','哈','霍','变','复','星']
    }
  ];
  var gameLevel = 0;  // 游戏闯关等级
  var myBox = document.getElementById('myBox');
  const myBoxWidth = document.documentElement.clientWidth - 30;
  myBox.style.width = myBoxWidth + 'px';
  myBox.style.height = myBoxWidth + 'px';
  var allBox = '';
  for(var i = 0; i < 64; i++) {
    allBox += `
      <div class="box box${i}">
        <div class="fontBox fontBox${i}">${fontArr[0].allFont[i]}</div>
      </div>
    `;
  }
  myBox.innerHTML = allBox;
  const boxWidth = (document.documentElement.clientWidth - 30) / 8;
  var posArr = []; // 每一个字体box的边界
  const boxArr = document.getElementsByClassName('box');
  for(var i = 0; i < boxArr.length; i++) {
    boxArr[i].style.width = boxWidth + 'px';
    boxArr[i].style.height = boxWidth + 'px';
  }
  for(var i = 0; i < boxArr.length; i++) {
    var boxDom = boxArr[i].getBoundingClientRect();
    var boxPos = {
      top: boxDom.top,
      left: boxDom.left,
      bottom: boxDom.bottom,
      right: boxDom.right
    }
    posArr.push(boxPos);
  }

  var selectedFont = []; // 被选中的字
  var selectedFontNum = []; // 被选中的字编号
  var selectedResult = true; // 是否是正确的词
  var selectedSuccessCharNum = 0; // 成功的数量
  var selectedSuccessCharCode = []; // 已被成功选中的字编码
  var mc = new Hammer(myBox);
  mc.get('pan').set({ direction: Hammer.DIRECTION_ALL });
  mc.on('pan', (ev) => {
    posArr.forEach((j, idx) => {
      if(!(selectedSuccessCharCode.indexOf(idx) === -1)) {
        return;
      }
      if(j.top < ev.center.y && j.bottom > ev.center.y && j.left < ev.center.x && j.right > ev.center.x) {
        document.getElementsByClassName(`fontBox${idx}`)[0].style.backgroundColor = fontColor[selectedSuccessCharNum];
        // console.log(fontArr[0].allFont[idx], ev);

        // 判断是否已被选中,没有添加
        if(selectedFont.indexOf(fontArr[gameLevel].allFont[idx]) === -1) {
          selectedFont.push(fontArr[gameLevel].allFont[idx]);
          selectedFontNum.push(idx);
        }
      }
    })
  });

  // 监听拖动开始
  mc.on('panstart', (ev) => {

  })

  // 监听拖动结束
  mc.on('panend', (ev) => { 
    // 判断选择字的第一个是否在首字数组中
    if(fontArr[gameLevel].firstFont.indexOf(selectedFont[0]) === -1) {
      selectedFail();
      return;
    }
    var selectedChar = ''; 
    selectedFont.forEach(i => {
      selectedChar += i;
    })

    if(fontArr[gameLevel].name.indexOf(selectedChar) === -1) {
      selectedChar = '';
      selectedFail();
      return;
    }
    selectedSuccessCharNum++;
    console.log("成绩:"+selectedSuccessCharNum);  // 成绩
    selectedSuccessCharCode = [...selectedSuccessCharCode, ...selectedFontNum];
    selectedChar = '';
    selectedFont = [];
    selectedFontNum = [];
  })

  // 选择的字不正确
  function selectedFail() {
    selectedFontNum.forEach(i => {
      document.getElementsByClassName(`fontBox${i}`)[0].style.backgroundColor = '';
    });
    selectedResult = false;
    selectedFont = [];
    selectedFontNum = [];
  }
</script>

</html>