;(function($){

  function arrayIndexOf(r, num){
if( Array.prototype.indexOf ){
return r.indexOf(num);
}else{
for(var i=0, len=r.length; i<len; i++){
if( r[i] === num ) return i;
} return -1;
}
} /*
初始化范围数字
@x x轴最大值
@y y轴最大值
数字从 0 开始填
最后一行,只有最后一个算合法格子
ret 上下左右,一组一组存
*/
function getRangeNum(x, y){
var ret = []; var cur = -1; for(var i=0; i<y; i++){
for(var j=0; j<x; j++){ cur++; var temp = []; //上
if( i > 0){
temp.push( cur - x );
}else{
temp.push( -1 );
} //下
if( i < y-1 ){
temp.push( cur + x );
}else{
temp.push( -1 );
} //左
if( j > 0 ){
temp.push( cur - 1 );
}else{
temp.push( -1 );
} //右
if( j < x - 1){
temp.push( cur + 1 );
}else{
temp.push( -1 );
} ret.push(temp);
}//for }//for return ret;
} var direction = {
"0" : "s", // 上
"1" : "x", // 下
"2" : "z", // 左
"3" : "y" // 右
} var emptyFun = function(){}; function pintu(option){ var imgSrc = option.imgSrc;
var imgWidth = option.imgWidth;
var imgHeight = option.imgHeight;
var block = option.block || 100;
var id = option.id || "J_paper_pintu";
var begin = option.begin || emptyFun;
var success = option.success || emptyFun; var x = parseInt( imgWidth / block, 10);
var y = parseInt( imgHeight / block, 10); var num = 0;
var beginEmpty = 0;
var empty = 0; $(function(){
var $id = $("#" + id);
var frag = document.createDocumentFragment(); for(var i = 0; i < y; i++){ //行
for(var j = 0; j < x; j++){ //列
var div = document.createElement("div");
div.style.width = block + "px";
div.style.height = block + "px";
div.style.left = block * j + "px";
div.style.top = block * i + "px"; var imgx = block * j * -1 + "px";
var imgy = block * i * -1 + "px";
div.style.background = "url("+ imgSrc +") "+ imgx +" "+ imgy +" no-repeat"; div.setAttribute("data-num", num);
num++;
frag.appendChild(div);
}
} //多加一行
for(i = y, j = 0; j < x; j++ ){
var span = document.createElement("span");
span.setAttribute("data-num", num); if(j == x - 1){
span.className = "last";
empty = num;
beginEmpty = num;
}else{
num++;
} span.style.width = block + "px";
span.style.height = block + "px";
span.style.left = block * j + "px";
span.style.top = block * i + "px"; frag.appendChild(span);
} $id.css({
width : x * block + "px",
height : (y+1) * block + "px",
}).append(frag); var $blocks = $id.find("div");
var blocksLength = $blocks.length;
var ret = getRangeNum(x, y+1); function moveBlock($elem, isHuman){
if( isHuman && begin ){
begin();
begin = null;
} var num = +$elem.attr("data-num"),
rangeNum = ret[num],
i = arrayIndexOf(rangeNum, empty); if( i > -1 ){
$elem.attr("data-num", empty);
empty = num; //移动方块
var d = direction[ i.toString() ]; switch(d){
case "s" : $elem.css("top", parseInt($elem.css("top"), 10) - block + "px");break;
case "x" : $elem.css("top", parseInt($elem.css("top"), 10) + block + "px");break;
case "z" : $elem.css("left", parseInt($elem.css("left"), 10) - block + "px"); break;
case "y" : $elem.css("left", parseInt($elem.css("left"), 10) + block + "px"); break;
} isHuman && checkSuccess();
}
}//end moveBlock //随机打乱图片
function randomGame(){
var max = 1000;
var a = 0; function fn(){
if( a++ > max ) return; var n = parseInt( Math.random()*4, 10);
var i = ret[empty];
var e = i[n]; if( e != -1 && e < blocksLength ){
var $elem = $blocks.eq(e);
moveBlock($elem);
} fn();
} fn();
} //判断是否成功
function checkSuccess(){
if( empty == beginEmpty){ for(var i = 0; i < blocksLength; i++){
if( +$blocks.eq(i).attr("data-num") != i ){
return;
}
} success();
}
} randomGame(); $id.on("click", "div", function(){ moveBlock($(this), true); }); });//ready }//end pintu window.pintu = pintu; })(jQuery);

例子:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>pintu</title>
<script src="http://www.18touch.com/Public/js/jquery.min.js"></script> <link rel="stylesheet" href="pintu.css" />
<script src="pintu.js"></script>
</head>
<body> <div class="paper-pintu-wrap" style="float:left;">
<div id="J_paper_pintu" class="paper-pintu"> </div>
</div> <img src="t3.jpg" alt="" style="float:right;" /> <script>
pintu({
imgSrc : "./t3.jpg",
imgWidth : 300,
imgHeight : 300,
begin : function(){
//console.log("begin");
},
success : function(){
//console.log("success");
alert("success")
}
}); </script>
</body>
</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. MVC2 阻止公共方法被调用

    阻止公共方法被调用 using System.Web.Mvc; namespace MvcApplication1.Controllers { public class WorkController ...

  2. spring mvc配置ObjectMapper忽略无法识别的字段,以及一些博客推荐

    通过Spring的MethodInvokingFactoryBean类实现的调用configure方法,此方法返回调用该方法的本身实例. 配置完毕后,可以在spring mvc的消息处理器中使用,为了 ...

  3. linux系统编程:setjmp和longjmp函数用法

    #include <stdio.h> #include <setjmp.h> //jmp_buf:数组,保存栈信息即运行环境 jmp_buf buf; double Divid ...

  4. Alwayson--使用证书创建高可用性组

    --场景: --有服务器SQLNode11,SQLNODE21,SQLNODE31三台在同一故障转移群集SQLNode01中 --的数据库服务器,安装SQL SERVER 2012 并配置启动alwa ...

  5. ABP 框架代码批量生成器

    需要最新源码,或技术提问,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 简介 用abp 框架快两年了,用它完成了多个项 ...

  6. 零开始:NetCore项目权限管理系统:登录授权

    喜欢NetCore的朋友,欢迎加群QQ:86594082 源码地址:https://github.com/feiyit/SoaProJect 管理员的模型 namespace FytSoa.Core. ...

  7. BitAdminCore框架更新日志20180518

    20180518更新内容 1.重构调整QQ登录代码,使用JObject,减少代码,增加access_token自动续期(未测试). 2.重构调整微信登录代码,使用JObject,减少代码,增加acce ...

  8. SQL 2012新分页方式

    --2012的OFFSET分页方式 (推荐使用 - 较为方便) select number from spt_values where type='p' order by number offset ...

  9. BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)

    1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 82  Solved ...

  10. poj1220------高精度进制转换模板

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; const i ...