基于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 EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
网页整体变灰白色(兼容各浏览器)实例
Apr 21 Javascript
对js eval()函数的一些见解
Aug 15 Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
Sep 12 Javascript
jstl中判断list中是否包含某个值的简单方法
Oct 14 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
Dec 12 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
Dec 26 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
layDate插件设置开始和结束时间
Nov 15 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
Nov 04 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 不使用js实现页面跳转
2014/02/11 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
Vue组件通信的四种方式汇总
2018/02/08 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
python组合无重复三位数的实例
2018/11/13 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
药学专业个人的自我评价
2013/12/31 职场文书
竞选班委演讲稿
2014/04/28 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
旷工检讨书1000字
2015/01/01 职场文书
个人求职信格式范文
2015/03/20 职场文书