1. ;(function($){
  2.  
  3. function arrayIndexOf(r, num){
  4. if( Array.prototype.indexOf ){
  5. return r.indexOf(num);
  6. }else{
  7. for(var i=0, len=r.length; i<len; i++){
  8. if( r[i] === num ) return i;
  9. }
  10.  
  11. return -1;
  12. }
  13. }
  14.  
  15. /*
  16. 初始化范围数字
  17. @x x轴最大值
  18. @y y轴最大值
  19. 数字从 0 开始填
  20. 最后一行,只有最后一个算合法格子
  21. ret 上下左右,一组一组存
  22. */
  23. function getRangeNum(x, y){
  24. var ret = [];
  25.  
  26. var cur = -1;
  27.  
  28. for(var i=0; i<y; i++){
  29. for(var j=0; j<x; j++){
  30.  
  31. cur++;
  32.  
  33. var temp = [];
  34.  
  35. //上
  36. if( i > 0){
  37. temp.push( cur - x );
  38. }else{
  39. temp.push( -1 );
  40. }
  41.  
  42. //下
  43. if( i < y-1 ){
  44. temp.push( cur + x );
  45. }else{
  46. temp.push( -1 );
  47. }
  48.  
  49. //左
  50. if( j > 0 ){
  51. temp.push( cur - 1 );
  52. }else{
  53. temp.push( -1 );
  54. }
  55.  
  56. //右
  57. if( j < x - 1){
  58. temp.push( cur + 1 );
  59. }else{
  60. temp.push( -1 );
  61. }
  62.  
  63. ret.push(temp);
  64. }//for
  65.  
  66. }//for
  67.  
  68. return ret;
  69. }
  70.  
  71. var direction = {
  72. "0" : "s", // 上
  73. "1" : "x", // 下
  74. "2" : "z", // 左
  75. "3" : "y" // 右
  76. }
  77.  
  78. var emptyFun = function(){};
  79.  
  80. function pintu(option){
  81.  
  82. var imgSrc = option.imgSrc;
  83. var imgWidth = option.imgWidth;
  84. var imgHeight = option.imgHeight;
  85. var block = option.block || 100;
  86. var id = option.id || "J_paper_pintu";
  87. var begin = option.begin || emptyFun;
  88. var success = option.success || emptyFun;
  89.  
  90. var x = parseInt( imgWidth / block, 10);
  91. var y = parseInt( imgHeight / block, 10);
  92.  
  93. var num = 0;
  94. var beginEmpty = 0;
  95. var empty = 0;
  96.  
  97. $(function(){
  98. var $id = $("#" + id);
  99. var frag = document.createDocumentFragment();
  100.  
  101. for(var i = 0; i < y; i++){ //行
  102. for(var j = 0; j < x; j++){ //列
  103. var div = document.createElement("div");
  104. div.style.width = block + "px";
  105. div.style.height = block + "px";
  106. div.style.left = block * j + "px";
  107. div.style.top = block * i + "px";
  108.  
  109. var imgx = block * j * -1 + "px";
  110. var imgy = block * i * -1 + "px";
  111. div.style.background = "url("+ imgSrc +") "+ imgx +" "+ imgy +" no-repeat";
  112.  
  113. div.setAttribute("data-num", num);
  114. num++;
  115. frag.appendChild(div);
  116. }
  117. }
  118.  
  119. //多加一行
  120. for(i = y, j = 0; j < x; j++ ){
  121. var span = document.createElement("span");
  122. span.setAttribute("data-num", num);
  123.  
  124. if(j == x - 1){
  125. span.className = "last";
  126. empty = num;
  127. beginEmpty = num;
  128. }else{
  129. num++;
  130. }
  131.  
  132. span.style.width = block + "px";
  133. span.style.height = block + "px";
  134. span.style.left = block * j + "px";
  135. span.style.top = block * i + "px";
  136.  
  137. frag.appendChild(span);
  138. }
  139.  
  140. $id.css({
  141. width : x * block + "px",
  142. height : (y+1) * block + "px",
  143. }).append(frag);
  144.  
  145. var $blocks = $id.find("div");
  146. var blocksLength = $blocks.length;
  147. var ret = getRangeNum(x, y+1);
  148.  
  149. function moveBlock($elem, isHuman){
  150. if( isHuman && begin ){
  151. begin();
  152. begin = null;
  153. }
  154.  
  155. var num = +$elem.attr("data-num"),
  156. rangeNum = ret[num],
  157. i = arrayIndexOf(rangeNum, empty);
  158.  
  159. if( i > -1 ){
  160. $elem.attr("data-num", empty);
  161. empty = num;
  162.  
  163. //移动方块
  164. var d = direction[ i.toString() ];
  165.  
  166. switch(d){
  167. case "s" : $elem.css("top", parseInt($elem.css("top"), 10) - block + "px");break;
  168. case "x" : $elem.css("top", parseInt($elem.css("top"), 10) + block + "px");break;
  169. case "z" : $elem.css("left", parseInt($elem.css("left"), 10) - block + "px"); break;
  170. case "y" : $elem.css("left", parseInt($elem.css("left"), 10) + block + "px"); break;
  171. }
  172.  
  173. isHuman && checkSuccess();
  174. }
  175. }//end moveBlock
  176.  
  177. //随机打乱图片
  178. function randomGame(){
  179. var max = 1000;
  180. var a = 0;
  181.  
  182. function fn(){
  183. if( a++ > max ) return;
  184.  
  185. var n = parseInt( Math.random()*4, 10);
  186. var i = ret[empty];
  187. var e = i[n];
  188.  
  189. if( e != -1 && e < blocksLength ){
  190. var $elem = $blocks.eq(e);
  191. moveBlock($elem);
  192. }
  193.  
  194. fn();
  195. }
  196.  
  197. fn();
  198. }
  199.  
  200. //判断是否成功
  201. function checkSuccess(){
  202. if( empty == beginEmpty){
  203.  
  204. for(var i = 0; i < blocksLength; i++){
  205. if( +$blocks.eq(i).attr("data-num") != i ){
  206. return;
  207. }
  208. }
  209.  
  210. success();
  211. }
  212. }
  213.  
  214. randomGame();
  215.  
  216. $id.on("click", "div", function(){
  217.  
  218. moveBlock($(this), true);
  219.  
  220. });
  221.  
  222. });//ready
  223.  
  224. }//end pintu
  225.  
  226. window.pintu = pintu;
  227.  
  228. })(jQuery);

