象棋小巫师

官方地址: http://www.xqbase.com/computer.htm
作者:黄晨
里面有一个循序渐进的象棋对弈程序制作,作者想以此吸引国内更多的电脑博弈爱好者推出自己的国际象棋程序参赛,充分展示中国的计算机软件学术水平。
一共六个版本,我看了前三篇,后面没有耐心了,叹叹。

数据结构部分
象棋小巫师用一维数组 ucpcSquares[256] 记录整个棋盘的情况,代替二维数组。
当看到是用一维数组时,我一愣,为什么不用二维数组呢,那样不是更清晰。后来再多看点,就被作者对二进制位运算的运用给迷住了。
举个例子,一个走法只用一个数表示,即 mv = sqSrc + sqDst * 256,mv 代表走法,mv%256 就是起始格子的编号,mv/256 就是目标格子的编号。
// 获得走法的起点
inline int SRC(int mv) {
	return mv & 255;
}

// 获得走法的终点
inline int DST(int mv) {
	return mv >> 8;
}

// 根据起点和终点获得走法
inline int MOVE(int sqSrc, int sqDst) {
	return sqSrc + sqDst * 256;
}

再举一例,判断两个点是否在同一行,通过异或后再看高位是否相同,精彩,像这样精妙的用法到处都是。
// 是否在同一行
inline BOOL SAME_RANK(int sqSrc, int sqDst) {
	return ((sqSrc ^ sqDst) & 0xf0) == 0;
}


下棋规则部分易于理解,关键就是电脑如何走棋。
对所有可行走法进行搜索,需要一个评估系统判断下了这手棋后局面的好坏,评估价值最大的一手就是电脑认为最好的一手。
而评估系统不可能精确,只能是猜测,棋子的类型、位置等都是人为赋予的设想的价值。

看代码时,可结合下面两篇文章:
最小-最大搜索http://www.xqbase.com/computer/search_minimax.htm
Alpha-Beta搜索http://www.xqbase.com/computer/search_alphabeta.htm
Alpha:本方搜到的最好的值,我们的走法不可能再比它更差了,Alpha值越大对本方越有利。
Beta:对于对手来说最坏的值,对手会走出比它更好的走法,对手会选择Beta值越小的走法。

你可能感兴趣的:(博弈)