在线实例:http://lgy.1zwq.com/puzzleGame/

源代码思路分析:

【一】如何生成图片网格,我想到两种方法:

   (1)把这张大图切成16张小图,然后用img标签的src

   (2)只有一张大图,然后每个元素的背景图用css的background-position进行切割定位,这样就需要16个数组[0,0],[-150,0],[-300,0]..........(我采用这种)

【二】图片背景定位数组与布局定位数组

  在选择了使用CSS定位切图,就需要生成数据。

需要的css背景 定位数组为:[0,0],[-150,0],[-300,0],[-450,0],

                [0,-150],[-150,-150],[-300,-150],[-450,-150],

                [0,-300],[-150,-300],[-300,-300],[-450,-300],

                [0,-450],[-150,-450],[-300,-450],[-450,-450]

它们当中都用到了[0,-150,-300,-450]其中的值(就是我定义图片高,宽150的倍数值),所以就利用这个值通过for(){}自动生成数组

  1.       //this.nCol在这里是4 --- 因为我的拼图是4*4
    // this.nArea是150,是每张图片的宽,高(600px/4)--大图是600*600
    var l = [],
  2. p = [];
  3. for(var n=0;n<this.nCol;n++){
  4. l.push(n*(this.nArea+1)); //生成[0,151,302,453] 网格的布局定位数组,因为我的效果需要边框(图中的绿色边框),所以与css背景定位数组就不一样了
  5. p.push(-n*this.nArea); // 生成了[0,-150,-300,-450]就是上面说的,CSS背景定位值
  6. }
  7. for(var i=0;i<this.nLen;i++){ // this.nLen 是为 16
           var t = parseInt(i/this.nCol),
  8. k = i - this.nCol*t,
  9. aP = [],
  10. aL = [];
  11. aP.push(p[k],p[t],i); //这里我给css背景定位数组额外加了i,是为第3步判断用的,不需要拿来设置css属性的,我把它设置为标签的属性里[bg-i]
  12. aL.push(l[k],l[t]);
  13. this.aBgp[i] = aP;
  14. this.aLayout[i] = aL;
  15. }

【三】判断是否完成

第二个元素(div)应用了css背景定位  this.aBgp[1] (值为[-150,0,1]) ,而随机分配的布局定位假如是this.aLayout[3] (这里的3是随机生成的)(值为[453,0]),那么left:453px,top:0;

挪动这个元素,改变的是它的letf,top值,而不是本身结构的顺序,获取这个元素的left,top的值(假如是挪到left:151px,top:0),然后拿来与this.aLayout[1]的值[151,0](里面的1索引,就是本身标签属性的[bg-i]=1也是this.aBgp[1] 的索引)判断,相等就说明这个元素挪动后的位置是正确。

详细代码:

  1. /*
  2. version:2.0
  3. */
  4. function GyPuzzleGame(option){
  5. this.target = $(option.target);
  6. this.data = option.data; //图片数据
  7. this.opt = option;
  8. this.nLen = option.count; //多少张拼图
  9. this.aColLayout = option.aColLayout || [0,151,302,453];//布局横向数组
  10. this.aRowLayout = option.aRowLayout || [0,151];//布局竖向数组
  11. this.aColBgp = option.aColBgp || [0,-150,-300,-450];//布局横向数组
  12. this.aRowBgp = option.aRowBgp || [0,-150];//布局竖向数组
  13.  
  14. this.nCol = this.aColLayout.length;
  15. this.nRow = this.aRowLayout.length;
  16.  
  17. this.aLayout = []; //布局数组
  18. this.aBgp = []; //css背景定位数组
  19. this.init();
  20. }
  21. GyPuzzleGame.prototype = {
  22. getRand:function(a,r){
  23. var arry = a.slice(0),
  24. newArry = [];
  25. for(var n=0;n<r;n++){
  26. var nR = parseInt(Math.random()*arry.length);
  27. newArry.push(arry[nR]);
  28. arry.splice(nR,1);
  29. }
  30. return newArry;
  31. },
  32. setPos:function(){
  33. for(var i=0;i<this.nLen;i++){
  34. var t = parseInt(i/this.nCol),
  35. l = i - this.nCol*t,
  36. aP = [],
  37. aL = [];
  38. aP.push(this.aColBgp[l],this.aRowBgp[t],i);
  39. aL.push(this.aColLayout[l],this.aRowLayout[t]);
  40. this.aBgp[i] = aP;
  41. this.aLayout[i] = aL;
  42. }
  43. },
  44. isPass:function(item){
  45. var _that = this,
  46. is = 0;
  47. item.each(function(){
  48. var l = parseInt($(this).css('left')),
  49. t = parseInt($(this).css('top')),
  50. i = parseInt($(this).attr('data-bgi'));
  51.  
  52. if(l==_that.aLayout[i][0]&&t==_that.aLayout[i][1]){
  53. is ++;
  54. }
  55. });
  56. return is;
  57. },
  58. createDom:function(){
  59. var layout = this.getRand(this.aLayout,this.nLen);
  60. // console.log(layout);
  61. for(var n=0;n<this.nLen;n++){
  62. var t = parseInt(n/this.nCol),
  63. l = n - this.nCol*t;
  64. var html = $('<div data-bgi="'+this.aBgp[n][2]+'" class="puzzle_list"></div>').
  65. css({'left':layout[n][0]+'px',
  66. 'top':layout[n][1]+'px',
  67. 'background-image':'url('+this.data+')',
  68. 'background-position':this.aBgp[n][0]+'px'+' '+this.aBgp[n][1]+'px'
  69. });
  70.  
  71. this.target.append(html);
  72. }
  73. },
  74. move:function(){
  75. var $div = this.target.find('.puzzle_list'),
  76. _that = this;
  77. var hasElem = function(){
  78. var t = false;
  79. $div.each(function(){
  80. if($(this).hasClass("on")){
  81. t = true;
  82. }
  83. });
  84. return t;
  85. };
  86. // click
  87. $div.click(function(){
  88. var $this = $(this);
  89. if(hasElem()&&!$this.hasClass("on")){
  90. var index = $('.on').index();
  91. if($div.eq(index).is(':animated')||$this.is(':animated')){
  92. return false;
  93. }
  94. var l = $div.eq(index).position().left,
  95. t = $div.eq(index).position().top,
  96. myl = $this.position().left,
  97. myt = $this.position().top;
  98.  
  99. $(this).animate({'left':l,'top':t});
  100. $div.eq(index).css({'z-index':'1'}).animate({'left':myl,'top':myt},function(){
  101. $(this).removeClass("on");
  102. $(this).find('span').remove();
  103. $(this).css({'z-index':'0'});
  104. if(_that.isPass($div) == _that.nLen){
  105. if(typeof _that.opt.success == 'function'){
  106. _that.opt.success({target:_that.target});
  107. }
  108. }
  109. });
  110. }
  111. else {
  112. if($this.hasClass("on")){
  113. $this.removeClass("on");
  114. $this.find('span').remove();
  115. }
  116. else {
  117. $this.addClass("on").append("<span></span>");
  118. }
  119. }
  120.  
  121. });
  122.  
  123. },
  124. init:function(){
  125. // 设置CSS背景定位与元素布局数组
  126. this.setPos();
  127. // 创建元素
  128. this.createDom();
  129. // 挪动图片
  130. this.move();
  131. }
  132. }
  133. //实例调用
  134. new GyPuzzleGame({
  135. 'data':'images/03.jpg',
  136. 'target':'#pA',
  137. 'count':8,
  138. 'success':function(opt){
  139. opt.target.append('<div class="puzzle_mask"></div><div class="puzzle_pass">恭喜过关</div>');
  140. }
  141. });

