基于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 相关文章推荐
javascript中input中readonly和disabled区别介绍
Oct 23 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
如何让你的JS代码更好看易读
Dec 01 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
微信小程序 textarea 层级过高问题简单解决方案
Oct 14 Javascript
node事件循环和process模块实例分析
Feb 14 Javascript
prettier自动格式化去换行的实现代码
Aug 25 Javascript
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
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 字符串操作入门教程
2006/12/06 PHP
PHP 存储文本换行实现方法
2010/01/05 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
php xhprof使用实例详解
2019/04/15 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
nginx 设置多个站跨域
2021/03/09 Servers
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python2.7安装图文教程
2018/03/13 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
python map比for循环快在哪
2020/09/21 Python
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
个人专业技术总结
2015/03/05 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书