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

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 21:30:18
字體:
來源:轉載
供稿:網友

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

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

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

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

復制代碼 代碼如下:

<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>
//以下部分為路徑搜索算法部分,與表現層無關

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

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

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

//路徑搜索,給出兩個點,搜索出通路
//通路用可連通的點表示
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; 
  }
 }
 //通過分析連連看中兩點之間的位置關系,逐步由簡到難分析每一種類型
 //第一種類型, 兩點是否在一條直線上,而且兩點之間可直線連通
 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軸,則自左至右掃描可能的路徑,
 //每次構造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軸,則自上至下掃描可能的路徑,
 //每次構造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];
   }
  }
 }
 //第四種類型, 兩點不在一條直線上。
 //先縱向掃描可能的路徑
 //同樣,每次構造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;
 }
}
//以下部分為表現層部分,包括繪圖, 初始化矩陣, 綁定鼠標事件...
function $(id){return document.getElementById(id)}

var t1, t2;//測試用
//圖片基路徑
var IMG_PATH = '//www.49028c.com';
//初始化
function init(){
 //構造圖片庫
 var imgs = new Array(30);
 for(var i=1; i<=30; i++){
  imgs[i] = 'r_' + i + '.gif';
 }
 tbl = $('tbl');
 //構造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);
  }
 }
 //構造矩陣
 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);//產生隨機位置用
 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>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线精品av| 欧美又大粗又爽又黄大片视频| 日韩中文字幕网站| 亚洲石原莉奈一区二区在线观看| 国产极品jizzhd欧美| 中文字幕亚洲一区在线观看| 国产精品视频久久| 亚洲欧美第一页| 欧美日韩黄色大片| 中文字幕欧美在线| 91影视免费在线观看| 久久久久成人网| 久99久在线视频| 91精品久久久久久久| 国产激情久久久| 一区二区欧美亚洲| 日韩专区在线观看| 国产美女精品视频| 久久国产精品久久久| 亚洲毛茸茸少妇高潮呻吟| 欧美怡红院视频一区二区三区| 中文字幕日韩综合av| 黑人巨大精品欧美一区二区一视频| 欧美激情视频一区| 黑人巨大精品欧美一区免费视频| 亚洲女成人图区| 日韩福利在线播放| 欧美激情亚洲自拍| 国产精品白丝av嫩草影院| 国产视频在线一区二区| 久久久人成影片一区二区三区| 国产美女搞久久| 欧美一区二区三区免费观看| 成人激情视频在线观看| 国产精品旅馆在线| 2019中文字幕在线观看| 97精品国产97久久久久久免费| 亚洲女人天堂成人av在线| 国产高清在线不卡| 欧美成人h版在线观看| 91在线视频精品| 91夜夜未满十八勿入爽爽影院| 久久91亚洲精品中文字幕奶水| 国产一区二区三区视频免费| 在线观看日韩专区| 亚洲国产精品va在线观看黑人| 国产精品嫩草影院一区二区| 亚洲a∨日韩av高清在线观看| 国产精品久久久久久久久久小说| 黄色一区二区在线观看| 亚洲福利视频二区| 欧美激情欧美狂野欧美精品| 51久久精品夜色国产麻豆| 亚洲视频网站在线观看| 国产91色在线播放| 性金发美女69hd大尺寸| 欧美精品www在线观看| 日韩激情av在线免费观看| 亚洲欧美综合区自拍另类| 在线视频亚洲欧美| 欧美黑人一级爽快片淫片高清| 国产+人+亚洲| 精品久久久久国产| 深夜精品寂寞黄网站在线观看| 欧美精品videosex性欧美| 国产精品久久激情| 91视频88av| 国产亚洲精品激情久久| 日韩成人在线网站| 91av在线看| 波霸ol色综合久久| 国产欧美一区二区三区在线看| 久久影视电视剧免费网站清宫辞电视| 欧美自拍视频在线| 久久国产精品久久国产精品| 日韩一区av在线| 伊人久久久久久久久久| 不卡伊人av在线播放| 亚洲免费av电影| 青青草成人在线| 97在线观看视频国产| 亚洲专区中文字幕| 久久精品亚洲94久久精品| 日韩欧美视频一区二区三区| 性欧美激情精品| 久久亚洲一区二区三区四区五区高| 久久久视频免费观看| 91系列在线观看| 秋霞成人午夜鲁丝一区二区三区| 亚洲香蕉伊综合在人在线视看| 欧美激情欧美狂野欧美精品| 国内精品久久久久久影视8| 成人动漫网站在线观看| 高潮白浆女日韩av免费看| 亚洲第一区在线观看| 成人黄色av免费在线观看| 欧美插天视频在线播放| 亚洲精品福利视频| 91在线观看免费高清完整版在线观看| 国产亚洲一区精品| 日韩av在线一区二区| 久久久久国产一区二区三区| 国产精品一区二区三区在线播放| 日韩在线观看你懂的| 91精品国产自产在线观看永久| 欧美成人午夜影院| 欧美日韩中文字幕综合视频| 亚洲电影免费观看| 亚洲人成在线播放| 欧美—级a级欧美特级ar全黄| 日韩免费观看在线观看| 人人澡人人澡人人看欧美| 亚洲欧洲一区二区三区在线观看| 欧美激情免费视频| 国产精品久久久999| 久久精品电影一区二区| 久久网福利资源网站| 欧美日韩另类视频| 亚洲福利视频久久| 日韩视频欧美视频| 欧美在线视频网站| 91在线视频导航| 欧美在线视频网站| 成人午夜在线观看| 日韩在线观看av| 一本色道久久88亚洲综合88| 久久久精品国产一区二区| 2019中文字幕在线免费观看| 国产欧美va欧美va香蕉在| 欧美精品午夜视频| 亚洲一二三在线| 97超碰蝌蚪网人人做人人爽| 97精品国产97久久久久久免费| 久久人人爽人人爽人人片av高请| 亚洲国产精品国自产拍av秋霞| 91精品国产91久久久久久| 亚洲欧美日韩国产精品| 成人精品视频99在线观看免费| 91免费版网站入口| 欧美午夜精品在线| 亚洲精品一区久久久久久| 欧美成人在线免费| 欧美乱人伦中文字幕在线| 亚洲精品在线视频| 欧美裸体xxxx极品少妇软件| 久精品免费视频| 庆余年2免费日韩剧观看大牛| 久久久久久久久久久国产| 日韩人在线观看| 久久成人国产精品| 久久97久久97精品免视看| 国产午夜精品美女视频明星a级| 91精品久久久久久| 欧美三级免费观看| 精品自在线视频| 亚洲免费成人av电影| 亚洲人成啪啪网站| 欧美精品久久久久久久久| 国产亚洲一区二区精品| 日本欧美一二三区| 欧美国产第一页| 综合国产在线观看| 中文字幕日韩在线播放| 91av成人在线|