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" ...
随机推荐
- matlab中使用正弦波合成方波(带动画)
x=:*pi; :: s=; ::step s = s+/i*sin(i*x); end plot(s);set(figure(),'visible','off'); filename=[num2st ...
- leetcode 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- C# 基础篇
全篇依据 C#高级编程(第9版) 内容记录: 基础知识C# 5.0 基础 分为15章内容来介绍 核心C# 对象和类型 继承 泛型 数组 运算符和类型强制转换 委托和lambda表达式,事件 字符串和正 ...
- 使用n g r o k将本地主机URL暴露给互联网
在本地开发对接第三方服务的时候,对方有的时候会要求我们提供一个线上的URL地址.例如微信登录 1.下载ngrok https://ngrok.com/download 顺便注册一个账号(使用GitHu ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
- Newtonsoft.Json日常用法
原文链接:https://www.cnblogs.com/ZengJiaLin/p/9578794.html
- Python廖雪峰学习笔记——单元测试
定义:对一个模块.一个类.一个函数进行进行正确性检验的测试性工作.当我们对函数或者模块等进行修改时,单元测试就显得尤为重要. 单元测试 = 测试用例(用来测试的数据)+测试模块
- 974. Subarray Sums Divisible by K
Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...
- 【bug记录】jpa 解决org.hibernate.lazyinitializationexception could not initialize proxy - no session
前言 最近开发项目比较忙,Spring Cloud的笔记得稍稍放放了,下午出来个bug,恶心的不行,功能很简单,也没有什么级联或复杂的映射关系,就是一直在报三个异常 Caused by: com.fa ...
- iOS pods更新失败
――― TEMPLATE END ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― [!] Oh no, an erro ...