[前端] js实现数字拼图

3074 1
Honkers 2022-10-21 16:13:26 | 显示全部楼层 |阅读模式
本文实例为大家分享了js实现数字拼图的具体代码,供大家参考,具体内容如下
重点:
游戏区分为8个div,进行游戏时需要判断点击的div是否可移动,移动后判断游戏是否结束。
解决思路:将游戏界面看作一个div大盒子,将大盒子分为9个区域进行编号,这9个区域的位置始终不变;8个div以定位top和left控制其位置,设置9个区域的div分别可以往哪个区域移动,点击时判断可移动的编号区域内是否有div,若有,则无法向该方向移动。每次移动后检查8个div的编号是否与区域的编号完全重合,若重合,则通关。
运行情况


HTML
  1. <div id="container">
  2.     <!--最外面的DIV,用来包含里面的结构-->
  3.     <div id="game">
  4.       <!--游戏区,也就是大DIV方块-->
  5.       <div id="d1">1</div>
  6.       <div id="d2">2</div>
  7.       <div id="d3">3</div>
  8.       <div id="d4">4</div>
  9.       <div id="d5">5</div>
  10.       <div id="d6">6</div>
  11.       <div id="d7">7</div>
  12.       <div id="d8">8</div>
  13.     </div>
  14.     <div id="control">
  15.       <!--游戏控制区-->
  16.       <p>
  17.         总用时:
  18.         <span id="timer"></span>
  19.       </p>
  20.       <!--显示游戏时间区域-->
  21.       <p>
  22.         <button id="start">开始</button>
  23.         <button id="reset">重来</button>
  24.       </p>
  25.       <!--显示控制按钮区域-->
  26.     </div>
  27. </div>
复制代码
CSS
  1. * {
  2.       padding: 0;
  3.       margin: 0;
  4.       border: 0;
  5.     }
  6.     body {
  7.       width: 100%;
  8.       height: 100%;
  9.     }
  10.     #container {
  11.       position: relative;
  12.       width: 620px;
  13.       height: 450px;
  14.       margin: 0 auto;
  15.       margin-top: 100px;
  16.       border-radius: 1px;
  17.     }
  18.     #game {
  19.       position: absolute;
  20.       width: 450px;
  21.       height: 450px;
  22.       border-radius: 5px;
  23.       display: inline-block;
  24.       background-color: #ffe171;
  25.       box-shadow: 0 0 10px #ffe171;
  26.     }
  27.     #game div {
  28.       position: absolute;
  29.       width: 149px;
  30.       height: 149px;
  31.       box-shadow: 1px 1px 2px #777;
  32.       background-color: #20a6fa;
  33.       color: white;
  34.       text-align: center;
  35.       font-size: 150px;
  36.       line-height: 150px;
  37.       cursor: pointer;
  38.       transition: 0.3s;
  39.     }
  40.     #game div:hover {
  41.       color: #ffe171;
  42.     }
  43.     #control {
  44.       width: 150px;
  45.       height: 450px;
  46.       display: inline-block;
  47.       position: absolute;
  48.       top: 0;
  49.       right: 0;
  50.     }
  51.     #control button {
  52.       height: 25px;
  53.       font-size: 20px;
  54.       color: #222;
  55.       margin-top: 10px;
  56.     }
  57.     #start {
  58.       display: inline-block;
  59.       font-size: 28px;
  60.       width: 100px;
  61.       height: 28px;
  62.       background-color: #20a6fa;
  63.       color: #ffe171;
  64.       text-shadow: 1px 1px 2px #ffe171;
  65.       border-radius: 5px;
  66.       box-shadow: 2px 2px 5px #4c98f5;
  67.       text-align: center;
  68.       /* cursor:pointer 让鼠标移到元素上面显示不同的鼠标形状,pointer是手型 */
  69.       cursor: pointer;
  70.     }
  71.     #reset {
  72.       display: inline-block;
  73.       font-size: 28px;
  74.       width: 100px;
  75.       height: 28px;
  76.       background-color: #20a6fa;
  77.       color: #ffe171;
  78.       text-shadow: 1px 1px 2px #ffe171;
  79.       border-radius: 5px;
  80.       box-shadow: 2px 2px 5px #4c98f5;
  81.       text-align: center;
  82.       cursor: pointer;
  83.     }
  84.     #d1 {
  85.       left: 0px;
  86.     }
  87.     #d2 {
  88.       left: 150px;
  89.     }
  90.     #d3 {
  91.       left: 300px;
  92.     }
  93.     #d4 {
  94.       top: 150px;
  95.     }
  96.     #d5 {
  97.       top: 150px;
  98.       left: 150px;
  99.     }
  100.     #d6 {
  101.       top: 150px;
  102.       left: 300px;
  103.     }
  104.     #d7 {
  105.       top: 300px;
  106.     }
  107.     #d8 {
  108.       left: 150px;
  109.       top: 300px;
  110.     }
