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