一、规则和权值定义
1、斗地主中存在很多种的牌型,比如:单张,对子,三带,顺子,连队,飞机,炸弹等 ,我的机器人主要根据权重去设计的,我给每一种牌型都制定了一个权重,比如3权重是多少,其他牌型的权重有时多少,定义了一个结构体如下:

type CardGroup struct{cgType PattenType   //枚举类型value int           //牌的价值count int           //牌的个数maxCard int         //最大的牌
}

根据牌型去获得对应的权值

func GetCardGroup(cgType PatternType, major int, c int)*CardGroup{switch cgType{case Single :value=major-10}return &CardGroup(cgType ,value,c,major)
}

2、牌的大小
大小:3、4、5、6、7、8、9、10、J、Q、K、A、2、小王、大王
二、实现方面
1、机器人的逻辑先是叫地主,抢地主,根据手上的牌来计算出最优的牌型组合且权重得到最优,然后在选择叫地主和抢地主。
2、叫玩地主之后,选择加倍或者不加倍,这个时候底牌已经出来,然后机器人再重新计算出对应的权值来选择加倍或者不加倍。
3、加倍完成之后,则进入机器人出牌和跟牌的逻辑 ,这面的逻辑主要是包含一些策略,比如:一手牌牌策略,挡牌策略,让队友策略已经打出一手牌让自己手牌价值最大的策略等等。
注释:在计算权值的时候,会对手牌进行一个拆牌算法,将玩家手牌拆分成不同的组合,然后从拆分的组合中去得到最优的牌值拆分。这里面涉及到的算法是动态规划+递归+回溯(ps:在这里就不多描述了)代码贴一丢丢如下:

type ValueCalculatorR struct {valueTbl map[string]*HandCardValue
}func NewValueCalculatorR() *ValueCalculatorR {calc := &ValueCalculatorR{valueTbl: make(map[string]*HandCardValue),}return calc
}// 手牌权值结构
type HandCardValue struct {sumValue   int         // 手牌总价值needRound  int         // 需要打几手牌cardGroups []CardGroup // 记录拆牌结果cardArrays []CardArray // 记录拆牌结果
}

计算出的主要是包含结构体中这些参数。下面来说一下我做这个机器人的一些策略,希望对大家有所帮助:
出牌策略:优先的话,

  1. 是一手牌策略,当自己手上只有一手牌的情况下,则直接打出去,eg:333,444,77,88,可以直接当飞机打出去。
  2. 当对手只有一张牌或者两张牌的情况下,则结合场面上的信息去进行分析,比如你的对手有两张牌,但是你的手里只有对子和一张目前场上最大的单张,则你应该选择拆对子去打牌。这样才能保证你赢。
  3. 让队友牌策略,当下家是队友的话,,比如队友只有一张或者两张的时候,打出自己手上较小的单张或者对子放队友走掉。
  4. 小顺子,飞机,三带牌型则优先打出去,以及在某些情况下可以打出四带二的牌型。
  5. 打出一手牌,让当前玩家的手牌的权值达到最大值。
    跟牌策略

1、优先也是一手牌策略,当你手上只有一手牌的话,要的起的话,则跟出去。
2、分析对手的牌,当对手牌的数量只剩下一张或者两张的时候,这个情况下如何去选择跟牌。
3、跟牌必赢策略,当自己手上的权重较大的时候,在存在要的起的情况下,则会选择去跟牌。
4、让队友跟牌策略,当自己手牌需要拆牌,或者打出当前牌则牌权值较差的情况下,则会优先考虑让队友去跟牌。
5、两手牌策略,分析自己手上的牌型,根据场面上的信息,选择跟牌还是不跟,绝大部分要的起的话,是会跟牌,除一些特殊情况。
6、最后的兜底策略,分析各种情况,当压友军需要拆牌的情况下则不拆,当打出的是炸弹,但是队手的牌的权值太小的情况下,则不不打出炸弹,这个策略至关重要,直接影响到胜率。

以上的策略是从上往下,优先级从大到小。本人还写过五子棋机器人,斗地主炸弹机器人,组队2v2机器人。其实策略逻辑方面都差不多,只是需要考虑的场景不太一样,现在正在对机器人做进一步的优化。希望以后能越来越智能。现在机器人胜率普遍达到40-50%之间。

