C++-判断斗地主牌型的合法性
我的思路是: 将本次出牌中的单张,对子, 三张,炸弹和王炸的数量都统计出来, 然后从王炸向下判断牌型, 但是发现由于333+444+555+666+8888等这种复杂牌型的存在, 判断还是比较麻烦, 所以想问问大家有好的什么方法?
PS: 网上有种方法,我是没看懂
顺序: 345678910JQKA2大小王
面值: 红桃3 黑桃3 方块3 草花3
按上面的顺序编码: 0 - 53
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我前段时间做过一个斗地主的游戏, 我的策略是遇到较复杂的牌型,比如三带一,三代二,飞机带翅膀等,先排序,按牌出现的次数排序,出现次数相同的牌降序排序,如输入为: 3, 6, 3, 7, 3, 1, 7 则输出为: 3, 3, 3, 7, 7, 1, 6,然后根据牌的数目测试是否符合可能的牌型。。。楼主有兴趣的话可以详谈,我这儿有现成的代码(Java)
需要判定基本牌型吧,共有如下5种
1.单牌*N,N>1时判定是否满足合法串。
2.对子*N,N>1时判断是否满足合法连对。
3.三张*N+X牌*M
判定N>1时是否合法连续,判定M是否为0
将X牌认为是单牌,判定N是否=M(N>0,M=0)
将X牌认为是对子,判定X牌是否为(M/2)对,判定2*N是否=M
4.四张*N+X牌M
判定N>1时是否连续,判定M是否为0
将X牌认为是单牌,判定2*N是否=M(N>0,M=0)
5.王对独立判断
感觉可以从反向开始考虑,排除一切不合法的组合
我对斗地主牌型的合法性了解不全,下面仅拿我知道的规则讲一下方法。
主要是根据所选择的牌的数量来进行判断:
1.1张牌,合法
2.2张牌,相同合法,不相同则非法
3.3张牌,相同合法,不相同则非法
4.4张牌,3张相同牌(3带1)或者4张相同牌(炸弹),合法,其他情况非法
5.5张牌,3张相同牌加2张相同牌(3带1对)或者5张连续的牌(顺子),合法,其他情况非法
6.6张牌,4张相同牌(4带2)或者2个连续的3张相同的牌(飞机)或者6张连续的牌(顺子),合法,其他情况非法
7.7张牌,7张连续的牌(顺子),合法,其他情况非法
8.8张牌,2个连续的3张相同的牌(飞机带2)或者8张连续的牌(顺子),合法,其他情况非法
9.9张牌,3个连续的3张相同的牌(3飞机)或者9张连续的牌(顺子),合法,其他情况非法
10.10张牌,10张连续的牌(顺子),合法,其他情况非法
11.11张牌,11张连续的牌(顺子),合法,其他情况非法
12.12张牌,3或4个连续的3张相同的牌(3飞机带3或者4飞机),或者12张连续相同的牌(顺子),合法,其他非法
13.大于13张牌,则只需要考虑飞机或者飞机带牌的情况了。
每次根据选择的牌的数量,进行对应的合法性检验,如果通过,则合法,否则不合法。
当然在程序设计方面,最好采用策略模式,这样整个算法的框架是相同的,只是不同的牌数选择的策略算法不同,而且修改(对某种情况增加规则或者减少规则)也很方便,只需要修改策略类,也便于维护,这样就可以实现判断牌的合法性了。
对于上述牌的合法性的描述,只是我自己的认识,可能程序中需要根据实际情况添加更多的情况。
补充:根据的建议,补充如下:对于6,8,10...等偶数张牌的情况,还应包括连队的检测。
先sort排序,如果是3,4的话,几个if就够了。
if(a[0] == a[1] && a[0] == a[2] && a[0] != a[3] && a[3] == a[4])那么就是三带二,然后如果后面三个相等前面两个相等也是三带二。
以此类推,四个的也好比了。