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

首頁 > 編程 > JavaScript > 正文

JS連連看源碼完美注釋版(推薦)

2019-11-20 21:30:18
字體:
供稿:網(wǎng)友

閑來無事,也寫一個javascript連連看,注釋比較完整,想學的朋友可要看了。

連連看最難的部分應(yīng)該是路徑搜索,即鼠標點的兩點之間看有無可通的路徑。 看過有人寫的遞歸寫法,心里癢癢,就捉摸了一下,發(fā)現(xiàn)不用遞歸的情況下難度也不大。

路徑搜索由簡到難分析,先分析一條直線上是否可直線連通,再分析一條直線上的兩點通過拐兩個彎是否可通,最后分析不在一條直線上的情況.

在IE6, IE8, firefox3.0.3下測試過.

復(fù)制代碼 代碼如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS連連看源碼完美注釋版</title>
</head>
<style>
 table{
  border-collapse: collapse;
 }
 td{
  border: solid #ccc 1px;
  height: 36px;
  width: 36px;
  cursor: pointer;
 }
 td img{
   height: 30px;
   width: 30px;
   border: solid #fff 3px;
   /*
   filter: alpha(opacity=80);
   -moz-opacity: 0.8;
   opacity: 0.8;
   */
 }

</style>
<script>
//以下部分為路徑搜索算法部分,與表現(xiàn)層無關(guān)

//全局變量
var X = 16;//總行數(shù)
var Y = 14;//總列數(shù)
var types = 15;//圖形種類

//布局矩陣
//為了算法方便,矩陣的第一行,第一列,最后一行,最后一列都標注為0,天然通路。
var arr = new Array(Y);
var tbl;//顯示布局的table元素

var p1 = null;//搜索路徑用的第1個點的坐標
var p2 = null;//搜索路徑用的第2個點的坐標
var e1 = null;//第1個點對應(yīng)的元素
var e2 = null;//第2個點對應(yīng)的元素

