棋牌源码教程解析之斗地主AI价值定义(9)

2019-07-01 11:19 浏览

前几篇文章的地址链接整理:
棋牌游戏源码教程解析之斗地主AI(1)
棋牌源码教程解析之斗地主AI(2)
棋牌源码教程解析之斗地主AI数据结构(3)
棋牌源码教程解析之斗地主AI(4)

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

将返回的价值与当前打出的牌价值相加即时该阶段手牌总价值。
下面给出完整代码

/*

通过回溯dp的方式获取手牌价值

与get_PutCardList作为交替递归调用

返回:价值结构体HandCardValue

权值的计算规则参考头文件评分逻辑思维

*/

HandCardValue get_HandCardValue(HandCardData &clsHandCardData)

{

   //首先清空出牌队列,因为剪枝时是不调用get_PutCardList的

    clsHandCardData.ClearPutCardList(); 

    HandCardValue uctHandCardValue;

    //出完牌了,其实这种情况只限于手中剩下四带二且被动出牌的情况,因为四带二剪枝做了特殊处理。

    if (clsHandCardData.nHandCardCount == 0)

    {

    uctHandCardValue.SumValue = 0;

    uctHandCardValue.NeedRound = 0;

    return uctHandCardValue;

    }

   //————以下为剪枝:判断是否可以一手出完牌

    CardGroupData uctCardGroupData = ins_SurCardsType(clsHandCardData.value_aHandCardList);

   //————不到万不得已我们都不会出四带二,都尽量保炸弹

    if (uctCardGroupData.cgType != cgERROR&&uctCardGroupData.cgType != cgFOUR_TAKE_ONE&&uctCardGroupData.cgType != cgFOUR_TAKE_TWO)

    {

    uctHandCardValue.SumValue = uctCardGroupData.nValue;

    uctHandCardValue.NeedRound = 1;

    return uctHandCardValue;

    }

   //非剪枝操作,即非一手能出完的牌 

   /*只是获取出牌的序列,即clsHandCardData.value_nPutCardList及clsHandCardData.uctPutCardType

    其他成员均无改变,也不会调用出牌函数,get_PutCardList返回最优方案*/

    get_PutCardList_2(clsHandCardData); 

   //要保存当前的clsHandCardData.value_nPutCardList及clsHandCardData.uctPutCardType用于回溯

    CardGroupData NowPutCardType = clsHandCardData.uctPutCardType;

    vector<int> NowPutCardList = clsHandCardData.value_nPutCardList; 

    if (clsHandCardData.uctPutCardType.cgType == cgERROR)

    {

    cout << "PutCardType ERROR!" << endl;

    } 

    //---回溯↓

    for (vector<int>::iterator iter = NowPutCardList.begin();

    iter != NowPutCardList.end(); iter++)

    {

    clsHandCardData.value_aHandCardList[*iter]--;

    }

    clsHandCardData.nHandCardCount -= NowPutCardType.nCount;

   //---回溯↑

    HandCardValue tmp_SurValue = get_HandCardValue(clsHandCardData);//递归剩余牌价值

    //---回溯↓

    for (vector<int>::iterator iter = NowPutCardList.begin();

    iter != NowPutCardList.end(); iter++)

    {

    clsHandCardData.value_aHandCardList[*iter]++;

    }

    clsHandCardData.nHandCardCount += NowPutCardType.nCount;

   //---回溯↑

    uctHandCardValue.SumValue = NowPutCardType.nValue + tmp_SurValue.SumValue;

    uctHandCardValue.NeedRound = tmp_SurValue.NeedRound + 1;

    return uctHandCardValue;

}

注:当前出牌策略是2.0版本,所以是get_PutCardList_2,后续还会写出更多的版本,敬请期待。

如果你之前了解回溯算法的话,那么应该很好理解上述代码.

总值计算的模块就算完成了,其实并没有太多东西,除了一个回溯递归以外就是里面调用了两个函数ins_SurCardsType判断是否是一手牌以及get_PutCardList出牌逻辑。那么下一章我们便要实现这个ins_SurCardsType函数

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

作者:九日王朝 

敬请关注下一章:棋牌源码教程解析之斗地主AI牌型判断(10)


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

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

点击关闭
  • 在线客服1

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

    电话咨询:
    15623571666

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

    ↓微信客服↓

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

分享:

支付宝

微信