JavaScript實現(xiàn)的拼圖算法分析
本文實例分析了JavaScript實現(xiàn)的拼圖算法。分享給大家供大家參考,具體如下:
學(xué)了html5的拖拽事件,相信做出一款小小的拼圖游戲也不難吧。就來說一下怎么用drag事件完成拼圖游戲吧,當(dāng)然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);//根據(jù)自定義每塊拼圖的寬高,計算拼圖的總數(shù)量 var jsonPosition=[]; for(var i=0;i<amount;i++){//一個數(shù)組模擬成一個二維矩陣,用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){//鼠標(biāo)開始拖拽拼圖,并且拿到它的匹配值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){//取消在拼圖匹配面板的默認(rèn)事件,否則ondrop無效 return false; } divEmptys[e].ondragleave=function(){ this.style.backgroundColor="transparent"; } divEmptys[e].ondrop=function(event){//拖拽的拼圖在匹配面板放下時執(zhí)行函數(shù) 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"; } } } } } } //瀏覽器窗口發(fā)生變化時的圖片處理 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腳本(調(diào)用方法)
window.onload=function(){ //圖的原始寬度(原圖寬),圖的原始高度(原圖高),自定每塊拼圖的寬度(能被原圖寬整除),自定每塊拼圖的高度(能被原圖高整除),圖片名(需放在img下) Puzzle(500,500,125,125,"haqi.jpg"); }
這里直接調(diào)用Puzzle這個函數(shù)哦,要注意的是,前面兩個參數(shù)一定要為圖片原始的寬高,而且為了效果更好的橫屏拼圖展示,這個圖片的寬度啊最好小于屏幕橫分辨率的1/2,多出來的話用photoshop調(diào)一下圖片尺寸也是可以的。還有一個最重要的是,自定義每塊小拼圖的寬高一定是能被原始圖片寬高整除的。說白了就是,第3個參數(shù)能被第1個參數(shù)整除,第4個參數(shù)能被第2個參數(shù)整除。最后一個參數(shù)就是圖片名了,而且這個圖片是放在img下的。
下面就來看看初始化拼圖游戲的效果,而且每次刷新頁面,拼圖面板的小圖都是隨機排列的。這個狗狗的圖大小是500x500,每個小圖切割寬高為125x125,所以拼圖排列是500/125*500/125=16,就是四行四列吧=>4x4,當(dāng)然這個參數(shù)是可以改的,每個小拼圖的寬高越小,它切出來的圖就越多。
為了凸顯這個函數(shù)的靈活性,下面再換種參數(shù)進行調(diào)用。
window.onload=function(){ //圖的原始寬度(原圖寬),圖的原始高度(原圖高),自定每塊拼圖的寬度(能被原圖寬整除),自定每塊拼圖的高度(能被原圖高整除),圖片名(需放在img下) Puzzle(500,500,100,100,"beauty.jpg"); }
換成了一張500x500的美女圖,切割寬高為100x100
試玩一波游戲先:(為了展示效果降低游戲難度)
PS:這里給大家推薦一款相似的在線工具供大家參考:
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
JavaScript正則表達式校驗與遞歸函數(shù)實際應(yīng)用實例解析
這篇文章主要介紹了JavaScript正則表達式校驗與遞歸函數(shù)實際應(yīng)用,需要的朋友可以參考下2017-08-08JavaScript實現(xiàn)QQ聊天消息展示和評論提交功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)QQ聊天消息展示和評論提交功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05JavaScript中forEach和map方法的使用與區(qū)別
眾所周知map和forEach是數(shù)組的操作方法,下面這篇文章主要給大家介紹了關(guān)于JavaScript中forEach和map方法的使用與區(qū)別,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02解決微信授權(quán)成功后點擊按返回鍵出現(xiàn)空白頁和報錯的問題
這篇文章主要介紹了解決微信授權(quán)成功后點擊按返回鍵出現(xiàn)空白頁和報錯的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06微信小程序?qū)崿F(xiàn)發(fā)送驗證碼按鈕效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)發(fā)送驗證碼按鈕效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12