基于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实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
May 09 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
详解VueJs异步动态加载块
Mar 09 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
Aug 31 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 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正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
ECMAScript 基础知识
2007/06/29 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python选课系统开发程序
2016/09/02 Python
基于python爬虫数据处理(详解)
2017/06/10 Python
python感知机实现代码
2019/01/18 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
商业房地产广告语
2014/03/13 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
说明书怎么写
2014/05/06 职场文书
委托书格式
2014/08/01 职场文书
入党现实表现材料
2014/12/23 职场文书