圖算法在連連看上的應用

數字化和佈局算法

  首先,我們知道每種棋子有 4 個,我們可以先按順序把每種棋子排好,然後再隨機取其中兩個棋子交換一下,多次交換後,棋子就是亂的了。參考下面兩圖,圖中用 4 種顏色表示 4 種棋子:

 

(1)初始排布

 

(2)多次隨機交換兩個棋子後

  實際上程序內部是不需要認識棋子的圖象的,只需要用一個 ID 來表示,界面上畫出來的棋子圖形是根據 ID 取資源裏的圖片畫的。比如上圖中用 4 種顏色表示 4 種棋子,我們可以定義紅色棋子的 ID 爲 0,綠色爲 1,藍色爲 2,黃色爲 3。另外,如果棋子被消除 ID 可以定義爲 -1。把 ID 放在一個二維矩陣,畫到界面上時,根據距陣裏元素的位置和值(ID)決定在什麼位置畫什麼顏色棋子。

  我見過兩種風格的連連看,有一種是和我寫的水晶連連看一樣,連線可以伸到棋子矩行外面,比如圖(2)中的第一行有兩個紅色棋子,這兩個是可以連的;另外一種和 QQGame 裏的連連看一樣,連線不能伸到棋子矩行外面,也就是說圖(2)中的第一行的兩個紅色棋子是不能連的。程序內部棋子都是數字,這兩種風格的差別在於 ID 距陣的大小,第一種是:(行數 + 2) * (列數 + 2);第二種是:行數 * 列數,這更簡單,所以下面只說第一種。

  (行數 + 2) * (列數 + 2) 的距陣,邊界上都是 -1(也可以定義爲別的,比如 -2),即留了空位給連線通過,而且這些空位不能安排任何棋子,在有些“關”的時候,棋子會移動,也不可以移動到邊界的空位上!參考圖(3),其中灰色表示邊界空位,灰色邊界內部是棋盤:

 

(3)棋盤矩陣化

 

(4)棋子數字化

連通算法

  (1)直連型:太簡單不說了。

  (2)一折型:其實相當於兩個棋子劃出一個矩形,這兩個棋子是一對對角頂點,另外兩個頂點如果可以同時和這兩個棋子直連,那就說明可以“一折連通”。見圖(5)兩個紅色棋子的連通情況,右上角打叉的位置就是折點。

(5)一折型示例

  (3)二連型:這個是重點,其實用人眼來觀察很簡單的,就是有些人沒意識到規律,雖然網絡上有很多代碼,但是比較難看懂,所以我才寫了本文。見圖(6)兩個紅色棋子的連通情況:

(6)二折型示例

  判斷是否是二連型的算法需要做兩個方向上的掃描:水平掃描和垂直掃描。先看水平的,首先,要找到棋子往左右可以延伸的範圍,這裏的延伸是指左右有多少空的位置;然後,計算水平座標上兩個棋子延伸出來的公共部分;最後,找公共的水平座標裏有沒有可以“垂直直連”的。用圖(6)(7)(8)說明:

 

 

(3)棋盤矩陣化

 

(7)水平延伸

 

(8)求得水平延伸公共範圍

  從圖(8)可以看出,左邊緣(第零列)有一對叉可以直連,所以紅色棋子是可以“二折連通”的!接着再看垂直掃描:

 

 

(3)棋盤矩陣化

 

(9)垂直延伸

 

(10)求得垂直延伸公共範圍

  從圖(10)可以看出,上邊緣(第零行)有一對叉可以直連,第二行也有一對,所以紅色棋子是可以“二折連通”的!

  仔細一想,其實這個算法也適合“直連型”和“一折型”的,它們都是“二折型”的特例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章