js拼图

;(function($){

  function arrayIndexOf(r, num){
    if( Array.prototype.indexOf ){
      return r.indexOf(num);
    }else{
      for(var i=0, len=r.length; i<len; i++){
        if( r[i] === num ) return i;
      }

      return -1;
    }
  }

  /*
    初始化范围数字
    @x x轴最大值
    @y y轴最大值
    数字从 0 开始填
    最后一行,只有最后一个算合法格子
    ret 上下左右,一组一组存
  */
  function getRangeNum(x, y){
    var ret = [];

    var cur = -1;

    for(var i=0; i<y; i++){
      for(var j=0; j<x; j++){

        cur++;

        var temp = [];

        //上
        if( i > 0){
          temp.push( cur - x );
        }else{
          temp.push( -1 );
        }

        //下
        if( i < y-1 ){
          temp.push( cur + x );
        }else{
          temp.push( -1 );
        }

        //左
        if( j > 0 ){
          temp.push( cur - 1 );
        }else{
          temp.push( -1 );
        }

        //右
        if( j < x - 1){
          temp.push( cur + 1 );
        }else{
          temp.push( -1 );
        }

        ret.push(temp);
      }//for

    }//for

    return ret;
  }

  var direction = {
    "0" : "s", // 上
    "1" : "x", // 下
    "2" : "z", // 左
    "3" : "y"  // 右
  }

  var emptyFun = function(){};

  function pintu(option){

    var imgSrc = option.imgSrc;
    var imgWidth = option.imgWidth;
    var imgHeight = option.imgHeight;
    var block = option.block || 100;
    var id = option.id || "J_paper_pintu";
    var begin = option.begin || emptyFun;
    var success = option.success || emptyFun;

    var x = parseInt( imgWidth / block, 10);
    var y = parseInt( imgHeight / block, 10);

    var num = 0;
    var beginEmpty = 0;
    var empty = 0;

    $(function(){
      var $id = $("#" + id);
      var frag = document.createDocumentFragment();

      for(var i = 0; i < y; i++){ //行
        for(var j = 0; j < x; j++){ //列
          var div = document.createElement("div");
          div.style.width = block + "px";
          div.style.height = block + "px";
          div.style.left = block * j + "px";
          div.style.top = block * i + "px";

          var imgx = block * j * -1 + "px";
          var imgy = block * i * -1 + "px";
          div.style.background = "url("+ imgSrc +") "+ imgx +" "+ imgy +" no-repeat";

          div.setAttribute("data-num", num);
          num++;
          frag.appendChild(div);
        }
      }

      //多加一行
      for(i = y, j = 0; j < x; j++ ){
        var span = document.createElement("span");
        span.setAttribute("data-num", num);

        if(j == x - 1){
          span.className = "last";
          empty = num;
          beginEmpty = num;
        }else{
          num++;
        } 

        span.style.width = block + "px";
        span.style.height = block + "px";
        span.style.left = block * j + "px";
        span.style.top = block * i + "px";

        frag.appendChild(span);
      }

      $id.css({
        width : x * block + "px",
        height : (y+1) * block + "px",
      }).append(frag);

      var $blocks = $id.find("div");
      var blocksLength = $blocks.length;
      var ret = getRangeNum(x, y+1);

      function moveBlock($elem, isHuman){
        if( isHuman && begin ){
          begin();
          begin = null;
        }

        var num = +$elem.attr("data-num"),
            rangeNum = ret[num],
            i = arrayIndexOf(rangeNum, empty);

        if( i > -1 ){
          $elem.attr("data-num", empty);
          empty = num;

          //移动方块
          var d = direction[ i.toString() ];

          switch(d){
            case "s" : $elem.css("top", parseInt($elem.css("top"), 10) - block + "px");break;
            case "x" : $elem.css("top", parseInt($elem.css("top"), 10) + block + "px");break;
            case "z" : $elem.css("left", parseInt($elem.css("left"), 10) - block + "px"); break;
            case "y" : $elem.css("left", parseInt($elem.css("left"), 10) + block + "px"); break;
          }

          isHuman && checkSuccess();
        }
      }//end moveBlock

      //随机打乱图片
      function randomGame(){
        var max = 1000;
        var a = 0;

        function fn(){
          if( a++ > max ) return;

          var n = parseInt( Math.random()*4, 10);
          var i = ret[empty];
          var e = i[n];

          if( e != -1 && e < blocksLength ){
            var $elem = $blocks.eq(e);
            moveBlock($elem);
          }

          fn();
        }

        fn();
      }

      //判断是否成功
      function checkSuccess(){
        if( empty == beginEmpty){

          for(var i = 0; i < blocksLength; i++){
            if( +$blocks.eq(i).attr("data-num") != i ){
              return;
            }
          }

          success();
        }
      }

      randomGame();

      $id.on("click", "div", function(){

        moveBlock($(this), true);

      });

    });//ready

  }//end pintu

  window.pintu = pintu;

})(jQuery);