jQuery之-拼图小游戏的更多相关文章

  1. jQuery实现拼图小游戏

    小熊维尼拼图                                                                                    2017-07-23 ...

  2. 在HTML页面中有jQuery实现实现拼图小游戏

    1.用jQuery实现拼图小游戏 2.首先获得td的点击事件.再进行交换位置 3.下面这种仅供参考 4.下面这些是HTMl标签 当这个世界变得越来越复杂的时候,内心最需保持一份简单一份纯真:

  3. jQuery拼图小游戏

    jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td& ...

  4. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

  5. 使用NGUI实现拖拽功能(拼图小游戏)

    上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...

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

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. swift 拼图小游戏

    依据这位朋友的拼图小游戏改编 http://tangchaolizi.blog.51cto.com/3126463/1571616 改编主要地方是: 原本着我仁兄的代码时支持拖动小图块来移动的,我參照 ...

  8. 教你用Python自制拼图小游戏,一起来制作吧

    摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...

  9. 打造专属自己的html5拼图小游戏

    最近公司刚好有个活动是要做一版 html5的拼图小游戏,于是自己心血来潮,自己先实现了一把,也算是尝尝鲜了.下面就把大体的思路介绍一下,希望大家都可以做出一款属于自己的拼图小游戏,必须是更炫酷,更好玩 ...

随机推荐

  1. nginx的access_log与error_log(三)

    本篇介绍一下在nginx服务器的的两种日志的查看.   根据你找出来的地址,尽心vi编辑,进入nginx.conf文件进行查找路径     从而找到,我机子的两个日志存放地点: /var/logdat ...

  2. SQL Server扩展属性的增、删、改、查

    使用 sql 语句创建表时,可以使用系统存储过程 sp_addextendedproperty 给字段添加描述说明. sp_addextendedproperty 语法: sp_addextended ...

  3. NIO 03

    1. 客户端要主动去连接:channel.connect(new InetSocketAddress("localhost",8888)); //用channel.finishCo ...

  4. NodeJS中间层搭建

    前言 最近碰了个壁,公司开发的一个新项目里我大胆地提出要前后端完全分离,用JavaScript模板引擎.ajax.路由等技术替代繁琐的前后端混合的业务逻辑,项目进行到一半前辈提出来仅仅靠前端的力量无法 ...

  5. 负载均衡技术在CDN中发挥着重要作用

    转载地址:http://www.qicaispace.com/gonggao/server/page01/info07.asp CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储.负载均衡 ...

  6. 20145314郑凯杰 《Java程序设计》第1周学习总结

    20145314郑凯杰 <Java程序设计>第1周学习总结 教材学习内容总结 跟着教材的顺序开始总结我学过的内容: 1.三大平台 JAVA SE ,JAVA EE,JAVA ME 从毕向东 ...

  7. 轻谈Normalize.css

    Normalize.css 是 * ? Normalize.css只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset , Normali ...

  8. LeetCode(476): Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  9. slf4j日志框架绑定机制

    一.环境搭建 我们以log4j为例,探寻slf4j与log4j的绑定过程. 1.Java类 public class Slf4jBind { public static void main(Strin ...

  10. RabbitMQ延迟队列

    rabbitmq延迟队列 rabbitmq实现延迟队列用了rabbitmq-delayed-message-exchange插件,需要提前安装,并启用. 原理 其原理是通过Exchange来实现延迟功 ...