1.局面情况
眠二,眠三,冲四,活二,活三,活四,五连,双四,四三,三三。
其中眠二表示有两个相连的棋子,有一边被堵,眠三跟冲四也是如此。活三表示三个相连的棋子(或两个相连空一格后再连一棋子)没被堵。双四表示两个四子相连,三三表示两个活三。因为先手必胜,一般比赛时黑子有禁手,包括双四禁;三三禁;四三三禁手,即黑方一步使一个四,两个活三同时形成 ;四四三禁手,即黑方一步使两个四,一个活三同时形成 ;长连禁手 黑方超过5个子连在一起 。禁手图例如下:
2.局面分数估计
一般五子棋采用15*15的棋盘,越中心的位置价值越大,我们用数组
PosValue[15][15]
记录棋盘位置的价值。
int PosValue[GRID_NUM][GRID_NUM]=
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,1,2,2,2,2,2,2,2,2,2,2,2,1,0},
{0,1,2,3,3,3,3,3,3,3,3,3,2,1,0},
{0,1,2,3,4,4,4,4,4,4,4,3,2,1,0},
{0,1,2,3,4,5,5,5,5,5,4,3,2,1,0},
{0,1,2,3,4,5,6,6,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,7,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,6,6,5,4,3,2,1,0},
{0,1,2,3,4,5,5,5,5,5,4,3,2,1,0},
{0,1,2,3,4,4,4,4,4,4,4,3,2,1,0},
{0,1,2,3,3,3,3,3,3,3,3,3,2,1,0},
{0,1,2,2,2,2,2,2,2,2,2,2,2,1,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
用数组
TypeCount[2][20]
记录黑白子的局面情况,用数组
TypeRecord[15][15][4]
记录棋盘上每个位置在左斜,右斜及垂直和水平四个方向的连接情况。
胜负判定(不采用禁手):当黑方连有五子时,返回一个大的负值,黑胜;当白方连有五子时,返回一个大的正值,白胜。如果轮到白方走棋:如果白棋有冲四或活四或者有活三而且黑棋没有冲四,则白胜;如果黑棋有活四或四三或两个活三而且白棋没有三(活三或眠三),则黑胜;当没有胜负时,分别用变量
WValue
和
BValue
来表示白方和黑方的局面分数,针对不同的局面给
WValue
和
BValue
加上不同大小的值,最后返回
WValue−BValue
.如果轮到黑方走棋,与上述情况相似。