例子:

<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>pintu</title>
  <script src="http://www.18touch.com/Public/js/jquery.min.js"></script>

  <link rel="stylesheet" href="pintu.css" />
  <script src="pintu.js"></script>
</head>
<body>

  <div class="paper-pintu-wrap" style="float:left;">
    <div id="J_paper_pintu" class="paper-pintu">

    </div>
  </div>

  <img src="t3.jpg"  style="float:right;" />

  <script>
    pintu({
      imgSrc : "./t3.jpg",
      imgWidth : 300,
      imgHeight : 300,
      begin : function(){
        //console.log("begin");
      },
      success : function(){
        //console.log("success");
        alert("success")
      }
    });

  </script>
</body>
</html>
时间: 2024-11-08 02:11:00

js拼图的相关文章

原生js拼图,封装,组件化

利用原生js实现拼图游戏,实现封装,变为插件,组件化,传入参数调用, 使用立即执行函数,将变量私有化,不污染全局, 利用canvas展示效果,减少dom操作,不影响HTML结构: 1 var myPingTu = (function(){ 2 function init(row_i,dom){ 3 var myCanvas = dom; 4 var row = row_i || 3,// 行列数 5 arr = [], 6 num = row * row;// 块个数 7 if (!myCanv

Vue.js实现拼图游戏

Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5516065.html 前言 为了进一步让大家了解Vue.js的神奇魅力,了解Vue.js的一种以数据为驱动的理念,本文主要利用Vue实现了一个数字拼图游戏,其原理并不是很复杂,效果图如下: demo展示地址为:https://luozhihao.github.io/vue-puzz

利用Vue.js实现拼图游戏

之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5516065.html 前言 为了进一步让大家了解Vue.js的神奇魅力,了解Vue.js的一种以数据为驱动的理念,本文主要利用Vue实现了一个数字拼图游戏,其原理并不是很复杂,效果图如下: demo展示地址为:https://luozhihao.github.io/vue-puzzle/index.html

js实现滑动拼图验证码

js实现滑动拼图验证码,我这个样式是仿那些大网站做了, 学习用的,只用到前端. 小的个人网站感觉还可以用,大一点的别人用机器一下就破解了. 下面看图示: 样子大概是这样的. 源码在这 百度网盘:   链接: https://pan.baidu.com/s/1htjxYBE 密码: m5aw 3.9MB 是因为里面绝大部分是图片 使用示例 代码里面都有 js源码 (function (window, document) { var SliderBar = function (targetDom,

JS小游戏-蓝色拼图

初见 我是在这里看到这个游戏的 × 请看这里 http://www.webhek.com/misc/inverter. 看到这个小游戏就觉得挺有意思的,于是想要去自己实现它. 开始 下面的是这个小游戏,大家玩玩看 ×Close Oh!蓝色拼图 当前级别: 重置本局 重置级别 玩法说明 以下是代码 写完后自己看着都觉得恶心...很想把它放到一个对象里面,但是太懒了,能用就行(つд⊂) .gamebox { background-color: #4D4D4D; border-radius: 4px;

走进Vue.js

走进Vue.js Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解如何通过Vue.js来构建一个中大型的前端项目,同时做好相应的部署与优化工作. 文章将以PPT图片附加文字介绍的形式展开,不会涉及知识点的具体代码,点到为止.有兴趣的同学可以查看相应的文档进行了解. Vue.js简介 从上图的介绍中我们不难发现Vue.js是一款轻量级的以数据驱动的前端JS框架,其和

一款html拼图游戏详解

本文是爱编程原创翻译,转载请看清文末的转载要求,谢谢合作! 游戏介绍 这篇文章是献给web游戏开发者用简单的开发工具开发一款游戏.此文介绍了用html.css.javascript只需简单和几个步骤开发一款2d游戏.在这里,我要呈现给大家如何创建一款拼图游戏,在这个游戏中你可以拖动小图块来拼成完整的大图. 点击这里查看游戏效果. 游戏规则 游戏规则非常简单,你只要拖动被切碎的图片块来组成完整的大图.需要用正确的方法才能最终拼成完整的图片.在游戏中拖动小图片的次数将被统计下来.所以.应该尽量用最少

前端开发之走进Vue.js

Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解如何通过Vue.js来构建一个中大型的前端项目,同时做好相应的部署与优化工作. 文章将以PPT图片附加文字介绍的形式展开,不会涉及知识点的具体代码,点到为止.有兴趣的同学可以查看相应的文档进行了解. Vue.js简介 从上图的介绍中我们不难发现Vue.js是一款轻量级的以数据驱动的前端JS框架,其和jQuery最大的

仿苹果电脑任务栏菜单&amp;&amp;拼图小游戏&amp;&amp;模拟表单控件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-