作者DreamYeh (天使)
看板FCK-GARDEN
標題[星月] PTT 五子棋程式解析(四)活三死四
時間Thu Apr 3 00:05:20 2008
[星月] PTT 五子棋程式解析(四)活三死四
=============================
讓我們喘口氣,複習這個函數:
gomo_getindex(board_t ku, int x, int y, int color, int dx, int dy)
{
}
我想沒有程式基礎的棋友,可能已經昏了,但我們還是來想想
一個五子棋最基礎的問題,什麼叫做
活三、死四?
棋友們忽然清醒了!大家會馬上浮現出活三死四畫面:
活三 死四
┌┬┬┬┬┬┐ ┌┬┬┬┬┬┐
├┼┼●┼┼┤ ├┼┼●┼┼┤
├┼┼●┼┼┤ ├┼┼●┼┼┤
├┼┼●┼┼┤ ├┼┼●┼┼┤
├┼┼┼┼┼┤ ├┼┼●┼┼┤
├┼┼┼┼┼┤ ├┼┼○┼┼┤
└┴┴┴┴┴┘ └┴┴┴┴┴┘
剛剛是棋友想睡,現在輪到程式設計師想睡了,電腦根本不懂
啥叫做活三、啥叫做死四。但經由 gomo_getindex這個函數,至少
可以理解,
一顆子往某個方向連結的子力結構。
我們現在同樣算,最上面那個子,往下的子力結構
活三你會得到gomo_getindex= -1+1+2+32 = 34 (10010)
死四你會得到gomo_getindex= -1+1+2+4+8= 14
沒有任何子力連結一定會得到31 (11111)
接著,我們必須同時考慮
兩個方向啊?!這時候就是
loc = (le > ri) ?上場了
這裡是這樣定義
loc = (le > ri) ? (((le * (le + 1)) >> 1) + ri) :
(((ri * (ri + 1)) >> 1) + le);
透過這樣計算,我們可以將兩個方向所得到的子力分布,換算
成一個數值來
顯然,我們從這些子力分布,我們可以得到一個
唯一的數值,
這個數值相較於電腦,當然是
沒有任何意義的。
還需要做點「手腳」,這時候就是該靠人力了!
沒錯!我們可以針對所有的子力分布狀況,建立出一張
表來,
比方說這裡我們已經算得
loc = 35x17+31 =
626
查表即可得到style=0x33
接著我們是return (style & 0x0f);
//就直接回傳後四個bit
我們可以得到style = 3 =
活三
同樣情況對於上面那個死四,我們已經得到gomo_getindex= -1+1+2+4+8= 14
可得loc = 14 + 31x32/2 = 510 查表得0x44
同樣有style = 0x44 & 0x0f = 0004 = 死四 正確
=============================
--
— 請多指教喔!!
/\●/\ ))
(( / /▲\ \
\\
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.79.199
1F:推 minolala:辛苦辛苦 ;) ... 218.168.179.89 04/03 00:31