基于JS实现简单滑块拼图游戏


Posted in Javascript onOctober 12, 2019

成品效果

 基于JS实现简单滑块拼图游戏

<body>
  <div id="game" style="position:relative"></div>
  </body>

/**
 * js配置
 */
var config = {
  width: 300,
  height: 300,
  img: "./img/fj.jpg",
  gameDom: document.getElementById("game"),
  row: 3, //3行
  col: 3 //3列
}
//经过计算的一些数据
var computed = {
  num: config.col * config.row, //方块数量
  w: config.width / config.col, //每个小方块的宽度
  h: config.height / config.row //每个小方块的高度
}
//方块对象的数组,每个对象中记录了方块的正确坐标、当前坐标、dom元素、以及一些实用方法
var blocks;
/**
 * 为全局变量blocks赋值
 */
function setBlocks() {
  blocks = [];
  var points = getPointsArray(); //该数组用于设置每个方块的正确坐标
  var shuffledPoints = [...points]; //复制后的数组用于在洗牌后设置方块的当前坐标
  shuffle(shuffledPoints);//洗牌
  for (var i = 0; i < points.length; i++) {
    const point = points[i];
    //创建方块对象
    var b = {
      left: point.left,
      top: point.top,
      curLeft: shuffledPoints[i].left,
      curTop: shuffledPoints[i].top,
      dom: document.createElement("div"),
      update() {
        this.dom.style.transition = "all .5s";
        this.dom.style.left = this.curLeft + "px";
        this.dom.style.top = this.curTop + "px";
      },
      isCorrect() {
        return this.curTop === this.top && this.curLeft === this.left;
      },
      isEmpty: i === points.length - 1 //是否应该是空白方块
    }
    b.dom.style.width = computed.w + "px";
    b.dom.style.height = computed.h + "px";
    b.dom.style.position = "absolute";
    b.dom.style.border = "1px solid #fff";
    b.dom.style.boxSizing = "border-box";
    b.dom.style.background = `url("${config.img}")`;
    b.dom.style.cursor = "pointer";
    b.dom.style.backgroundPosition = `-${b.left}px -${b.top}px`;
    b.dom.block = b;
    b.dom.onclick = function () {
      switchBlock(this.block);
    }
    b.update();
    blocks.push(b);
  }
}
/**
 * 生成游戏
 */
function generateGame() {
  config.gameDom.style.width = config.width + "px";
  config.gameDom.style.height = config.height + "px";
  config.gameDom.style.border = "2px solid #8c8c8c";
  config.gameDom.innerHTML = ""; //清空区域
  for (const item of blocks) {
    if (!item.isEmpty) {
      config.gameDom.appendChild(item.dom);
    }
  }
}
/**
 * 获得所有方块的可取到的坐标数组
 */
function getPointsArray() {
  var arr = [];
  for (var i = 0; i < computed.num; i++) {
    arr.push({
      left: (i % config.col) * computed.w,
      top: parseInt(i / config.col) * computed.h
    });
  }
  return arr;
}

/**
 * 将某个block对象的坐标,与空坐标交换
 * @param {*} block 
 */
function switchBlock(block) {
  //找到空坐标
  var emptyBlock = blocks.find(b=>b.isEmpty);
  //判断是否相邻
  if(Math.abs(block.curLeft - emptyBlock.curLeft) + 
  Math.abs(block.curTop - emptyBlock.curTop) !== computed.w){
    return;
  }
  //交换
  var bLeft = block.curLeft;
  var bTop = block.curTop;
  block.curLeft = emptyBlock.curLeft;
  block.curTop = emptyBlock.curTop;
  emptyBlock.curLeft = bLeft;
  emptyBlock.curTop = bTop;
  block.update();
  emptyBlock.update();
  if(isWin()){
    setTimeout(() => {
      alert("游戏胜利")
    }, 500);
  }
}
/**
 * 数组洗牌
 * @param {*} arr 
 */
function shuffle(arr) {
  for (var i = 0; i < arr.length - 1; i++) {
    var targetIndex = getRandom(0, arr.length - 1);
    var temp = arr[i];
    arr[i] = arr[targetIndex];
    arr[targetIndex] = temp;
  }
}
function getRandom(min, max) {
  var dec = max - min;
  return Math.floor(Math.random() * dec + min);
}
/**
 * 游戏是否胜利
 */
function isWin() {
  for (const b of blocks) {
    if (!b.isCorrect()) {
      return false;
    }
  }
  return true;
}
setBlocks();
generateGame();

总结

以上所述是小编给大家介绍的基于JS实现简单滑块拼图游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery $.each的用法说明
Mar 22 Javascript
jQuery:节点(插入,复制,替换,删除)操作
Mar 04 Javascript
jquery 字符串切割函数substring的用法说明
Feb 11 Javascript
在JavaScript中判断整型的N种方法示例介绍
Jun 18 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
JQuery调用绑定click事件的3种写法
Mar 28 Javascript
JavaScript检测鼠标移动方向的方法
May 22 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
three.js加载obj模型的实例代码
Nov 10 Javascript
React路由鉴权的实现方法
Sep 05 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
Apr 22 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 #Javascript
Vue.js计算机属性computed和methods方法详解
Oct 12 #Javascript
微信小程序 导入图标实现过程详解
Oct 11 #Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 #Javascript
vue实现点击按钮下载文件功能
Oct 11 #Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
Oct 11 #Javascript
详解vue 自定义组件使用v-model 及探究其中原理
Oct 11 #Javascript
You might like
常见的PHP五种设计模式小结
2011/03/23 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Django工程的分层结构详解
2019/07/18 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
车间班组长岗位职责
2013/11/13 职场文书
大学生就业策划书范文
2014/04/04 职场文书
医院见习总结
2015/06/24 职场文书
企业团队精神心得体会
2016/01/19 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书