//路徑搜索,給出兩個點,搜索出通路
//通路用可連通的點表示
function getPath(p1, p2){
 //開始搜索前對p1,p2排序,使p2盡可能的在p1的右下方。
 //這樣做可以簡化算法
 if(p1.x>p2.x){
  var t = p1;
  p1 = p2;
  p2 = t; 
 }
 else if(p1.x==p2.x){
  if(p1.y>p2.y){
   var t = p1;
   p1 = p2;
   p2 = t; 
  }
 }
 //通過分析連連看中兩點之間的位置關(guān)系,逐步由簡到難分析每一種類型
 //第一種類型, 兩點是否在一條直線上,而且兩點之間可直線連通
 if((onlineY(p1, p2)||onlineX(p1, p2)) && hasLine(p1, p2)){
  status = 'type 1';
  return [p1,p2];
 }
 //第二種類型, 如果兩點中任何一個點被全包圍,則不通。
 if( !isEmpty({x:p1.x, y:p1.y+1}) && !isEmpty({x:p1.x, y:p1.y-1}) && !isEmpty({x:p1.x-1, y:p1.y}) && !isEmpty({x:p1.x+1, y:p1.y}) ){
  status = 'type 2';
  return null;
 }
 if( !isEmpty({x:p2.x, y:p2.y+1}) && !isEmpty({x:p2.x, y:p2.y-1}) && !isEmpty({x:p2.x-1, y:p2.y}) && !isEmpty({x:p2.x+1, y:p2.y}) ){
  status = 'type 2';
  return null;
 }
 //第三種類型, 兩點在一條直線上,但是不能直線連接
 var pt0, pt1, pt2, pt3;
 //如果都在x軸,則自左至右掃描可能的路徑,
 //每次構(gòu)造4個頂點pt0, pt1, pt2, pt3,然后看他們兩兩之間是否連通
 if(onlineX(p1, p2)){
  for(var i=0; i<Y; i++){
   if(i==p1.y){
    continue;
   }
   pt0 = p1;
   pt1 = {x: p1.x, y: i};
   pt2 = {x: p2.x, y: i};
   pt3 = p2;
   //如果頂點不為空,則該路不通。
   if(!isEmpty(pt1) || !isEmpty(pt2)){
    continue;
   }
   if( hasLine(pt0, pt1) && hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
    status = '(x:' + pt0.x + ',y:' + pt0.y + ')' + ', (x:' + pt1.x + ',y:' + pt1.y + ')' + ', (x:' + pt2.x + ',y:' + pt2.y + ')' + ', (x:' + pt3.x + ',y:' + pt3.y + ')';
    return [pt0, pt1, pt2, pt3];
   }
  }
 }
 //如果都在y軸,則自上至下掃描可能的路徑,
 //每次構(gòu)造4個頂點pt0, pt1, pt2, pt3,然后看他們兩兩之間是否連通
 if(onlineY(p1, p2)){
  for(var j=0; j<X; j++){
   if(j==p1.x){
    continue; 
   }
   pt0 = p1;
   pt1 = {x:j, y:p1.y};
   pt2 = {x:j, y:p2.y};
   pt3 = p2;
   //如果頂點不為空,則該路不通。
   if(!isEmpty(pt1) || !isEmpty(pt2)){
    continue;
   }
   if( hasLine(pt0, pt1) && hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
    status = '(x:' + pt0.x + ',y:' + pt0.y + ')' + ', (x:' + pt1.x + ',y:' + pt1.y + ')' + ', (x:' + pt2.x + ',y:' + pt2.y + ')' + ', (x:' + pt3.x + ',y:' + pt3.y + ')';
    return [pt0, pt1, pt2, pt3];
   }
  }
 }
 //第四種類型, 兩點不在一條直線上。
 //先縱向掃描可能的路徑
 //同樣,每次構(gòu)造4個頂點,看是否可通
 for(var k=0; k<Y; k++){
   pt0 = p1;
   pt1 = {x:p1.x, y:k};
   pt2 = {x:p2.x, y:k};
   pt3 = p2;
   status = '(x:' + pt0.x + ',y:' + pt0.y + ')' + ', (x:' + pt1.x + ',y:' + pt1.y + ')' + ', (x:' + pt2.x + ',y:' + pt2.y + ')' + ', (x:' + pt3.x + ',y:' + pt3.y + ')';
   //特殊情況,如果pt0和pt1重合
   if(equal(pt0,pt1)){
    //如果pt2不為空,則此路不通
    if(!isEmpty(pt2)){
     continue;
    }
    if( hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
     return [pt1, pt2, pt3];
    }
    else{
     continue;
    }
   }
   //特殊情況,如果pt2和pt3重合
   else if(equal(pt2,pt3)){
    //如果pt1不為空,則此路不通
    if(!isEmpty(pt1)){
     continue;
    }
    if( hasLine(pt0, pt1) && hasLine(pt1, pt2) ){
     return [pt0, pt1, pt2];
    }
    else{
     continue;
    }
   }
   //如果pt1, pt2都不為空,則不通
   if(!isEmpty(pt1) || !isEmpty(pt2)){
    continue;
   }
   if( hasLine(pt0, pt1) && hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
    return [pt0, pt1, pt2, pt3];
   }
 }
 //橫向掃描可能的路徑
 for(var k=0; k<X; k++){
   pt0 = p1;
   pt1 = {x:k, y:p1.y};
   pt2 = {x:k, y:p2.y};
   pt3 = p2;
   status = '(x:' + pt0.x + ',y:' + pt0.y + ')' + ', (x:' + pt1.x + ',y:' + pt1.y + ')' + ', (x:' + pt2.x + ',y:' + pt2.y + ')' + ', (x:' + pt3.x + ',y:' + pt3.y + ')';
   if(equal(pt0,pt1)){
    if(!isEmpty(pt2)){
     continue;
    }
    if( hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
     return [pt1, pt2, pt3];
    }
   }
   if(equal(pt2,pt3)){
    if(!isEmpty(pt1)){
     continue;
    }
    if( hasLine(pt0, pt1) && hasLine(pt1, pt2) ){
     return [pt0, pt1, pt2];
    }
   }
   if(!isEmpty(pt1) || !isEmpty(pt2)){
    continue;
   }
   if( hasLine(pt0, pt1) && hasLine(pt1, pt2) && hasLine(pt2, pt3) ){
    return [pt0, pt1, pt2, pt3];
   }
 }
 //status='type4';
 return null;
 /********** end type 4 **************/
}

