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

2019-07-15 13:59 浏览

哎,之前扯了那么多蛋,终于讲出牌了!

本章开始讲被动出牌的逻辑算法。首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型。

在第二章数据结构里我们定义过,游戏全局类里面有一个存放当前牌型结构的成员,即

    //当前打出牌的类型数据,被动出牌时玩家根据这里做出筛选

    CardGroupData uctNowCardGroup;

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

我们即将通过他进行类型的筛选,所以肯定是要枚举各类牌型的,也就是这个样子的。

20170426203358695

是的不要质疑!就是这个样子的~~

当然了,虽然是2.0初级版,我们还是要给予一定的灵性的,比如说当最后只剩两手牌且存在王炸的话,王炸优先出。

    /*王炸——当前策略只处理王炸作为倒数第二手的优先出牌逻辑,后续版本会在此基础上优化*/

    if (clsHandCardData.value_aHandCardList[17] > 0 && clsHandCardData.value_aHandCardList[16] > 0)

    {

 

    clsHandCardData.value_aHandCardList[17] --;

    clsHandCardData.value_aHandCardList[16] --;

    clsHandCardData.nHandCardCount -= 2;

    HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);

    clsHandCardData.value_aHandCardList[16] ++;

    clsHandCardData.value_aHandCardList[17] ++;

    clsHandCardData.nHandCardCount += 2;

    if (tmpHandCardValue.NeedRound == 1)

    {

    clsHandCardData.value_nPutCardList.push_back(17);

    clsHandCardData.value_nPutCardList.push_back(16);

    clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);

    return;

    }

}

算法思路:若存在手牌17(大王)和16(小王),那么先去除这两张牌

然后通过get_HandCardValue获取剩余轮次。

再回溯到原有状态。若只剩一手,则打出王炸。

出牌的操作也很简单,将需要打出的牌进入clsHandCardData.value_nPutCardList数组,且通过第四章提到的get_GroupData函数获取类型结构再赋值给手牌类以及游戏全局类相应的成员变量。当确定好出牌策略后,直接return。因为被动出牌的分支只会走一个,为了节约时间,所以每个分支里都有return,若没有走入任何分支则视为错误数据。

我们先把最简单的类型写出来,就是别人出王炸时的策略。

 

    //王炸类型 人都王炸了你还出个毛

    else if (clsGameSituation.uctNowCardGroup.cgType == cgKING_CARD)

    {

    clsHandCardData.uctPutCardType = get_GroupData(cgZERO, 0, 0);

    return;

    }

怎么样,是不是很简单?

 

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

作者:九日王朝 


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

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

点击关闭
  • 在线客服1

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

    电话咨询:
    15623571666

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

    ↓微信客服↓

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

分享:

支付宝

微信