Alpha-Beta剪枝算法的缺陷是比较明显。
1、最多只能搜索有限层,目前优化之后我可以搜索到8层。即电脑4步,人4步后的情况。但是还是不够的。看不到有限步数之后的棋。
2、电脑在思考第8层的时候,假定玩家是按照第8层走的。其实,相同棋力的玩家的在下一步的时候也会思考8层,是按照8层后的局面来选择的。如下图,假设电脑思考3层,电脑实际假设了玩家只思考了2层。其实玩家也会思考到最后的蓝色层。
一种优化的办法是使用算杀。也就是一旦发现了电脑存在杀棋,如活3,冲4的情况。电脑可以一直搜索到10层以上,来判断是否电脑能够一直算杀到赢棋。一旦玩家能够成功封堵就说明失败。能够计算到10层以上的原因是节点少。只关注活3冲4这种棋。并且,玩家能够封堵就会返回,不再计算下去。所以速度很快。
依然是max-min的思路来实现。
testKill函数是用来找到能组成或3或者冲4的空棋,将其存储在kill中。
void Game::evalute_kill()
{
resultPoint = QPoint(-1,-1); //保存能够算杀的点
int deeplength = 10;
QVector<QPoint> kill;
testKill(kill,computerColor);
if(kill.count()==0)
{
return;
}
for(int i= 0;i<kill.count();i++)
{
chess[kill[i].x()][kill