亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript實現的拼圖算法分析

2024-05-06 16:48:06
字體:
來源:轉載
供稿:網友

本文實例分析了JavaScript實現的拼圖算法。分享給大家供大家參考,具體如下:

學了html5的拖拽事件,相信做出一款小小的拼圖游戲也不難吧。就來說一下怎么用drag事件完成拼圖游戲吧,當然html5的新方法在IE下是不兼容的。這里我把這個拼圖游戲封裝成一個小插件,感興趣的話可以直接copy來用,使用方法很簡單。

HTML,3個div里面什么都不用寫,分別是用來放拼圖,參照圖,拼圖面吧的。

<div id="selectpanel"></div><div id="orginalimg"></div><div id="mathpanel"></div>

CSS,這里CSS基本不用寫,要寫的話可以把margin和padding歸0,最好還是寫一下。

*{margin: 0;padding: 0;}

重點javascript腳本(封裝部分)

function Puzzle(imgWidth,imgHeight,cuttingoffX,cuttingoffY,img){  var selectPanel=document.getElementById("selectpanel");//拼圖面板  var mathPanel=document.getElementById("mathpanel");//拼圖匹配面板  var orginalImg=document.getElementById("orginalimg");//參照圖面板  selectPanel.style.cssText='width: auto;height: auto;border: 2px solid black;overflow: hidden;float: left;margin: 10px;';  mathPanel.style.cssText='width: auto;height: auto;border: 2px solid black;overflow: hidden;float: right;margin: 10px;';  var amount=(imgWidth/cuttingoffX)*(imgHeight/cuttingoffY);//根據自定義每塊拼圖的寬高,計算拼圖的總數量  var jsonPosition=[];  for(var i=0;i<amount;i++){//一個數組模擬成一個二維矩陣,用json來存這個矩陣,并且每個位置給它一個匹配值M    jsonPosition[i]={X:i%(imgWidth/cuttingoffX),Y:parseInt(i/(imgHeight/cuttingoffY)),M:i};  }  for(var c=0;c<amount;c++){//隨機生成拼圖位置    var divImg=document.createElement("div");    divImg.style.width=cuttingoffX+"px";    divImg.style.height=cuttingoffY+"px";    divImg.style.backgroundImage="url(img/"+img+")";    divImg.style.backgroundRepeat="no-repeat";    divImg.style.border="1px dashed gray";    divImg.style.float="left";    divImg.style.cursor="pointer";    if(c%(imgWidth/cuttingoffX)==0&&c!=0)    divImg.style.clear="left";    var rendomPositon=jsonPosition.splice(Math.floor(Math.random()*jsonPosition.length),1)[0];    divImg.style.backgroundPosition=rendomPositon['X']*(-cuttingoffX)+'px'+' '+rendomPositon['Y']*(-cuttingoffY)+'px';    divImg.draggable="true";    divImg.maths=rendomPositon["M"];    selectPanel.appendChild(divImg);  }  for(var c=0;c<amount;c++){//生成拼圖匹配面板    var divEmpty=document.createElement("div");    divEmpty.style.width=cuttingoffX+"px";    divEmpty.style.height=cuttingoffY+"px";    divEmpty.style.border="1px solid gray";    divEmpty.style.float="left";    if(c%(imgWidth/cuttingoffX)==0&&c!=0)    divEmpty.style.clear="left";    divEmpty.maths=c;    mathPanel.appendChild(divEmpty);  }  var orginalImgWidth=document.body.clientWidth-(selectPanel.offsetWidth+selectPanel.offsetLeft+10)*2;  orginalImg.style.cssText="width: "+orginalImgWidth+"px;height:"+orginalImgWidth+"px;position:absolute;left:50%;margin-left:"+(-orginalImgWidth/2)+"px;top:10px;";  orginalImg.style.background="url(img/"+img+") no-repeat 0 0";  orginalImg.style.backgroundSize=orginalImgWidth+"px "+orginalImgWidth+"px";  var divImgs=selectPanel.getElementsByTagName("div");  var divEmptys=mathPanel.getElementsByTagName("div");  for(var e=0;e<divImgs.length;e++){    divImgs[e].ondragstart=function(event){//鼠標開始拖拽拼圖,并且拿到它的匹配值maths      var event=event||window.event;      event.dataTransfer.setData("math",this.maths);    }    divImgs[e].ondrag=function(){    }    divImgs[e].ondragend=function(){    }    divEmptys[e].ondragenter=function(){      this.style.backgroundColor="red";    }    divEmptys[e].ondragover=function(event){//取消在拼圖匹配面板的默認事件,否則ondrop無效      return false;    }    divEmptys[e].ondragleave=function(){      this.style.backgroundColor="transparent";    }    divEmptys[e].ondrop=function(event){//拖拽的拼圖在匹配面板放下時執行函數      var event=event||window.event;      this.style.backgroundColor="transparent";      if(event.dataTransfer.getData("math")==this.maths){//判斷拼圖傳過來的maths匹配值是否和匹配面板的maths一樣,如果是則匹配成功        for(var i=0;i<divImgs.length;i++){          if(divImgs[i].maths==this.maths){            this.style.backgroundImage=divImgs[i].style.backgroundImage;            this.style.backgroundRepeat=divImgs[i].style.backgroundRepeat;            this.style.backgroundPosition=divImgs[i].style.backgroundPosition;            divImgs[i].setAttribute("draggable","false");            divImgs[i].style.background="none";          }        }      }    }  }}//瀏覽器窗口發生變化時的圖片處理window.onresize=function(){  var selectPanel=document.getElementById("selectpanel");  var orginalImg=document.getElementById("orginalimg");  var orginalImgWidth=document.body.clientWidth-(selectPanel.offsetWidth+selectPanel.offsetLeft+10)*2;  orginalImg.style.width=orginalImg.style.height=orginalImgWidth+"px";  orginalImg.style.marginLeft=-orginalImgWidth/2+"px";  orginalImg.style.backgroundSize=orginalImgWidth+"px "+orginalImgWidth+"px";}

javascript腳本(調用方法)

window.onload=function(){  //圖的原始寬度(原圖寬),圖的原始高度(原圖高),自定每塊拼圖的寬度(能被原圖寬整除),自定每塊拼圖的高度(能被原圖高整除),圖片名(需放在img下)  Puzzle(500,500,125,125,"haqi.jpg");}

這里直接調用Puzzle這個函數哦,要注意的是,前面兩個參數一定要為圖片原始的寬高,而且為了效果更好的橫屏拼圖展示,這個圖片的寬度啊最好小于屏幕橫分辨率的1/2,多出來的話用photoshop調一下圖片尺寸也是可以的。還有一個最重要的是,自定義每塊小拼圖的寬高一定是能被原始圖片寬高整除的。說白了就是,第3個參數能被第1個參數整除,第4個參數能被第2個參數整除。最后一個參數就是圖片名了,而且這個圖片是放在img下的。

下面就來看看初始化拼圖游戲的效果,而且每次刷新頁面,拼圖面板的小圖都是隨機排列的。這個狗狗的圖大小是500x500,每個小圖切割寬高為125x125,所以拼圖排列是500/125*500/125=16,就是四行四列吧=>4x4,當然這個參數是可以改的,每個小拼圖的寬高越小,它切出來的圖就越多。

JavaScript,拼圖算法

為了凸顯這個函數的靈活性,下面再換種參數進行調用。

window.onload=function(){  //圖的原始寬度(原圖寬),圖的原始高度(原圖高),自定每塊拼圖的寬度(能被原圖寬整除),自定每塊拼圖的高度(能被原圖高整除),圖片名(需放在img下)  Puzzle(500,500,100,100,"beauty.jpg");}

換成了一張500x500的美女圖,切割寬高為100x100

JavaScript,拼圖算法

試玩一波游戲先:(為了展示效果降低游戲難度)

JavaScript,拼圖算法

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜美腿精品国产二区| 日韩国产欧美精品一区二区三区| 热久久99这里有精品| 国产精品激情自拍| 亚洲最大激情中文字幕| 国产精品美腿一区在线看| 91免费视频网站| 国产精品羞羞答答| 精品亚洲一区二区三区在线观看| 国产在线精品自拍| 久久久成人的性感天堂| 欧美洲成人男女午夜视频| 欧美刺激性大交免费视频| 日韩激情在线视频| 国产精品美女免费视频| 久久久久久久一| 性夜试看影院91社区| 日韩av电影在线网| 中文字幕九色91在线| 在线丨暗呦小u女国产精品| 久久精品成人欧美大片| 久久久久久国产三级电影| 欧美日韩在线另类| 91网在线免费观看| 中文字幕在线观看日韩| 久久777国产线看观看精品| 久久精品国产精品| 91精品久久久久久久久久久久久| 77777少妇光屁股久久一区| 午夜精品久久久久久久男人的天堂| 美女999久久久精品视频| 在线精品国产成人综合| 少妇高潮久久久久久潘金莲| 成人性生交大片免费看小说| 日韩欧美高清在线视频| 国产成人精品在线观看| 欧美特级www| 国产999精品久久久| 欧美伦理91i| 国产欧美韩国高清| 成人精品视频99在线观看免费| 欧美国产极速在线| 国产精品久久久久久久久免费| 精品视频在线播放免| 欧美一区二区三区……| 国产专区精品视频| 亚洲xxxxx电影| 国产精品免费一区二区三区都可以| 亚洲**2019国产| 国产精品久久久久999| 性欧美xxxx| 亚洲18私人小影院| 538国产精品视频一区二区| 狠狠色噜噜狠狠狠狠97| 国产一区二区色| 日韩中文字幕在线视频播放| 亚洲精品在线视频| 久久九九免费视频| 91丨九色丨国产在线| 7m第一福利500精品视频| 亚洲精品福利在线观看| 午夜精品国产精品大乳美女| 国产精品久久久久高潮| 中文字幕在线精品| 日韩av一区在线| 亚洲高清福利视频| 中文字幕亚洲综合久久| 欧美最猛性xxxx| 欧美日韩国产中文精品字幕自在自线| 欧美三级免费观看| 亚洲欧美日韩天堂一区二区| 青青草原成人在线视频| 亚洲国产三级网| 亚洲色图色老头| 欧美精品aaa| 欧美日韩中文字幕日韩欧美| 97人洗澡人人免费公开视频碰碰碰| 在线日韩第一页| 亚洲精品国产综合久久| 亚洲欧美日韩国产中文| 久久久久国产精品免费网站| 尤物九九久久国产精品的特点| 97久久久免费福利网址| 91精品视频在线播放| 中文字幕不卡在线视频极品| 日韩精品视频在线观看网址| 亚洲毛茸茸少妇高潮呻吟| 国产日韩欧美影视| 亚洲日本欧美中文幕| 亚洲欧美日韩直播| 亚洲欧洲视频在线| 日韩黄在线观看| 久久99久久亚洲国产| 国产精品人成电影在线观看| 国产自产女人91一区在线观看| 伊人久久男人天堂| 国产精品丝袜高跟| 欧美高清视频在线| 欧美电影免费观看高清| 日韩av中文字幕在线免费观看| 欧美日韩午夜视频在线观看| 国产精品福利网站| 欧美性xxxxxx| 欧美性受xxxx白人性爽| 国产精彩精品视频| 中文字幕欧美日韩| 亚洲欧洲偷拍精品| 98精品国产自产在线观看| 欧美超级免费视 在线| 琪琪第一精品导航| 日韩精品在线第一页| 最近2019好看的中文字幕免费| 成人午夜高潮视频| 国产精品美女无圣光视频| 欧美电影免费观看大全| 国产精品av网站| 欧美日韩爱爱视频| 国内精品久久影院| 欧美激情按摩在线| 黄网动漫久久久| www国产精品视频| 国产精品27p| 国产在线不卡精品| 色哟哟亚洲精品一区二区| 亚洲精品电影在线| 欧美大成色www永久网站婷| 欧美激情乱人伦一区| 精品久久久久久中文字幕一区奶水| 国产日韩精品在线| 久久999免费视频| 欧美中文字幕在线| 久久精品夜夜夜夜夜久久| 欧美精品激情在线观看| 欧美视频免费在线| 成人黄色在线播放| 韩国一区二区电影| 最好看的2019年中文视频| 97视频在线免费观看| 国产一区在线播放| 中文字幕欧美日韩va免费视频| 青青久久av北条麻妃黑人| 中文字幕精品视频| 91色精品视频在线| 亚洲直播在线一区| 欧美性在线视频| 中文字幕免费精品一区高清| 亚洲国内精品视频| 国产精品xxxxx| 欧美大荫蒂xxx| 成人a级免费视频| 欧美精品在线免费| 欧美视频第一页| 91国产精品电影| 成人在线一区二区| 国语自产精品视频在线看| 亚洲精品视频免费在线观看| 日韩电视剧在线观看免费网站| 国产精品黄页免费高清在线观看| 亚洲福利视频久久| 久久精品一本久久99精品| 国产精品久久久久99| 欧美亚洲在线播放| 欧美最猛性xxxxx亚洲精品| 最近2019中文字幕第三页视频|