作者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