棋牌开发:斗地主AI之被动出牌(13)

2019-07-23 14:40 浏览

上一章我们已经搭好了被动出牌的基本架子,本章我们主要说明一下被动出牌算法的基本步骤。

查看全部文章点击这里:棋牌游戏开发:斗地主AI系列

我把出牌逻辑分为四个阶段,也就是策略的优先级。分别是:【直接打光手牌】→【同类型牌压制】→【炸弹王炸压制】→【不出】

第一阶段【直接打光手牌】就是说如果我们可以一次性把手牌打出,那就不用考虑接下来价值之类的问题了,因为已经赢了。这种情况可能是对方打出的牌型和你一样且你比他大,或者你剩的牌是炸弹王炸。

 

我们先以单牌为例:

 

//剪枝:如果能出去最后一手牌直接出

    CardGroupData SurCardGroupData = ins_SurCardsType(clsHandCardData.value_aHandCardList);

    if (SurCardGroupData.cgType != cgERROR)

    {

    if (SurCardGroupData.cgType == cgSINGLE&&SurCardGroupData.nMaxCard>clsGameSituation.uctNowCardGroup.nMaxCard)

    {

    Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);

    return;

    }

    else if (SurCardGroupData.cgType == cgBOMB_CARD|| SurCardGroupData.cgType == cgKING_CARD)

    {

    Put_All_SurCards(clsGameSituation, clsHandCardData, SurCardGroupData);

    return;

    }

    }     

 

也就是通过调用第六章实现的判定是否为一手牌函数,如果返回的类型与当前牌型相同且nMaxCard值更大一些,或者是炸弹王炸。那么直接打光所有手牌。

Put_All_SurCards打光所有手牌实现方法:

image.png

第二阶段【同类型牌压制】就是需要遍历当前手牌满足可以管上的组合,然后选出最优解。我们先做一些准备工作,因为要考虑出牌和不出牌收益情况,所以我们先计算出当前手牌的价值,之所以把原始牌型轮数+1也是为了在这里若能抢占一轮尽量出牌管上。当然,若管完之后的剩余价值损失的太大就只能算了。

 

还需要设置暂存最佳牌号的变量、是否出牌的标志。

 

//暂存最佳的价值

    HandCardValue BestHandCardValue = get_HandCardValue(clsHandCardData);

 

 

    //我们认为不出牌的话会让对手一个轮次,即加一轮(权值减少7)便于后续的对比参考。

    BestHandCardValue.NeedRound += 1;

 

    //暂存最佳的牌号

    int BestMaxCard=0;

    //是否出牌的标志

    bool PutCards = false;

 


本套棋牌游戏开发源码,承接搭建维护一条龙服务,需要的老板联系15623571666.微信同号,货真价实!

免责申明:本站源码仅提供学习和交流,所有资料源码均来自于网络,版权归原创者所有!本站不提供任何保证,并不承担任何法律责任,如果对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。

点击关闭
  • 在线客服1

    -------------------

    电话咨询:
    15623571666

    -------------------

    ↓微信客服↓

    ------------------- 2

分享:

支付宝

微信