function equal(p1, p2){
 return ((p1.x==p2.x)&&(p1.y==p2.y));
}

function onlineX(p1, p2){
 return p1.y==p2.y;
}

function onlineY(p1, p2){
 return p1.x==p2.x; 
}

function isEmpty(p){
 return (arr[p.y][p.x]==0); 
}

function hasLine(p1, p2){
 if(p1.x==p2.x&&p1.y==p2.y){
  return true; 
 }
 if(onlineY(p1, p2)){
  var i = p1.y>p2.y?p2.y:p1.y;
  i = i+1;
  var max = p1.y>p2.y?p1.y:p2.y;
  for(; i<max; i++){
   var p = {x: p1.x, y: i};
   if(!isEmpty(p)){
    break
   }
  }
  if(i==max){
   return true;
  }
  return false;
 }
 else if(onlineX(p1, p2)){
  var j = p1.x>p2.x?p2.x:p1.x;
  j = j+1;
  var max = p1.x>p2.x?p1.x:p2.x;
  for(; j<max; j++){
   var p = {x: j, y: p1.y};
   if(!isEmpty(p)){
    break
   }
  }
  if(j==max){
   return true;
  }
  return false;
 }
}
//以下部分為表現(xiàn)層部分,包括繪圖, 初始化矩陣, 綁定鼠標事件...
function $(id){return document.getElementById(id)}

var t1, t2;//測試用
//圖片基路徑
var IMG_PATH = '//www.49028c.com';
//初始化
function init(){
 //構(gòu)造圖片庫
 var imgs = new Array(30);
 for(var i=1; i<=30; i++){
  imgs[i] = 'r_' + i + '.gif';
 }
 tbl = $('tbl');
 //構(gòu)造table
 for(var row=0;row<Y-2;row++){
  var tr=tbl.insertRow(-1);
  for(var col=0;col<X-2;col++) {
   var td=tr.insertCell(-1);
  }
 }
 //構(gòu)造矩陣
 for(var i=0; i<Y; i++){
  arr[i] = new Array(X);
  for(var j=0; j<X; j++){
   arr[i][j] = 0;
  }
 }
 var total = (X-2)*(Y-2);
 var tmp = new Array(total);//產(chǎn)生隨機位置用
 for(var i=0; i<total; i++){
  tmp[i] = 0;
 }
 for(var i=0; i<total; i++){
  if(tmp[i]==0){
   var t = Math.floor(Math.random()*types) + 1;
   tmp[i] = t;
   while(true){
    var c = Math.floor(Math.random()*(total-i)) + i;
    if(tmp[c]==0){
     tmp[c] = t;
     break;
    }
   }
  }
 }
 var c = 0;
 for(var i=1; i<Y-1; i++){
  for(var j=1; j<X-1; j++){
   arr[i][j] = tmp[c++];
   tbl.rows[i-1].cells[j-1].innerHTML = '<img src="' + IMG_PATH + imgs[arr[i][j]] + '" />';
  } 
 }
 //綁定鼠標事件
  var img1, img2;
 document.body.onclick = function(e){
  var el = document.all?event.srcElement:e.target;
  if(el.parentNode.tagName!='TD'){
   return;
  }
  if(!img1){
   img1 = el;
  }
  else{
   img2 = el;
  }
  el.style.border = 'solid #3399FF 3px';
  el = el.parentNode;
  if(el.innerHTML==''){
   p1 = p2 = e1 = e2 = null;
  }
  var r = el.parentNode.rowIndex +1;
  var c = el.cellIndex +1;
  if(p1==null){
   //el.childNodes[0].style.border = 'solid #ccc 3px';
   p1 = {x:c, y:r};
   e1 = el;
  }
  else{
   p2 = {x:c, y:r};
   e2 = el;
   if(!equal(p1, p2)&&e1.innerHTML==el.innerHTML){
    var path = getPath(p1, p2);
    if(path!=null){
     e1.innerHTML = e2.innerHTML = '';
     arr[p1.y][p1.x] = arr[p2.y][p2.x] = 0;
    }
   }
   if(t1){t1.style.backgroundColor = '';}
   t1 = e1;
   if(t2){t2.style.backgroundColor = '';}
   t2 = e2;
   img1.style.border = 'solid #fff 3px';
   img2.style.border = 'solid #fff 3px';
   p1 = p2 = e1 = e2 = img1 = img2 = null;
   t1.style.backgroundColor = t2.style.backgroundColor = 'lightpink';
  }
 }
}
</script>
<body onload="init();">
 js連連看完美注釋版<br />
 <table id="tbl" cellspacing="0" cellpadding="0" border="1">
 </table>
