QT五子棋项目详解之七:Alpha-Beta剪枝算法前使用算杀

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[i].y()] = computerColor;
         int m = min_kill(kill[i],deeplength-1);
        chess[kill[i].x()][kill[i].y()] = 0;
        if(!m)
        {
            continue;
        }else{
            resultPoint = kill[i];
            kill.clear();
            return;
        }
    }
}
 
int  Game::max_kill(QPoint point,int deep)
{
    if(ifWin(point.x(),point.y()))
    {
 
        return false;
    }
    if(deep < 0) return false;
    QVector<QPoint> kill;
    testKill(kill,computerColor);
    if(kill.count()<=0)
    {
        return false;
    }
    for(int i = 0 ;i<kill.count();i++)
    {
        chess[kill[i].x()][kill[i].y()] = computerColor;
 
        int m = min_kill(kill[i],deep-1);
        chess[kill[i].x()][kill[i].y()] = 0;
        if(!m)
        {
            continue;
        }else{
            kill.clear();
           return true;
        }
    }
      kill.clear();
    return false;
}
 
int  Game::min_kill(QPoint point,int deep)
{
    if(ifWin(point.x(),point.y()))
    {
        return true;
    }
    if(deep < 0) return false;
    QVector<QPoint> kill;
 
    testKill(kill,computerColor);
    testKill(kill,computerColor==4?5:4);
    if(kill.count()<=0)
    {
        return false;
    }
     for(int i = 0 ;i<kill.count();i++)
     {
         chess[kill[i].x()][kill[i].y()] = computerColor==4?5:4;
         int m = max_kill(kill[i],deep-1);
         chess[kill[i].x()][kill[i].y()] = 0;
         if(!m)//堵住了
         {
             kill.clear();
            return false;
         }
     }
      kill.clear();
     return true;
}
 

将算法应用在Alpha-Beta剪枝算法前判断是否能够一杀到底即可。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值