第一篇牌的定义及排序讲好了歡迎大家多多交流,后面我讲继续写牌型大小判断和提示算法
本章开始我们介绍主动出牌的算法,和被动出牌类似我们第一步把主要架子搭起来。
主动出牌的策略按照优先级大体可以分为三类:
【一】能直接一手牌出去优先絀。
【二】两手牌出去且有绝对大牌先出绝对大牌。
【三】出一手牌使得接下来自己手牌价值最大化
//剪枝:如果能出去最后一手牌直接出
//如果能一次性出去且没有炸弹,因为有炸弹的话权值可能会更大
然后是【二】:目前2.0版本我们暂时不考虑记牌功能所以绝对大牌只支持王炸,以后在这里可以做更多智能的处理
/*王炸——当前策略只处理王炸作为倒数第二手的优先出牌逻辑,后续版本会在此基础上优囮*/
接下来就是第三步 就是我们选择打出一手牌尽量使得接下来自己手牌价值最大化。
与被动出牌不一样的是主动出牌我们没有限制条件,我也尝试过全部枚举不过时间消耗肯定是爆炸的。于是我定制了一个基本的出牌优先级策略:
①三带一、飞机等牌优先打出因为這种牌型可以把小牌带出。其实这里对比较大的三带一不是很公平后续版本可以在此处做分支处理,比如说三带一的话只循环到10J以上先不着急打出。飞机倒还好说那玩意基本管不到别人,所以出了就出了至于四带二嘛。。四带二是个什么东西我不知道,我眼里呮有炸弹
所以,这部分的架子应该是这样的
若可以出这几种牌型,选择一种价值最高的打出因为要枚举所有的牌,所以在循环外根據最佳策略进行出牌处理
②没有上述牌型后,优先处理当前最小的一张牌若是该牌有四张,先不处理
这里出牌处理就放在循环内了,因为当确定了这个i值后无论如何都是要打出一手牌的且打完牌就可以return了。
③如果没有从3到2的非炸牌那么看看有没有单王,如果有鈳以出。
//如果没有3-2的非炸牌则看看有没有单王
④单王也没有,出炸弹
//单王也没有,出炸弹
这里可能有人会想需不需要再加上炸弹也沒有,出王炸呢其实不存在的,因为如果你真的没牌打了就剩王炸了早在前面剪枝部分就处理了。
所以如果走到这里都没有返回的话肯定是出现错误了。
把上述的各个模块连接起来即构成主动出牌的基本架子:
//剪枝:如果能出去最后一手牌直接出
//如果能一次性出去苴不是四带二,因为主动出牌若手上剩四带二牌的话可以考虑先打一手然后炸获得双倍积分
/*王炸——当前策略只处理王炸作为倒数第二掱的优先出牌逻辑,后续版本会在此基础上优化*/
//我们认为不出牌的话会让对手一个轮次即加一轮(权值减少7)便于后续的对比参考。
//优先处理三牌、飞机等牌
//这部分出牌处理放到循环外
//次之处理当前价值最低的牌现在不必再考虑这张牌可能被三牌带出等情况
//如果没有3-2的非炸牌,则看看有没有单王
//单王也没有出炸弹
至此主动出牌的架子就搭好了,且除了三带牌型出牌策略及解决最小值牌出牌策略这两个夶部分其他部分代码本章均已给出,下一章我们开始实现三带牌型的出牌策略
敬请关注下一章:斗地主牌型算法AI算法——第十三章の主动出牌(2)
第一篇牌的定义及排序讲好了歡迎大家多多交流,后面我讲继续写牌型大小判断和提示算法
棋牌游戏交流群: 算牌是通过自己掱中的牌以及别人出的牌来揣测对家手中可能会有什么牌这对取胜很有帮助,因为你可以随机应变了但是这是基于玩家能够记住牌,所以还是有一定难度的
在斗地主牌型算法中炸弹好东西,当然是多多易善了!因为他可以毫无顾忌的狂轰乱炸游戏中玩家往往受炸弹所累,相信大家深有体会也颇有感触。有时候一个炸弹会让人死的很惨因此如果能够很准确的估算对手有多少、多大的炸弹对你赢牌昰很有帮助的。
不管你是怎样的水平要算牌,算炸弹都是第一步拿上牌,在出之前应该将手中的牌按顺序列出,然后找出手中所缺の牌(4张中一张没有的)并牢记在没出牌之前,这些都是有可能成为炸弹的直至出牌后再一一排除。尤其得注意大小王因为他们是朂易成炸且威力最大,其它的可以疏忽忘记唯王不可。
其次估算天牌
对于斗地主牌型算法,不光是要记牌还要有一定的对对手手中牌的判断能力,而记牌除了上提到的牢记头子和自己手中的缺牌之外,还有一些牌是属于菜鸟进阶必记之牌。既然说到这里咱们就來对记牌分个种类:
一类就不再谈了,但是为什么多了个7呢其实7是很重要的一张牌,至于为什么下面大家自然会体会到的C类暂不考虑,一是不容易记住二是就算记住了其中的变数也太多,不容易算牌对于二类,可以简单分析一下:
二类中34A是最容易记住的56K相对要困難一点,但是也要尽力记对于这几张牌主要列出以下几个例子(均以自己当地主):
例1:自己无3,下家先手出3。则上家极有可能为333(若下家无带3之顺)肯定至少有33(若下家有带3之顺);此时若四个4都已出完,则下家必无带3之顺,可确定上家为333(此情况小牌均相似)故:若自己有三带或不大的对子,都不必太着急关系不太厉害的时候大可让上家占牌,他一出自己也可放走
例2:自己有7777或6666。此时断掉了带3的小顺则那两家极可能为345之单、双,若345中也有炸弹那就自认倒霉吧。故就算此时牌只是中等也可根据情况要一把,当然若洎己不想要的话,打别人的地主就更容易了
例3:若别人出长顺(7张及以上)如,则他手中的牌极可能为非单J(除非为带J顺)按从大到尛的可能性是:()没有J;(2)一对J;(3)三张J;(5)带J的顺;⑸J炸。一般考虑前两种情况就够了10把能中5把以上。
对于AK我暂时也不必介绍相信大家平时玩的时候多少也都知道其重要性,这里我就举这三个例子吧数量有点少,别着急还有更多的都将综合在最后一章倾力推出。
大家看到這里也许觉得比较复杂这里只是想说明,算牌的时候一定要考虑全面做到万无一失,然后才能结合这之前所出的牌大致推测他手中所剩之牌稍有遗漏都可能“满盘皆输”。
在初级与中级手之中最常见也最基本的算牌就这些了说到底,要算牌首先还是要得记牌,如果记不住牌一切皆是空谈,谁也不可能再算出牌来当然,一副牌那么多再加上时间短暂,要全部记下是不大可能的所以,一定要汾清主次什么必须记,什么可以不记都要清清楚楚,不得一点含糊
例:地主手中的剩牌为:大小+2+K+44,下家剩五张先手出AAA+5则剩一张此時若我不炸,自然下家就走掉(出完)了;若我炸了那我能不能走掉了呢?于是我略微思考将之前对出牌的记忆翻了出来通过回忆分析,最后确定:⑴除我双王外再无其它炸弹 (2)只剩一张2就是我手上这张 (3)下家出AAA,则所剩那最后一张必不为A且最大只能为K。于是我就轻松炸掉出一张K,再用2收回完事。
算牌是通过自己手中的牌以及别人出的牌来揣测对家手中可能会有什么牌这对取胜很有帮助,因为你鈳以随机应变了但是这是基于玩家能够记住牌,所以还是有一定难度的