复制代码
JS
  1. var time = 0;
  2. //添加暂停判断
  3. var pause = true;
  4. var set_timer;
  5. //创建编号,不使用第一个元素
  6. var d = new Array(10);
  7. for (var i = 1; i < 9; i++) {
  8.       d[i] = i;
  9.     }
  10.     d[9] = 0;
  11.     //大div编号可移动的位置
  12.     var d_direct = new Array(
  13.       [0], [2, 4], [1, 3, 5], [2, 6], [1, 5, 7], [2, 4, 6, 8], [3, 5, 9], [4, 8], [5, 7, 9], [6, 8]
  14.     );
  15.     //大div编号的位置[left,top]
  16.     var d_posXY = new Array(
  17.       [0], [0, 0], [150, 0], [300, 0], [0, 150], [150, 150], [300, 150], [0, 300], [150, 300], [300, 300]
  18.     );
  19.     var game = document.querySelectorAll('#game>div');
  20.     for (var i = 0; i < game.length; i++) {
  21.       var j = i + 1;
  22.       game[i].setAttribute('index', j);
  23.       game[i].addEventListener('click', function(e) {
  24.         move(e, e.target.getAttribute('index'));
  25.       });
  26.     }
  27.     //移动
  28.     function move(e, id) {
  29.       //查找小div在大div中的位置
  30.       var i = 1;
  31.       for (i = 1; i < 10; i++) {
  32.         if (d[i] == id) {
  33.           break;
  34.         }
  35.       }
  36.       //查找小div可移动的位置,0则无法移动
  37.       var target_d = 0;
  38.       target_d = whereCanTo(i);
  39.       //判断当前被点击的小div是否可移动
  40.       if (target_d != 0) {
  41.         //设置当前大div编号为0
  42.         d[i] = 0;
  43.         //将目标大div编号设置为被点击的小div编号
  44.         d[target_d] = id;
  45.         //设置被点击小div的位置
  46.         document.getElementById('d' + id).style.left = d_posXY[target_d][0] + 'px';
  47.         document.getElementById('d' + id).style.top = d_posXY[target_d][1] + 'px';
  48.       }
  49.       //判断游戏是否完成
  50.       var finish_flag = true;
  51.       for (var k = 1; k < 9; k++) {
  52.         if (d[k] != k) {
  53.           finish_flag = false;
  54.           break;
  55.         }
  56.       }
  57.       if (finish_flag == true) {
  58.         if (!pause) {
  59.           start();
  60.           alert('bingo congratulation!');
  61.         }
  62.       }
  63.     }
  64.     //查找并返回小div可以移动的编号
  65.     function whereCanTo(cur_div) {
  66.       var j = 0;
  67.       var move_flag = false;
  68.       for (j = 0; j < d_direct[cur_div].length; j++) {
  69.         if (d[d_direct[cur_div][j]] == 0) {
  70.           move_flag = true;
  71.           break;
  72.         }
  73.       }
  74.       if (move_flag == true) {
  75.         return d_direct[cur_div][j];
  76.       } else {
  77.         return 0;
  78.       }
  79.     }
  80.     //设置计时
  81.     function timer() {
  82.       time += 1;
  83.       var min = parseInt(time / 60);
  84.       var s = time % 60;
  85.       document.getElementById('timer').innerHTML = min + '分' + s + '秒';
  86.     }
  87.     //开始暂停
  88.     var start = document.querySelector('#start');
  89.     start.addEventListener('click', sta);
  90.     function sta() {
  91.       if (pause) {
  92.         start.innerHTML = '暂停';
  93.         pause = false;
  94.         set_timer = setInterval(timer, 1000);
  95.       } else {
  96.         start.innerHTML = '开始';
  97.         pause = true;
  98.         clearInterval(set_timer);
  99.       }
  100.     }
  101.     //重置游戏
  102.     var reset = document.querySelector('#reset');
  103.     reset.addEventListener('click', res);
  104.     function res() {
  105.       time = 0;
  106.       random_d();
  107.       if (pause) {
  108.         sta();
  109.       }
  110.     }
  111.     //随机打乱
  112.     function random_d() {
  113.       for (var i = 9; i > 1; i--) {
  114.         var to = parseInt(Math.random() * (i - 1) + 1);
  115.         //设置当前div为随机产生的div位置
  116.         if (d[i] != 0) {
  117.           document.getElementById('d' + d[i]).style.left = d_posXY[to][0] + 'px';
  118.           document.getElementById('d' + d[i]).style.top = d_posXY[to][1] + 'px';
  119.         }
  120.         //设置随机产生的div位置为当前div位置
  121.         if (d[to] != 0) {
  122.           document.getElementById('d' + d[to]).style.left = d_posXY[i][0] + 'px';
  123.           document.getElementById('d' + d[to]).style.top = d_posXY[i][1] + 'px';
  124.         }
  125.         //随机产生的div与当前的div编号互换
  126.         var temp = d[to];
  127.         d[to] = d[i];
  128.         d[i] = temp;
  129.       }
  130.     }
  131.     //初始化
  132.     window.addEventListener('load', res);
复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中国红客联盟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4008
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行