作者DreamYeh (天使)
看板FCK-GARDEN
標題[星月] PTT 五子棋程式解析(三)
時間Wed Apr 2 22:49:46 2008
=============================
由前面的解析,我們知道,有四、有三,是怎麼判斷?
原來是判斷dir[index] 這個陣列啊!
那這個陣列又怎麼來的呢?
我們很快注意到在該副函式中,有個
dir[i] = dirchk(ku, x, y, color, limit, i ? (i >> 1) : -1, i ? (i & 1) : 1);
很好,顯然dir[i]這個變數 來自於dirchk()
現在我們追蹤到dirchk函式裡面去
這個函式相當複雜!我們一段一段解析
dirchk(board_t ku, int x, int y, int color, int limit, int dx, int dy)
{
int le, ri, loc, style = 0;
le = gomo_getindex(ku, x, y, color, -dx, -dy);
//往反方向查有多少子連結
ri = gomo_getindex(ku, x, y, color, dx, dy);
//正向查詢有哪些子連結
loc = (le > ri) ? (((le * (le + 1)) >> 1) + ri) :
(((ri * (ri + 1)) >> 1) + le);
//恩...這裡就 快看不懂了
//大致上是要把算出兩個方向得到的
//值進行一個綜合計算
style = pat_gomoku[loc]; //問題在這個陣列
if (limit == 0) //如果是無禁情況
return (style & 0x0f);
//就直接回傳後四個bit
style >>= 4;
//右偏移4bits
if ((style == 3) || (style == 2))
{ //如果有三或四...........?!
}
return style;
}
在看到最精采的部分前,先讓我們回頭來看看這邊在寫些什麼。
我們最終結果是要得到一顆子所在方位,是構成活三、死三什麼子力結構的。
但這過程是複雜的,因為這邊雖然已經有方位,但那畢竟代表著一條線
上的子力分布,我們還要考慮兩個方向呢!
於是忽我們分別計算le跟ri,在利用後面函式進行綜合計算。
計算出
loc,在使用查表計算,才可以判斷出一顆子是否構成三或四
但又要怎麼判斷出一顆子是三,還是四呢?
我們注意到這個函數:
gomo_getindex(board_t ku, int x, int y, int color, int dx, int dy)
{
int i, k, n;
for (n = -1, i = 0, k = 1; i < 5; i++, k*=2) {
x += dx;
y += dy;
if ((x < 0) || (x >= BRDSIZ) || (y < 0) || (y >= BRDSIZ)) {
n += k; break;
//撞牆的時候
} else if (ku[x][y] != BBLANK) {
n += k;
if (ku[x][y] != color) break;
//碰到不同色子的話
}
}
if (i >= 5) n += k;
return n;
}
我們這邊看到一個移位概念,k*=2 我們很快聯想到這個函數傳回值
似乎代表著
以 (x,y) 為起點,方向 (dx,dy),傳回以 bit 表示相鄰哪幾格有子
如 10111 表示該方向相鄰 1,2,3 有子, 4 空地
最高位 1 表示對方的子, 或是牆
舉例:
2
├┼┼┼┼┼┤
1
├○○○┼○┤
└┴┴┴┴┴┘ 現在返回座標2,1
a 求函數gomo_getindex(KU,2,1,White, 1,0)
代表著求2,1這個座標上,往右(由於dx=1 dy=0)
顏色為白,求相鄰狀況?
傳回值為 1 1 0 1 1
^第一格有子,即圖上a位
^第二格
^第三格沒有子
=============================
--
— 請多指教喔!!
/\●/\ ))
(( / /▲\ \
\\
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.79.199
1F:推 minolala:超級辛苦;) 218.168.179.89 04/03 00:31