</body>
</html>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
懂色av粉嫩av蜜乳av| 亚洲人成电影网站色xx| 欧美深性狂猛ⅹxxx深喉| 我不卡神马影院| 老司机亚洲精品一区二区| 日本精品一区二区三区在线播放| 美女扒开内裤让男人桶| 国产成人免费在线| 久久精品人人做人人爽电影蜜月| 亚洲一卡2卡三卡4卡2021四卡| 成人嘿咻视频免费看| 亚洲综合色视频| av在线免费播放网站| 亚洲人成网站色ww在线| 欧美极品少妇全裸体| 欧美激情精品久久久久久小说| 成人三级视频在线观看| 欧洲国产伦久久久久久久| 欧美专区日韩专区| 黄色成年人视频在线观看| 亚洲综合丁香| 国产超级av| 三级黄色免费观看| 久久99久久久久久久噜噜| 成人黄色综合网站| 天堂va欧美va亚洲va老司机| 亚洲成人性视频| 天天在线免费视频| 99久久.com| 欧美激情一级二级三级在线视频| 手机av在线网站| 国内精品免费一区二区三区| 久久免费精品国产久精品久久久久| 久久久99999| 国产另类在线| 女同性αv亚洲女同志| 精品无人区一区二区| 在线视频精品免费| 午夜免费一区二区| 欧美绝品在线观看成人午夜影视| 视频一区国产精品| 欧日韩不卡在线视频| 婷婷国产v国产偷v亚洲高清| 国产麻豆一级片| 色婷婷综合视频在线观看| 97人人模人人爽人人喊38tv| 强乱中文字幕av一区乱码| 蜜桃视频一区二区三区| 1024在线看片你懂得| 亚洲美女视频在线| 国产精品久久久999| 日韩视频一区二区三区| 一区二区三区日本视频| 欧美第一淫aaasss性| 国产精品亚洲欧美日韩一区在线| 日韩午夜中文字幕| 日本欧美国产| 亚洲网站在线观看| 亚洲综合色视频在线观看| 97久久国产亚洲精品超碰热| 18激情网站| 国产精品久久久久久久龚玥菲| 欧美12av| 国产精品久久久久久久久久齐齐| 欧美色婷婷天堂网站| 国产欧美日韩视频在线| 波多野结衣在线播放一区| 天堂av在线8| 日韩高清免费观看| 免费福利在线观看| 亚洲男女自偷自拍| 1区不卡电影| 香蕉成人app免费看片| 国产精品麻豆成人av电影艾秋| av在线影音| 日韩精品乱码免费| 中文字幕不卡三区| 久久国产在线观看| 一区二区中文字| 人xxxx性xxxxx欧美| 欧美性xxxxxxxx| 欧美手机在线| 国产伦子伦对白在线播放观看| 国产精品高潮粉嫩av| 国产综合色精品一区二区三区| 天堂av中文在线资源库| 在线日本中文字幕| 一区二区三区四区高清精品免费观看| 1000部精品久久久久久久久| 九9re精品视频在线观看re6| 国产特级黄色录像| 国内一区二区三区| 国产乱子伦一区二区三区国色天香| 羞羞视频网站在线免费观看| 中字幕一区二区三区乱码| 久久资源免费视频| 清纯唯美亚洲综合一区| 97国产成人高清在线观看| 日韩成人黄色| 日韩午夜在线| 色婷婷av一区二区三区久久| 热久久天天拍国产| 久久久亚洲影院| 一区二区三区在线视频免费观看| 欧美日韩中国免费专区在线看| 亚洲黄色在线看| 内射毛片内射国产夫妻| 男女性杂交内射妇女bbwxz| 欧美一区二区三区图| 国产精品一区二区不卡| 9191在线播放| 欧美精品欧美极品欧美激情| 成人激情综合网| 天天久久人人| 欧美精品一级二级三级| 欧美精品一区二区三区视频| 久久超碰亚洲| 麻豆国产精品官网| 日本一区二区三区视频在线| 91在线观看免费视频| 成人黄色av免费在线观看| 国产在线精品国自产拍免费| 亚洲精品中文字幕有码专区| 最新国产在线精品91尤物| 又黄又爽又色视频| 日本在线高清视频一区| 粉嫩嫩av羞羞动漫久久久| 欧美日韩国产一二| 在线不卡一区二区| 亚洲精品乱码久久久久久不卡| 亚洲女人视频| 国产中文字字幕乱码无限| 国产精品suv一区二区69| 亚洲图片欧洲图片日韩av| 6699久久国产精品免费| 亚洲av无码乱码国产精品| 狠狠色综合色区| 成人h动漫精品一区二| 欧美日韩成人在线| 久久五月情影视| 91porn在线视频| 欧美极品少妇无套实战| 国产亚洲欧美在线精品| 国产一区二区三区免费观看| 欧美性受xxxx黑人爽| 亚洲国产一二三精品无码| 日本一区二区成人在线| 国产一区二区成人久久免费影院| 亚洲成人三区| 被弄出白浆喷水了视频| 日韩高清成人| 天堂中文av| 国产51人人成人人人人爽色哟哟| 日韩在线观看一区二区三区| 欧美精品videos另类日本| 亚洲美女在线国产| 国产精品国产a| 精品人妻一区二区三区香蕉| 国模视频一区二区| 99这里有精品视频| 亚洲国产一区二区精品视频| 欧美一区二区大片| 日韩毛片在线视频| 亚洲精品国产动漫| caoporm免费视频在线| 天堂va在线高清一区| chinese叫床对白videos| 中文字幕日本一区| 成人黄色免费网站在线观看| 雨宫琴音一区二区三区| 伊人久久久久久久久久久| 国产精品久免费的黄网站| 97se亚洲国产综合自在线| 亚洲精品电影网站| 国产在线拍揄自揄拍视频| 成人一区在线看| 中文av一区二区三区| 成人av电影在线播放| 黄色大片在线观看| 国内精品400部情侣激情| 性欧美1819sex性高清大胸| 五月婷婷综合久久| 精品国产乱码久久久久久1区2区| 欧美色图亚洲自拍| 欧美福利视频在线| 男人添女荫道口图片| 丰满少妇高潮久久三区| 国产日韩av一区二区| 嫩草香蕉在线91一二三区| 日本久久综合| 午夜一区二区三区不卡视频| 久久久国产精彩视频美女艺术照福利| 97香蕉久久夜色精品国产| 国产av无码专区亚洲av| 免费日韩av电影| 污片在线观看一区二区| 石原莉奈在线亚洲三区| 一区二区三区免费在线视频| 狠狠操精品视频| 日韩免费高清视频网站| 国产乱人乱偷精品视频| 中文字幕理伦片免费看| 视频在线观看一区二区三区| 久草福利在线观看| 亚洲色诱最新| 欧美日韩亚洲自拍| 五月婷婷色综合| 亚洲free嫩bbb| 日日夜夜精品视频免费观看| 久久久精品有限公司| 国产在线观看高清视频| 99在线热播精品免费99热| 日韩精品中文字幕有码专区| 久久久久久久综合色一本| 日本道中文字幕| 在线观看av一区| 成人精品国产一区二区4080| 欧美图片一区二区| 国产模特精品视频久久久久| 日韩欧美的一区| 国产精品网站入口| 久久香蕉精品| 久热精品免费视频| 亚洲国产精一区二区三区性色| 国产日韩欧美电影| 成人高清免费在线| 一级二级三级视频| 欧美大片va欧美在线播放| 一区二区91| 91av资源在线| 丁香花电影在线观看完整版| 国产精品偷伦视频免费观看了| 久久精品99久久久久久久久| 天天摸天天操天天爽| 天天操夜夜做| 在这里有精品| 亚洲福利一二三区| 久久午夜夜伦鲁鲁片| 人妻少妇精品视频一区二区三区| caoliu在线| eeuss影院www在线观看手机| 风间由美一二三区av片| 国产免费一区二区三区香蕉精| 亚洲精品传媒| 黄色国产精品一区二区三区| 日韩av电影手机在线观看| 最新中文字幕久久| 亚洲精品一区二区三区在线观看| 欧美日韩午夜精品| 成年网站在线在免费播放| 少妇一区二区三区四区| 中文字幕人妻一区二区三区视频| 国产一区二区三区免费观看在线| 日本在线视频一区| 国产精品一区二区日韩| 久久99精品久久久久久| 国产99视频在线| 日韩欧美亚洲一二三区| 亚洲国产123| 欧美在线三级电影| 国产精品18久久久久久久久久| 欧美主播一区二区三区美女| 亚洲午夜激情在线| 91精品一区二区三区综合| 日韩中文字幕一区二区高清99| 国产精品综合一区二区| 亚洲国产一区二区三区四区| 成人午夜视频在线观看| 91在线观看下载| 免费a级在线播放| 男人网站在线观看| 久久精品国产色蜜蜜麻豆| 免费福利在线观看| 欧美性猛交xxx乱大交3蜜桃| 精品一区二区三区免费毛片爱| 日韩亚洲精品电影| 亚洲欧美电影一区二区| 日本韩国欧美中文字幕| 日本a级片久久久| 国产精品久久久久久久天堂| 欧美精品a∨在线观看不卡| 欧美人与性动交α欧美精品济南到| 国产日韩欧美自拍| 国产小视频在线| 国产亚洲欧美日韩美女| 91高清免费看| 在线视频观看91| 亚洲大胆在线| 91精品国产高清久久久久久91裸体| 亚洲国产精品成人| 日韩xxx视频| 欧美成人性福生活免费看| aa成人免费视频| 制服丝袜国产精品| 先锋影音成人资源| 亚洲一区二区视频在线| 欧美aa国产视频| 国产一级伦理片| 小草在线视频免费播放| 亚洲激情欧美激情| 美女在线观看www| 人妻大战黑人白浆狂泄| 极品尤物一区二区三区| 久久夜精品va视频免费观看| 亚洲高清一区二| eeuss草民免费| 日韩一级大片| 无码无套少妇毛多18pxxxx| 国产在成人精品线拍偷自揄拍| 国产精品污www一区二区三区| 午夜影院免费在线观看| 一区在线播放视频| 先锋av资源色| 裸体裸乳免费看| 欧美精品七区| 日韩国产欧美在线观看| 天堂精品中文字幕在线| 国产精品特级毛片一区二区三区| 亚洲在线观看免费视频| 最新黄色网址在线观看| 日本黄色免费在线观看| 另类的小说在线视频另类成人小视频在线| 久热久热免费视频中文字幕777| 色噜噜狠狠狠综合欧洲色8| 群体交乱之放荡娇妻一区二区| 精品国内亚洲在观看18黄| 91色综合久久久久婷婷| 欧美日韩大片|