;(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. Android之ubuntu源码开发环境搭建笔记

    昨天,把电脑主机全换了,因此之前的工作环境得重新搭建,我是既开心又纠结,开心的是可以用高配置的电脑,纠结的是搭环境比较麻烦,稍有不慎,就会导致源代码编译不过,前功尽弃.为了减少工作量,以及避免不必要掉 ...

  2. Ubuntu/Debian下通过Apt-get简单安装Oracle JDK

    近几年本人对各种Arm小板,开发板不明原因中毒,基本以Linux系统为主,本篇文章以记录在32位Arm的Debian8上,通过Apt-get的简单命令安装Oracle JDK8并成功的记录. 1.首先 ...

  3. TFS 2015 生成不输出任何结果

    这是一台用于测试的TFS 2015服务器,其中的数据是通过备份和还原,在使用应用层专用的方式配置出来的. 在配置完成代理服务器以后,运行生成,发现在获取代码之前就停止失败了,并且在生成过程中没有任何结 ...

  4. SVG系列教程:SVG简介与嵌入HTML页面的方式

    地址:http://www.w3cplus.com/html5/svg-introduction-and-embedded-html-page.html 随着技术向前的推进,SVG相关的讨论也越渐频繁 ...

  5. dorado-SplitSpanel控件

    1.这是一个界面布局控件 2.分为SideControl边区域和MainControl主区域 3.常用属性 3.1 collapsed:打开页面时,边区域是否显示 3.2 position:边区域占总 ...

  6. Python: pyinstaller打包exe(含file version信息)

    最近项目上一直都是用Spyder直接运行.py文件的方式来执行每日的自动化程序,每天都要手动去点击Run来执行一次,所以考虑把.py文件直接打包成exe,然后用windows的task schedul ...

  7. ASP.NET Core使用EPPlus操作Excel

    1.前言 本篇文章通过ASP.NET Core的EPPlus包去操作Excel(导入导出),其使用原理与NPOI类似,导出Excel的时候不需要电脑上安装office,非常好用 2.使用 新建一个AS ...

  8. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  9. Docker容器的自动化监控实现

    本文由  网易云 发布. 近年来容器技术不断成熟并得到应用.Docker作为容器技术的一个代表,目前也在快速发展中,基于 Docker的各种应用也正在普及,与此同时 Docker对传统的运维体系也带来 ...

  10. 给XCode安装Alcatraz(包管理工具)!!

    Alcatraz官方描述:  Alcatraz is an open-source package manager for Xcode. It lets you discover and instal ...