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 相关文章推荐
sina的lightbox效果。
Jan 09 Javascript
Ext面向对象开发实践(续)
Nov 18 Javascript
Exjs 入门篇
Apr 07 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
jQuery模拟点击A标记示例参考
Apr 17 Javascript
js分页代码分享
Apr 28 Javascript
深入浅出理解javaScript原型链
May 09 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
js常用DOM方法详解
Feb 04 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
实例详解JSON取值(key是中文或者数字)方式
Aug 24 Javascript
webpack4 处理SCSS的方法示例
Sep 03 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
基于ionic实现下拉刷新功能
2018/05/10 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
在Django中创建第一个静态视图
2015/07/15 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
Servlet如何得到客户端机器的信息
2014/10/17 面试题
纪检监察建议书
2014/05/19 职场文书
庆祝教师节主持词
2015/07/06 职场文书