例子:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>pintu</title>
  6. <script src="http://www.18touch.com/Public/js/jquery.min.js"></script>
  7.  
  8. <link rel="stylesheet" href="pintu.css" />
  9. <script src="pintu.js"></script>
  10. </head>
  11. <body>
  12.  
  13. <div class="paper-pintu-wrap" style="float:left;">
  14. <div id="J_paper_pintu" class="paper-pintu">
  15.  
  16. </div>
  17. </div>
  18.  
  19. <img src="t3.jpg" alt="" style="float:right;" />
  20.  
  21. <script>
  22. pintu({
  23. imgSrc : "./t3.jpg",
  24. imgWidth : 300,
  25. imgHeight : 300,
  26. begin : function(){
  27. //console.log("begin");
  28. },
  29. success : function(){
  30. //console.log("success");
  31. alert("success")
  32. }
  33. });
  34.  
  35. </script>
  36. </body>
  37. </html>

js拼图的更多相关文章

  1. 利用Vue.js实现拼图游戏

    之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...

  2. 原生js完成拼图小游戏

    废话不说,看代码,图片可以自己找,我这直接引用了百度的了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml ...

  3. Vue.js实现拼图游戏

    Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...

  4. js版九宫格拼图与启发式搜索(A*算法)

    九宫格拼图游戏大家都很熟悉,这里给大家如介绍何应用状态空间搜索的方式求解拼图的最佳路径和一个游戏dome及自动求解方法: 本文分web版游戏的实现和启发式搜索算法两部分: 先看dome,直接鼠标点击要 ...

  5. js实现滑动拼图验证码

    js实现滑动拼图验证码,我这个样式是仿那些大网站做了, 学习用的,只用到前端. 小的个人网站感觉还可以用,大一点的别人用机器一下就破解了. 下面看图示: 样子大概是这样的. 源码在这 百度网盘:    ...

  6. 拼图游戏js

    实现算法: 1. JavaScript动态生成拼图:通过生成16个div,且除最后一个div不使用背景图片以外,其他div都设置拼图图片为背景.然后通过调整background-position来实现 ...

  7. html+css+js实现网页拼图游戏

    代码地址如下:http://www.demodashi.com/demo/14449.html 项目描述 使用 html+js+css 实现一个网页拼图游戏,可支持简单,中等,困难三种难度. 演示效果 ...

  8. 原生JS实现拼图游戏

    最近无聊,练练原生JS:实现拼图游戏.两种玩法:第一种是单击元素进行交换位置:第二种是拖拽元素进行位置交换.首先需要上传图片并进行回显(需要用到FileReader):下面是部分截图: 可以自行设置切 ...

  9. 拼图游戏(js,C#,java三种语言)

    <html> <head> <meta charset="utf-8"> <style type="text/css" ...

随机推荐

  1. Android App 退出整个应用

    在做Android APP 过程中,有退出整个Project的功能,以下就是接受退出整个应用的操作: ActivityManager是用来管理记录每一个Activity,最后统一用来退出结束: pub ...

  2. xlsxwriter

    xlsxwriter是python中用来处理execl表格的库 参考

  3. Spring Boot 2 实践记录之 使用 ConfigurationProperties 注解将配置属性匹配至配置类的属性

    在 Spring Boot 2 实践记录之 条件装配 一文中,曾经使用 Condition 类的 ConditionContext 参数获取了配置文件中的配置属性.但那是因为 Spring 提供了将上 ...

  4. C# Socket 实现WebSocket服务器端

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  5. 【NumberValidators】增值税发票代码验证

    同大陆身份证验证一样,该部分是按照国家增值税发票代码的定制规则,进行发票代码验证,如果需要查验发票信息是否正确,应该通过第三方接口(大约一毛钱查验一次),或者直接上国家税务总局全国增值税发票查验平台进 ...

  6. 902. Numbers At Most N Given Digit Set

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  7. JavaScript基础数组_布尔值_逻辑运算等(2)

    day51 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html 布尔值(Boolean) 区别于Python,true和false都是小写. var ...

  8. 六,mysql优化——小知识点

    1,选择适当的字段类型,特别是主键 选择字段的一般原则是保小不保大,能占用字节小的字段就不用大字段.比如主键,建议使用自增类型,这样节省空间,空间就是效率!按4个字节和按32个字节定位一条记录,谁快谁 ...

  9. centos 6 下,zephir的安装和使用

    centos 6 下,zephir的安装和使用 zephir或许会开启一个新的PHP编写方式. 在这之前,如果我们要编写php的扩展,一般都是c++/clang/vc等等. 但是现在,我们有了新的选择 ...

  10. 2 rocketmq mqadmin 的用法详解

    参考文档 http://jameswxx.iteye.com/blog/2091971 1.1. 控制台使用 RocketMQ 提供有控制台及一系列控制台命令,用于管理员对主题,集群,broker 等 ...