**
遊戲規則:很簡單,就是點中兩個互相匹配並且可以通過不多於兩個折點的折線連在一起的方塊後,這兩個方塊就可以消掉。
(說明:下面的行和列按照現實的行和列,並不是按照flash座標系的座標,請大家按需轉換)
連通演算法:
1.直連型
2.一折型
3.兩折型
下面我們來分析每一種情況:
直連型直連性又分為兩種情況:橫向直連,縱向直連。
首先是橫向檢測:
a(1,2) , b(1,7)
private function horizon(a:point,b:point):boolean
}return true;}
其次是縱向檢測:
private function vertical(a:point,b:point):boolean
}return true;}
複製**
乙個拐角的檢測
如果乙個拐角能連通的話,則必須存在c、d兩點。其中c點的橫座標和b相同,縱座標與a相同,d的橫座標與a相同,縱座標與b相同
* c(2,2) , d(4,7)
private function onecorner(a:point,b:point):boolean
//判斷d點是否有元素
if (mapdata[d.x][d.y] == 0)
else }
兩個拐角的檢測:
這個比較複雜,如果兩個拐角能連通的話,則必須存在圖中所示的連線,這些連線夾在a、b的橫、縱座標之間,這樣的線就以下這個類儲存,direct是線的方向,用0、1表示不同的方向.
line類結構如下:
package }}
從a、b點的橫縱兩個方向進行掃瞄,就是scan函式做的事情,把合適的線用linklist存起來。
判斷是否是二連型的演算法需要做兩個方向上的掃瞄:水平掃瞄和垂直掃瞄。
先看水平的,首先,要找到棋子往左右可以延伸的範圍,這裡的延伸是指左右有多少空的位置;
然後,計算水平座標上兩個棋子延伸出來的公共部分;
最後,找公共的水平座標裡有沒有可以「垂直直連」的.用圖6,7,8說明
圖(6)
圖(7)水平延伸
圖(8)求得水平延伸公共範圍
從圖(8)可以看出,左邊緣(第零列)有一對叉可以直連,所以紅色棋子是可以「二折連通」的!
private function scan(a:point,b:point):vector.
}//檢測a點,b點的右側是否能夠垂直直連
for (i = a.y; i < col;i ++ )
}//檢測a點,b點的上側是否能夠水平直連
for (var j:int = a.x; j >= 0; j -- )
}//檢測a點,b點的下側是否能夠水平直連
for (j = a.x; j < row; j ++ )
}return linklist;}
取出linklist裡面的線,測試a與b到該線的兩點是否連通
private function twocorner(a:point,b:point):boolean
for (var i:int = 0; i < ll.length; i ++ )
}else if (tmpline.direct == 0) }}
return false;}
前面的函式有以下這個總的呼叫函式來呼叫,傳入兩個點,就可以判斷這兩個點是否符合連連看的演算法了:
//總函式
private function checklink(a:point,b:point):boolean
if (a.y == b.y && vertical(a, b))
if (onecorner(a, b))
else }
連連看演算法
前幾天看了下a 演算法,發現並不能實現連連看。a 演算法是尋找最短路徑的一種高效率的演算法,而連連看的路徑並不一定是最短的。連連看的路徑最多只能轉折3次,因此判斷兩點的可延伸點是否有重複的,如果有,折為0或1 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...
連連看演算法
分類判斷法 這裡實質上是一種遞迴的思想,要判斷a與b能否通過一條有n個轉角的路徑相連,可以轉化為判斷能否找到c,c與a能直線相連,且c與b能用一條有n 1個轉角的路徑相連。若這樣的c存在,那麼a與b就可以通過一條有n個轉角的路徑相連。根據轉角數不得超過2個的規則,我們可以分為轉角數分別為0個 1個 ...
《連連看》的演算法
連連看所要求的是 1 兩個目標是相同的 2 兩個目標之間連線線的折點不超過兩個。連線線由x軸和y軸的平行線組成 那麼分析一下連線的情況可以看到,一般分三種情況 1 直線相連 2 乙個折點 3 兩個折點 如圖 可以發現,如果有折點,每個折點必定有且至少有乙個座標 x或者y 是和其中乙個目標點是相同的,...