斗地主机器人AI算法和策略(个人思路总结)相关推荐

  1. 协作机器人 ai算法_如果我们希望人工智能为我们服务而不是不利于我们,我们需要协作设计...

    协作机器人 ai算法 by Mariya Yao 姚iya(Mariya Yao) 如果我们希望人工智能为我们服务而不是不利于我们,我们需要协作设计 (If we want AI to work fo ...

  2. 斗地主机器人智能算法深度研究

    我从事棋牌开发工作已经6年了,我一直喜欢玩斗地主,腾讯上面的我经常玩,别人的也经常玩,对于斗地主机器人智能效果,一直都未发现那个平台做得比较令我满意,所谓的好,我觉得机器人常见牌要打得有点水准,拆牌, ...

  3. php麻将机器人ai算法,高性能麻将AI算法

    想要一个高性能的麻将AI算法,这个问题我们拆解成2个子集来思考,"高性能","麻将AI算法",我们先针对麻将AI算法来讨论. 麻将AI "麻将AI&q ...

  4. 用AI算法起中文名字 ---- 思路与实践初探

    文章大纲 简介 <三才五格姓名学>的缺陷 来源 姓名学 缺陷 AI 起名思路初探 工程思路与实施 起名参考 小名参考 大名参考 app 参考 参考文献 简介 起名就像命令变量一样,见名知意 ...

  5. 斗地主AI算法——第九章の被动出牌(3)

    上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码. 对牌.三不带牌型实现方法与单牌基本类似.改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时 ...

  6. 斗地主AI算法——第七章の被动出牌(1)

    哎,之前扯了那么多蛋,终于讲出牌了! 本章开始讲被动出牌的逻辑算法.首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型. 在第二章数据结构里我们定义过,游戏全局类里面有一个存放当 ...

  7. 斗地主AI算法——第四章の权值定义

    第一章业务逻辑结尾部分我提到了权值的计算方法: ①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样.③整手牌可以分成若干个组合牌,但分法不唯一. 当时,我说了① ...

  8. 斗地主AI算法——第一章の业务逻辑

    转眼间快到了五月,帝都的天气也变的非常梦幻. 时而酷暑炎热,时而狂风席卷. 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华. 世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂 ...

  9. 斗地主AI算法——第十六章の样例分析

    上一章,我们已经完成了测试模块的开发.至此我们已经可以进行整体测试了.本章主要内容就是对随机生成的对局情况进行简单的分析. 实际上整个开发过程绝大部分时间都是用在样例分析上,通过样例给出的返回操作分析 ...

最新文章

  1. 天猫精灵可以当电脑音响吗_天猫精灵推出便携式投影仪,小到可以装进口袋,试试效果...
  2. 从0开始利用宝塔linux面板+DSShop搭建一个简单的购物网站
  3. synchronized 和 volatile 关键字的作用
  4. 教你用树莓派打造一个家庭影院
  5. HDU 2899 三分
  6. pymongo查询列表元素_散列表:如何实现word编辑器的拼写检查?
  7. ztree改变节点颜色
  8. 4025-数组的正负排序(C++,双指针法,附思路)
  9. Python: 如何安装 torch 对应的 torchvision 版本?
  10. Ubuntu source insight3稳定性
  11. SQL查找是否存在,别再count了
  12. python命令行安装包
  13. 逻辑英语与语法俱乐部比较
  14. [CEOI2017]Mousetrap
  15. 【laravel-admin】权限管理与实现原理
  16. 微信小程序setData的使用
  17. 数据结构: 算法的时间复杂度和空间复杂度
  18. 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
  19. 行业分析-磁共振造影剂市场现状及未来发展趋势
  20. 下载的图片损坏 图片完整性检测工具

热门文章

  1. 7月末出去玩啦,给大家分享一个青岛攻略吧~
  2. mysql 批量update sql_批量更新sql |批量update sql
  3. EasyDSS高性能RTMP/HLS(m3u8)/HTTP-FLV/RTSP流媒体服务器EasyDSS出现加密机授权异常问题如何解决?
  4. visual basic李天生第二章笔记
  5. 一文读懂雨量传感器的前世今生
  6. 19-Javaweb-实战2(商品分类 分页 浏览记录 IOC)
  7. 怪物农场2修改日志1 - FirstBlood
  8. Revit中元素重要的属性和方法
  9. 2019计算机java考试大纲,2019年计算机二级考试JAVA练习试题
  10. 正则掌握程度测试题——参考答案