我们很容易明白,在alpha-beta剪枝算法中,会遇到重复的棋局。如下面的两个图的走法是一样的,不必要将两个局面的得分都计算一次。
因此需要将棋盘的信息保存起来以备后续使用,这就是置换表。在棋类游戏中经常使用的就是zobrist哈希。
zobrist哈希并不是一种最好的哈希算法,但是确实最高效的。有时候我们必须在最好与效率之间做出选择。
zobrist是一个人的名字,源自他1970的年的一片论文
试想一下你如何有效的存储一个棋盘的信息呢?zobrist提供了一种办法:棋盘的一个唯一的标识就是棋盘的所有状态的异或值。
棋盘的每一个状态实际就对应着一个随机数。在五子棋中,我们忽视空白,将每一个位置的状态标示为黑棋或白棋两种状态。
第一步:是需要初始化每一个状态的随机数。设置两个数组。对于随机数的产生使用了Twister算法,开源项目:www.agner.org/random
其实就是用别人写好的,调用一下函数,不要想得那么复杂。rand函数只能生成五位随机数,不推荐使用。
int WriteZobrist[15][