js拼图
;(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拼图的更多相关文章
- 利用Vue.js实现拼图游戏
之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...
- 原生js完成拼图小游戏
废话不说,看代码,图片可以自己找,我这直接引用了百度的了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml ...
- Vue.js实现拼图游戏
Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...
- js版九宫格拼图与启发式搜索(A*算法)
九宫格拼图游戏大家都很熟悉,这里给大家如介绍何应用状态空间搜索的方式求解拼图的最佳路径和一个游戏dome及自动求解方法: 本文分web版游戏的实现和启发式搜索算法两部分: 先看dome,直接鼠标点击要 ...
- js实现滑动拼图验证码
js实现滑动拼图验证码,我这个样式是仿那些大网站做了, 学习用的,只用到前端. 小的个人网站感觉还可以用,大一点的别人用机器一下就破解了. 下面看图示: 样子大概是这样的. 源码在这 百度网盘: ...
- 拼图游戏js
实现算法: 1. JavaScript动态生成拼图:通过生成16个div,且除最后一个div不使用背景图片以外,其他div都设置拼图图片为背景.然后通过调整background-position来实现 ...
- html+css+js实现网页拼图游戏
代码地址如下:http://www.demodashi.com/demo/14449.html 项目描述 使用 html+js+css 实现一个网页拼图游戏,可支持简单,中等,困难三种难度. 演示效果 ...
- 原生JS实现拼图游戏
最近无聊,练练原生JS:实现拼图游戏.两种玩法:第一种是单击元素进行交换位置:第二种是拖拽元素进行位置交换.首先需要上传图片并进行回显(需要用到FileReader):下面是部分截图: 可以自行设置切 ...
- 拼图游戏(js,C#,java三种语言)
<html> <head> <meta charset="utf-8"> <style type="text/css" ...
随机推荐
- spring注入是否会被回收
在做jms的时候,调用到其他的接口来进行数据库操作. 如果不进行数据库操作的话,jms信息队列都是正常的.但是用的spring注入的接口进行操作的时候,当信息较多的时候,注入的这个接口会变成null. ...
- BCP 基本语法
copy from:http://msdn.microsoft.com/zh-cn/library/ms162802.aspx bcp [database_name.] schema.{table_n ...
- Create Index语句的Include作用
在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能.通过包含非键列,可以创建覆盖更多查询的非聚集索引.这是因为非键列具有下列优点: 它们可以是不允许 ...
- 微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战
微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战 友情提示: 操作系统: MacOS 10.13.5 dotnet core: version 2.1. ...
- C#在dataGridView中遍历,寻找相同的数据并定位
1. C#在dataGridView中遍历,寻找相同的数据并定位 [c-sharp] view plain copy int row = dataGridView1.Rows.Count;// ...
- eclipse的使用和断点调试
断点: 快捷键 f5: step into f6: step over 跳过,跳到下一行 f7:step return 从某个方法里跳回 跳出 drop to frame: 跳到当前方法的第一行 re ...
- Day44 数据库的操作
视图操作: 1.左连接查询 select * from person left join dept on person.dept_id = dept.did 2. 右连接 3. 内连接 inner ...
- python 利用from ... import * 的特性实现文件的覆盖
在Python中, 如果使用 from module import * 这样方式进行导包, 就会把module模块里所有的变量导入进来, 并且可以直接使用(其实导包时 module 模块已经被从头到尾 ...
- ssh 登陆 端口转发
man ssh ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] ...
- java-斐波那契数列的解法
public class Feibo { static long[] temp = new long[1000000]; static long fun1(int n){ if(temp[n]!=0) ...