zoukankan      html  css  js  c++  java
  • 斗地主 ai的一些资料

    zt https://programming.iteye.com/blog/1491470

    https://blog.csdn.net/abc1234679/article/details/79458376

    斗地主AI设计 
    一、牌型 
            1 火箭:大小王在一起的牌型,即双王牌,此牌型最大,什么牌型都可以打。 
            2 炸~弹:相同点数的四张牌在一起的牌型,比如四条A。除火箭外,它可以打任何牌型,炸~弹对炸~弹时,要比大小。 
            3 单支(一手牌):单张牌,如一支3。 
            4 对子(一手牌):相同点数的两张牌在一起的牌型,比如55。 
            5 三条:相同点数的三张牌在一起的牌型,比如三条4。 
            6 三带一手:三条 + 一手牌的牌型,比如AAA+9或AAA+77。 
            7 单顺:五张或更多的连续单支牌组成的牌型,比如45678或345678910JQKA。2和大小王不可以连。 
            8 双顺:三对或更多的连续对子组成的牌型,比如334455或445566778899。2和大小王不可以连。 
            9 三顺:二个或更多的连续三条组成的牌型,比如777888或444555666777。2和大小王不可以连。 
            10 飞机带翅膀:三顺 + 同数量的一手牌,比如777888+3+6或444555666+33+77+88。 
    11 四带二:四条+两手牌。比如AAAA+7+9或9999+33+55。 
    二、牌型分析 
    1 单顺的确定 
            a) 选取五连,先取出最小的一个五连,再在剩余的牌中取出最小的一个五连,依此类推,直到没有五连为止。 
            b) 扩展五连,将剩余的牌与已经取出的牌进行比对,如果某张剩余的牌与已知的连牌能组成更大的连牌,则将其合并。一直到无法合并为止。 
            c) 合并连牌,如果某两组连牌能无缝连接成更大的连牌,则将其合并成一组。 
            经过上述选取、扩展和合并,则将一手牌中的所有连牌提取出来了,举例如下: 
            假定一手牌是:2AKQJ1099877766543 
            第一步,选取出34567,678910两个连牌组。剩余的牌还有79JQKA2 
            第二步,剩余的JQKA能和678910组成新的连牌678910JQKA。 
            第三步,已知的两个连牌组不能合并成新的、更大的连牌组,则这手牌就被分成了34567、678910JQKA两个连牌组和7、9、2三张单牌。 

    2 双顺的确定 
            将一副牌中所有的对子检测出来,然后将对子排序,按照检测三连的方式可以将所有的双顺都提取出来。 

    3 三条的确定 
            一副牌中的所有三条都能比较方便地提取出来。 

    4 三顺的确定 
            在三条的基础上进行比较,如果有相连的三条,则将其合并成(尽可能大的)三顺。 

    5 炸~弹的确定 
            所有的四头都能很方便地确定。 

    6 火箭的确定 
            只要牌张包含大小王,就将其组成火箭。 

    7 牌张的分类方法 
            a) 先确定火箭:判断是否有大小王。 
            b) 再确定炸~弹:判明是否有四头。 
            c) 再确定三条:在除了炸~弹以外的牌中判断是否包含三条。 
            d) 再确定三顺:在已经确定的三条中判断是否包含相邻的三条,如果有,则将其组成三顺。注意,应该使三顺的数量尽可能大。即如果有444555666,则将其合成一个三顺,而不是分成444555一个三顺和666一个三条。 
            e) 再确定单顺:判断单顺时必须去除四个2以外的所有炸~弹。首先判断是否存在除了三条牌(这里的三条是指所有的三条)以外的连牌,如果有,则将其提取出来。其 次,将剩余的牌与每一个三条(不包含三顺)进行试组合,如果能够重新组成单顺和对子,则将原有的三条取消,重新组合成连牌和单顺(例子4566678重新 组成45678和66)。最后,将已知的连牌、三条(不包含三顺)和剩下的牌张再试组合,将所有如45678(已知的连牌)999(三条)10J(单 牌),重新组合成45678910J和99。通过以上的方法,就能将连牌和三条很好地重新组合。 
            f) 再确定双顺:首先,如果两单顺牌完全重合,则将其重新组合成双顺。其次,在除炸~弹、三顺、三条、单顺以外的牌中检测是否包含双顺。如果有,将其提取出来。 
            g) 再确定对子:在炸~弹、三顺、三条、连牌、双顺以外的牌中检测是否存在对子,如果存在将其提取出来。 
            h) 再确定单牌:除了炸~弹、三顺、三条、连牌、双顺、对子以外的所有牌张都是单牌。 

    8 对子的确定 
            参见上一节的“再确定对子”。 

    9 单牌的确定 
            参见上一节的“再确定单牌”。 

    三、一手牌的手数分析 
            为 了使斗地主机器人有一定的智能,必须对一手牌的手数进行分析。所谓一手牌的手数,指的是在没有别人压牌的情况下需要出几把能将牌出完。这个数字在经过上面 的分类后是可以确定的。还以上面的一手牌22AAKQJ9987776654为例,这手牌按照前面的分析方法可以分析出以下的牌型: 
            22、AA、K、Q、J、987654、9、77、6的牌型 
            通过对上面牌型的计算,可以容易得出这手牌需要9手才能出完,因此这手牌的手数就是9。 

    四、绝对手数和相对手数的概念 
            因为在斗地主游戏中存在火箭或炸~弹的可能,所以理论上只有火箭才不可能被别人压住,所以,可以不考虑相对手数的概念。以后都简称手数。 

    五、叫牌原则分析 
            因为在斗地主中,火箭、炸~弹、王和2可以认为是大牌,所以叫牌需要按照这些牌的多少来判断。下面是一个简单的原则: 
            假定火箭为8分,炸~弹为6分,大王4分,小王3分,一个2为2分,则当分数 
            大于等于7分时叫三倍; 
            大于等于5分时叫二倍; 
            大于等于3分时叫一倍; 
            小于三分不叫。 

    六、出牌的一般原则 
            1 出牌的原则一般按照从小到大的原则,即首先出包含最小牌的组合(单牌、对子、双顺、连牌、三顺、三条等,炸~弹、火箭不包括在内)。 
            2 三条的出牌原则:因为三条出牌可以带一张单牌或一个对子,所以在出三条时需要检测是否有单牌,如果有,则带一张最小的单牌,如果没有,则再检测是否存在对子,如果有,则跟一个最小的对子,如果单牌和对子都没有,则出三条。 
            在带牌时,除非是只剩两手牌,否则不能带王或2。 
            3 三顺的出牌原则:因为三顺出牌可以带两张(或更多)单牌或两个(或更多)对子,所以与出三条一样,需要检测是否有单牌或对子。如果有足够多的单牌或对子, 则将其带出。如果有单牌,但没有足够多的单牌,则检查是否有6连以上的连牌,如果有将连牌的最小张数当作单牌带出。如果有对子,但没有足够多的对子,则检 查是否有4连以上的双顺,如果有将双顺的最小对子当作对子带出。 
            在带牌时,除非是只剩两手牌,否则不能带王或2。 
            4 连牌的出牌原则:直接出。 
            5 双顺的出牌原则:直接出。 
            6 对子的出牌原则:因为对子可以用三条、三顺等带出,所以在出对子时,应该先检测一下三条+三顺(中三条)的数量,如果所有三条数量 <= 对子+单牌数量总和-2时,出对子,否则出三带2等等。 
            7 单牌的出牌原则:因为单牌可以用三条、三顺等带出,所以在出单牌时,应该先检测一下三条+三顺(中三条)的数量,如果所有三条数量 <= 对子+单牌数量总和-2时,出单牌,否则出三带1等等。 

    七、跟牌的一般原则 
            1 如果手中有独立的,与所出的牌一样牌型的牌时,先跟之。 
            2 2可以作为单牌、对子、三条等形式跟出。 
            3 当手中没有相应牌跟时,如果是本方人员出的牌,可以不跟,如果是对方出的牌,则必须拆牌跟,如果再没有,出炸~弹或火箭,否则PASS。 
            4 如果手中的牌除了炸~弹。火箭外还剩一手牌,则如果牌型相符,则先跟之,否则炸之。 
            5 单牌的跟牌原则:如果手中有单牌,则跟之,否则拆2跟之,否则拆对牌跟之,否则拆6连以上的单顺顶张跟之,否则拆三条跟之,否则拆三顺跟之,否则拆5连单顺跟之,否则拆双顺跟之,否则炸之,否则PASS。 
            6 对牌的根牌原则:如果手中有对子,则跟之,否则拆4连以上的双顺顶张跟之,否则拆三条跟之,否则拆双顺跟之,否则拆三顺跟之,否则炸之,否则PASS。 
            7 三条、三带1、三带2等牌的根牌原则:如果手中有相同牌型的牌则跟之,否则拆三顺跟之,否则炸之,否则PASS。注意,只有在手中牌在出了以后还剩一手牌时,或直接出完的情况下,才允许带王或2。 
            在没有足够牌带的情况下,参照单牌。对子的拆牌原则进行拆牌处理。 
            8 三顺及三顺带牌的根牌原则:如果有相应的牌型,则跟之,否则可以将大的三顺拆成小的三顺跟之,否则炸之,否则PASS。注意,只有在手中牌在出了以后还剩一手牌时,或直接出完的情况下,才允许带王或2。 
            在没有足够牌带的情况下,参照单牌。对子的拆牌原则进行拆牌处理。 
            9 连牌的跟牌原则:如果有相应的牌型,则跟之,否则拆相同张数的双顺,否则拆相同张数的三顺,否则拆不同张数的连牌,否则拆不同张数的双顺,否则拆不同张数的三顺,否则炸之,否则PASS。 
            10 双顺的跟牌原则:有相同牌型的牌,则跟之,否则拆不同张数的双顺,否则拆不同张数的三顺,否则拆相同张数的三顺,否则炸之,否则PASS。 
            11 炸~弹的跟牌原则:有超过所出炸~弹的炸~弹,或有火箭,则炸之,否则PASS。 
            12 炸~弹带两手牌的跟牌原则:如果有炸~弹,则炸之,否则PASS。 

    八、打牌原则解析 
            1 坐庄打法:因为坐庄的只是自己一个人,不存在配合问题,所以一般按照前面的原则出牌即可。 
                    a) 在出牌时,如果偏家有一个人只剩一张牌时,尽量不出单牌,否则单牌由大到小出。 
                    b) 在跟牌时,如果偏家有一个人只剩一张牌时,跟手中最大的牌。 
            2 偏家打法:偏家因为牵涉到配合问题,所以打法有一些不同。 
                    a) 在出牌时,如果是庄家的上家,且庄家只剩一张牌时,尽量不出单牌,否则单牌由大到小出。
                    b) 在跟牌时,如果是庄家的上家,且庄家只剩一张牌时,跟手中最大的牌。 
                    c) 当一个偏家打出的是单牌时,一般情况下能跟就跟。如果手中必须跟2或以上的牌时,选择PASS。 
                    d) 当一个偏家打出的是对子时,一般情况下能跟就跟。如果手中必须跟AA或以上的牌时,选择PASS。 
                    e) 如果一个偏家打出的牌是除了单牌及对子以外的牌型,则选择PASS。 
                    f) 如果处在下家的偏家只剩一张牌时,在出牌时出手中最小的牌。跟牌还按照一般的原则。

    地主下家出牌方法: 
    1)地主发单,过小单;地主发对,过小对;地主出大单,选择性的拆2。 
    2)接打同伴的中大单和对子,上手后有单牌一定要出单,单牌很大也可出对子,无单了出对。 )报单双时,如果地主过的单牌很少(地主上家顶住了牌没有让地主过小单),就报大单,否则报双。 
    地主上家出牌方法: 
    1)地主发单,顶大单,上手则改打中对;地主发对子,同伴出小对子则卡住地主的小对子,卡住对8以下的,可出对7、8,让同伴接过去;若同伴出到对10左右则千万不能接同伴的牌,在同伴打不起时在接打地主,上手后出大单。 
    2)同伴上手后,发小单过来,则要顶大单,如果大牌是对子就应该拆开对子来顶地主,上手后继续发中对,但如果前面已经知道同伴没有大对子了,则可以在顶牌时稍微顶小点,顶到10左右,让同伴去接地主的单牌。 
    3)看着牌很可能打不赢的时候,可以采用特殊的方法。如有一个A、2、加上几张烂牌,顶牌A,地主不要,这个时候就打一个2,这样如果地主不是双王,他必然会用王打你,这样就让地主少过了一张牌,给同伴创造了更好的机会,如果地主是双王,他牌不好他也可能把双王给拆掉,(本来他可以炸出来的)这样,就被你给骗到了,这种情况能逼地主不炸就为赢了。 
    4)地主上家要算好地主是单牌差劲还是对子差劲,专门打地主的弱点。如果地主单牌过完了,便发单,分死他。 
    5)地主上家一定要记住自己的任务:不到万不得已千万要卡住地主的小单,小对。 

    6)如果牌很好,可不顶牌。但至少要有80%以上把握才能这样放。 
    7)在地主上一家如双王没有走自己剩三张牌有一张2另外一对或两单,都应该先打2。(除非地主基本上没有过单牌才能发最小单) 
    8)若单牌出的太多,则尽量不要留一张,真的地主没单而你也只能留一张的话,而下家还有很多牌,就要看地主有多少大牌拦你,有很多的话,千万不要留一张。 
    地主出牌方法: 
    1)拿上牌后,分析自己的牌,除开三带一后,剩下的单牌在10点及以下,则发单。如果自己大对子比较多,能收回对子,便发对。具有几手相似的牌形如有几手连牌(相同张数),就先打连牌,如有几个三带一就先发三带一。 
    2)地主要尽量不要把自己的弱点暴露在对手的面前,也就时如果没有大的对子,首发就尽量不要打对子。因为人家打对9左右你就不要了,那弱点一下就给暴露了。 
    3)地主要学会忍让,如果不管是哪家的牌你都要打死,那么你的牌再大也是要输的,如自己发单,别人打大单,但自己有大对子那么就没有必要拆开2去打,因为对方肯定有对子投起来的。 )地主要多忍让上家,因为如果上家的牌好,你不管让不让他上手都是死定了的,但大多数情况上家都是顶牌,如果上家上手后,下家不懂得如何配合,或下家没的大对子来接过去的,那就不用担心了,不管是上家的单,还是对子都自然要让你过的,所以打上家不用急于一时 
    5)地主要算准下家的单牌过到几、对子过到几。(通过发单时算、还可通过三带所带的牌来算)。
    6) 地主走一张单,地主下家直接就走一个2,要直接干掉 
    7) 第一手牌出去要么能回,要么搞破坏 第一章. 要牌 
    记住:千万不可赌底牌!

    1有出有收

    2压制地主后就要进行切换出牌类型

    麻将aiGITHUB

     https://github.com/yuanfengyun/mj_ai?files=1

    https://blog.csdn.net/yuanfengyun/article/details/80337519

    skynet框架

    https://ke.qq.com/course/310360?tuin=104cb0e2

     四人斗地主

    https://blog.csdn.net/mei_363014743/article/details/81662409

    //蒙特卡洛搜索树 资料

    https://blog.csdn.net/qq_27801671/article/details/58100038
    https://blog.csdn.net/lc_892424093/article/details/60956092
    https://www.cnblogs.com/steven-yang/p/5993205.html
    https://blog.csdn.net/ljyt2/article/details/78332802

    人机博弈的一些资料

    http://www.xqbase.com/computer.htm 

    https://zhuanlan.zhihu.com/p/48644125

    https://blog.csdn.net/qq_16137569/article/details/83543641

    https://blog.csdn.net/ljyt2/article/details/78332802

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Navicat查询哪些表有指定字段名
  • 原文地址:https://www.cnblogs.com/itdef/p/10314137.html
Copyright © 2011-2022 走看看