jQuery制作拼图小游戏


Posted in Javascript onJanuary 12, 2015

源代码思路分析:

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

 (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(){}自动生成数组

//this.nCol在这里是4 --- 因为我的拼图是4*4

         // this.nArea是150,是每张图片的宽,高(600px/4)--大图是600*600

            var l = [],

                p = [];

            for(var n=0;n<this.nCol;n++){

                l.push(n*(this.nArea+1));     //生成[0,151,302,453] 网格的布局定位数组,因为我的效果需要边框(图中的绿色边框),所以与css背景定位数组就不一样了

                p.push(-n*this.nArea);         // 生成了[0,-150,-300,-450]就是上面说的,CSS背景定位值

            }

            for(var i=0;i<this.nLen;i++){   // this.nLen 是为 16   



          var t = parseInt(i/this.nCol),

                        k = i - this.nCol*t,

                        aP = [],

                        aL = [];

                    aP.push(p[k],p[t],i); //这里我给css背景定位数组额外加了i,是为第3步判断用的,不需要拿来设置css属性的,我把它设置为标签的属性里[bg-i]

                    aL.push(l[k],l[t]);

                    this.aBgp[i] = aP;

                    this.aLayout[i] = aL;                

            }

【三】判断是否完成

        第二个元素(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] 的索引)判断,相等就说明这个元素挪动后的位置是正确。

详细代码:

/*

    version:2.0

    */

    function GyPuzzleGame(option){

        this.target = $(option.target);

        this.data = option.data; //图片数据

        this.opt = option;

        this.nLen = option.count; //多少张拼图

        this.aColLayout = option.aColLayout || [0,151,302,453];//布局横向数组

        this.aRowLayout = option.aRowLayout || [0,151];//布局竖向数组

        this.aColBgp = option.aColBgp || [0,-150,-300,-450];//布局横向数组

        this.aRowBgp = option.aRowBgp || [0,-150];//布局竖向数组

        this.nCol = this.aColLayout.length; 

        this.nRow = this.aRowLayout.length;

        this.aLayout = []; //布局数组

        this.aBgp = []; //css背景定位数组

        this.init();

    }

    GyPuzzleGame.prototype = {

        getRand:function(a,r){

            var arry = a.slice(0),

                newArry = [];

            for(var n=0;n<r;n++){

                var nR = parseInt(Math.random()*arry.length);

                newArry.push(arry[nR]);

                arry.splice(nR,1);

            }

            return newArry;

        },

        setPos:function(){

            for(var i=0;i<this.nLen;i++){                

                var t = parseInt(i/this.nCol),

                    l = i - this.nCol*t,

                    aP = [],

                    aL = [];

                aP.push(this.aColBgp[l],this.aRowBgp[t],i);

                aL.push(this.aColLayout[l],this.aRowLayout[t]);

                this.aBgp[i] = aP;

                this.aLayout[i] = aL;                

            }

        },

        isPass:function(item){

            var _that = this,

                is = 0;

            item.each(function(){

                var l = parseInt($(this).css('left')),

                    t = parseInt($(this).css('top')),

                    i = parseInt($(this).attr('data-bgi'));

                if(l==_that.aLayout[i][0]&&t==_that.aLayout[i][1]){

                    is ++;    

                }                

            });

            return is;

        },

        createDom:function(){

            var layout = this.getRand(this.aLayout,this.nLen);

            // console.log(layout);

            for(var n=0;n<this.nLen;n++){

                var t = parseInt(n/this.nCol),

                    l = n - this.nCol*t;

                var html = $('<div data-bgi="'+this.aBgp[n][2]+'" class="puzzle_list"></div>').

                css({'left':layout[n][0]+'px',

                    'top':layout[n][1]+'px',

                    'background-image':'url('+this.data+')',

                    'background-position':this.aBgp[n][0]+'px'+' '+this.aBgp[n][1]+'px'

                });

                this.target.append(html);

            }

        },

        move:function(){

            var $div = this.target.find('.puzzle_list'),

                _that = this;

            var    hasElem = function(){

                    var t = false;

                    $div.each(function(){

                        if($(this).hasClass("on")){

                            t = true;

                        }

                    });

                    return t;

                };

            // click

            $div.click(function(){

                var $this = $(this);    

                if(hasElem()&&!$this.hasClass("on")){

                    var index = $('.on').index();

                    if($div.eq(index).is(':animated')||$this.is(':animated')){

                        return false;

                    }

                    var l = $div.eq(index).position().left,

                        t = $div.eq(index).position().top,

                        myl = $this.position().left,

                        myt = $this.position().top;

                    $(this).animate({'left':l,'top':t});

                    $div.eq(index).css({'z-index':'1'}).animate({'left':myl,'top':myt},function(){

                            $(this).removeClass("on");

                            $(this).find('span').remove();

                            $(this).css({'z-index':'0'});

                            if(_that.isPass($div) == _that.nLen){

                                if(typeof _that.opt.success == 'function'){

                                    _that.opt.success({target:_that.target});

                                }

                            }

                    });

                }

                else {

                    if($this.hasClass("on")){

                        $this.removeClass("on");

                        $this.find('span').remove();

                    }

                    else {

                        $this.addClass("on").append("<span></span>");

                    }

                }

            });

        },

        init:function(){

            // 设置CSS背景定位与元素布局数组

            this.setPos();

            // 创建元素

            this.createDom();

            // 挪动图片

            this.move();

        }

    }

//实例调用

    new GyPuzzleGame({

        'data':'images/03.jpg',

        'target':'#pA',

        'count':8,

        'success':function(opt){

            opt.target.append('<div class="puzzle_mask"></div><div class="puzzle_pass">恭喜过关</div>');

        }

    });
Javascript 相关文章推荐
jquery随机展示头像代码
Dec 21 Javascript
基于jQuery的公告无限循环滚动实现代码
May 11 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
javascript数据类型验证方法
Dec 31 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
Nov 22 Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
Jun 06 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
Oct 22 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
Jul 21 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 #Javascript
DOM节点删除函数removeChild()用法实例
Jan 12 #Javascript
原生javascript实现图片弹窗交互效果
Jan 12 #Javascript
原生javascript实现图片按钮切换
Jan 12 #Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 #Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 #Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 #Javascript
You might like
十天学会php之第九天
2006/10/09 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
Django 路由层URLconf的实现
2019/12/30 Python
python 通过文件夹导入包的操作
2020/06/01 Python
python如何设置静态变量
2020/09/07 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
酒店应聘自荐信
2013/11/09 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
运动会800米赞词
2015/07/22 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL