基于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 相关文章推荐
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
JQuery Dialog的内存泄露问题解决方法
Jun 18 Javascript
js 函数的副作用分析
Aug 23 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
Extjs4中Form的使用之本地hiddenfield
Nov 26 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
angularJs 表格添加删除修改查询方法
Feb 27 Javascript
vue-cli 如何打包上线的方法示例
May 08 Javascript
利用jqgrid实现上移下移单元格功能
Nov 07 Javascript
vuex分模块后,实现获取state的值
Jul 26 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/08/11 PHP
培养自己的php编码规范
2015/09/28 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
Python 列表list使用介绍
2014/11/30 Python
详解python3百度指数抓取实例
2016/12/12 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python单元测试与测试用例简析
2019/11/09 Python
如何使用python进行pdf文件分割
2019/11/11 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
不用游标的SQL语句有哪些
2012/09/07 面试题
社会实践感言
2014/01/25 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
汽车修理厂管理制度
2015/08/05 职场文书