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 相关文章推荐
理解Javascript_08_函数对象
Oct 15 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
Mar 17 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
在百度知道团队中快速审批新成员的js脚本
Feb 02 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
jQuery实现延迟跳转的方法
Jun 05 Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
Jun 07 Javascript
js本地图片预览实现代码
Oct 09 Javascript
Vue组件间的通信pubsub-js实现步骤解析
Mar 11 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 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数据库类
2009/05/27 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
javascript如何写热点图
2015/12/08 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JS函数基本定义与用法示例
2020/01/15 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python基于win32api实现键盘输入
2020/12/09 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
幼儿园教师工作制度
2014/01/22 职场文书
小组合作学习反思
2014/02/18 职场文书
超市促销活动方案
2014/03/05 职场文书
2014春晚主持词
2014/03/25 职场文书
学期评语大全
2014/04/30 职场文书
护士找工作求职信
2014/07/02 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
怎么用Python识别手势数字
2021/06/07 Python