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

2019-06-24 14:59 浏览

对于四带二、飞机等定义,是修改最多的。的确这样的牌很难被管,所以我给了他一个非负价值,但是又发现其价值很大,比如说KKKQQQJJJ他的价值已经飙到11了。

那么程序给出的策略就是 分开打,因为KKKQQQ也是飞机。一个轮次的价值是7,远小于11。所以可以拆成两个轮次。鉴于这一点,我把价值调成为非负且除以2

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

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

 

这样这类牌型的价值永远不会大于7,毕竟这种牌型能一手出完不能分成两手出。而且根据之前的逻辑,你很难被管所以你也很难管别人,那么正价值收益缩减也是很自然的了。

最后说一下炸弹及王炸,炸弹无负价值且+一个轮次7,因为我们认为炸弹大概率能抢占一局轮次。而炸弹及王炸没有正价值收益缩减的原因是处于信仰把,尽量的不要拆分。也符合我们人性。我们都是把炸弹、王炸看成最重要的。

还有,在此之前我有想过权值定义取不拆分和拆分的最大价值。比如说3A带俩2,那么其实俩2的价值也很高,后期很有可能拆开打。但是最后因为引入了手牌轮次参数,所以不考虑拆分价值了。不然四带二的价值爆炸。

image.

下面给出目前暂定的定义方案

/*评分逻辑思维:

0.由于新策略引入手牌轮次参数,所以不再考虑拆分价值。

1.牌力基础价值:我们认为10属于中等位置,即<10单牌价值为负,大于10的单牌价值为正

2.控手的价值定义:我们认为一次控手权可以抵消一次手中最小牌型,最小牌型(3)的价值为-7,即我们定义一次控手权的价值为7

3.单牌的价值定义:该牌的基础价值

4.对牌的价值定义:我们认为对牌与单牌价值相等(均可以被三牌带出)故其价值为该牌的基础价值

5.三牌的价值定义:

  三不带:     该牌的基础价值

  三带一:     我们认为通常带出去的牌价值一定无正价值故其价值为该牌的基础价值

  三带二:     我们认为通常带出去的牌价值一定无正价值故其价值为该牌的基础价值

6.四牌的价值定义:

  炸弹:       我们认为炸弹会享有一次控手权利且炸弹被管的概率极小,故其无负价值,非负基础价值+7

  四带二单:   我们认为四带二单管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)

  四带二对:   我们认为四带二对管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)

7.王炸的价值定义:已知炸2价值为15-3+7=19分,故王炸价值为20分。

8.顺子的价值定义:

  单顺:       我们认为单顺的价值等于其最大牌的单体价值,且2不参与顺子,故顺子的权值依次提升1

  双顺:       我们认为双顺的价值等于其最大牌的单体价值,且2不参与顺子,故顺子的权值依次提升1

  飞机不带:   由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)

  飞机带双翅: 由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)

  飞机带单翅: 由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)

9.根据数值分布,我们暂定:   <10不叫分,10-14叫一分,15-19叫两分,20以上叫三分

PS.以上逻辑纯属扯淡,谁信谁SB。。。。。

以及封装好的获取价值函数

/*封装好的获取各类牌型组合结构函数

CardGroupType cgType:牌型

int MaxCard:决定大小的牌值

int Count:牌数

返回值:CardGroupData

*/

CardGroupData get_GroupData(CardGroupType cgType, int MaxCard, int Count)

{

    CardGroupData uctCardGroupData;

    uctCardGroupData.cgType = cgType;

    uctCardGroupData.nCount = Count;

    uctCardGroupData.nMaxCard = MaxCard;

    //不出牌型

    if (cgType == cgZERO)

    uctCardGroupData.nValue = 0;

    //单牌类型

    else if (cgType == cgSINGLE)

    uctCardGroupData.nValue = MaxCard - 10;

    //对牌类型

    else if (cgType == cgDOUBLE)

    uctCardGroupData.nValue = MaxCard - 10;

    //三条类型

    else if (cgType == cgTHREE)

    uctCardGroupData.nValue = MaxCard - 10;

    //单连类型

    else if (cgType == cgSINGLE_LINE)

    uctCardGroupData.nValue = MaxCard - 10 + 1;

    //对连类型

    else if (cgType == cgDOUBLE_LINE)

    uctCardGroupData.nValue = MaxCard - 10 + 1;

    //三连类型

    else if (cgType == cgTHREE_LINE)

    uctCardGroupData.nValue = (MaxCard - 3 + 1)/2;

    //三带一单

    else if (cgType == cgTHREE_TAKE_ONE)

    uctCardGroupData.nValue = MaxCard - 10;

    //三带一对

    else if (cgType == cgTHREE_TAKE_TWO)

    uctCardGroupData.nValue = MaxCard - 10;

    //三带一单连

    else if (cgType == cgTHREE_TAKE_ONE_LINE)

    uctCardGroupData.nValue = (MaxCard - 3 + 1) / 2;

    //三带一对连

    else if (cgType == cgTHREE_TAKE_TWO_LINE)

    uctCardGroupData.nValue = (MaxCard - 3 + 1) / 2;

    //四带两单

    else if (cgType == cgFOUR_TAKE_ONE)

    uctCardGroupData.nValue = (MaxCard - 3 ) / 2;

    //四带两对

    else if (cgType == cgFOUR_TAKE_TWO)

    uctCardGroupData.nValue = (MaxCard - 3 ) / 2;

    //炸弹类型 

    else if (cgType == cgBOMB_CARD)

    uctCardGroupData.nValue = MaxCard - 3 + 7;

    //王炸类型 

    else if (cgType == cgKING_CARD)

    uctCardGroupData.nValue = 20;

    //错误牌型

    else

    uctCardGroupData.nValue = 0;

    return uctCardGroupData;

注意!!!以上价值定义是作者本人主观意愿,并非斗地主游戏最佳策略,请大家遵从自己的内心适当修改~~

好了,权值定义做完后,我们便可以实现比较重要的一个模块了,即手牌总价值计算函数,也就是我一直说的F()算法函数。

 

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

作者:九日王朝

敬请关注下一章:棋牌源码教程解析之斗地主AI总值计算(8)

 


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

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

点击关闭
  • 在线客服1

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

    电话咨询:
    15623571666

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

    ↓微信客服↓

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

分享:

支付宝

微信