連連看所要求的是:
1:兩個目標是相同的
2:兩個目標之間連線線的折點不超過兩個。(連線線由x軸和y軸的平行線組成) 那麼分析一下連線的情況可以看到,一般分三種情況
1:直線相連 2:乙個折點 3:兩個折點 如圖:
可以發現,如果有折點,每個折點必定有且至少有乙個座標(x或者y)是和其中乙個目標點是相同的,也就是說,折點必定在兩個目標點所在的x方向或y方向的直線上。
所以設計思路就是:
假設目標點 p1 , p2 ,如果有兩個折點分別為z1 , z2 那麼,所要進行的是
1:如果驗證p1 , p2 直線連線,則連線成立
2:搜尋以p1,p2的x,y方向四條直線(可能某兩條直線會重合)上的有限點,每次取兩點作為z1,z2 ,驗證p1到z1/z1到z2/z2到p2 是否都能直線相連 ,是則連線成立。(如果z1=z2也就是只有乙個折點嘍,對判斷沒影響)
那麼程式演算法上,這裡先就理論進行乙個試驗
var mmap=new array();
mmap[0]=new array(0,0,0,0,0,0);
mmap[1]=new array(0,1,2,8,1,0);
mmap[2]=new array(0,5,5,4,3,0);
mmap[3]=new array(0,4,6,7,3,0);
mmap[4]=new array(0,8,2,6,7,0);
mmap[5]=new array(0,0,0,0,0,0);
p1=new array(1,4);
p2=new array(1,2);
//定義乙個二維陣列作為遊戲的映像,相同的數字代表相同的圖示,0是空處,p1,p2是選擇的點 linelink=function(o1,o2)else
}else }
// 上面這個函式是判斷任意兩個點是否能直線連線(中間的點全為0) var parr=new array();
pickpoint=function(q1,q2)
if(linelink(p1,p2))else }
} }
return false; }
//上面這個函式是校驗兩個目標點是否相連,
//先判斷是否同類點,再判斷是否直線相連,最後搜尋parr裡的每對折點是否使目標點相連 pickpoint(p1,p2); //取得parr陣列
trace(islink(p1,p2)); //測試p1,p2是否相連
連連看演算法
前幾天看了下a 演算法,發現並不能實現連連看。a 演算法是尋找最短路徑的一種高效率的演算法,而連連看的路徑並不一定是最短的。連連看的路徑最多只能轉折3次,因此判斷兩點的可延伸點是否有重複的,如果有,折為0或1 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...
連連看演算法
分類判斷法 這裡實質上是一種遞迴的思想,要判斷a與b能否通過一條有n個轉角的路徑相連,可以轉化為判斷能否找到c,c與a能直線相連,且c與b能用一條有n 1個轉角的路徑相連。若這樣的c存在,那麼a與b就可以通過一條有n個轉角的路徑相連。根據轉角數不得超過2個的規則,我們可以分為轉角數分別為0個 1個 ...
連連看 演算法筆記
這幾天都沒有更新blog,正在用休息時間編寫乙個連連看的小遊戲,目前已經完成,還在測試階段,準備加如點背景 和效果.測試完成後再發布遊戲 象連連看這類遊戲,就是最短路徑求解,演算法要求如下 乙個int 型別的2維陣列,定義為 public const int tilerowcount 19 publ...