C++-判断斗地主牌型的合法性

发布于 2016-10-12 23:02:46 字数 222 浏览 1296 评论 5

我的思路是: 将本次出牌中的单张,对子, 三张,炸弹和王炸的数量都统计出来, 然后从王炸向下判断牌型, 但是发现由于333+444+555+666+8888等这种复杂牌型的存在, 判断还是比较麻烦, 所以想问问大家有好的什么方法?

PS: 网上有种方法,我是没看懂
顺序: 345678910JQKA2大小王
面值: 红桃3 黑桃3 方块3 草花3
按上面的顺序编码: 0 - 53

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

虐人心 2017-10-12 04:18:07

我前段时间做过一个斗地主的游戏, 我的策略是遇到较复杂的牌型,比如三带一,三代二,飞机带翅膀等,先排序,按牌出现的次数排序,出现次数相同的牌降序排序,如输入为: 3, 6, 3, 7, 3, 1, 7 则输出为: 3, 3, 3, 7, 7, 1, 6,然后根据牌的数目测试是否符合可能的牌型。。。楼主有兴趣的话可以详谈,我这儿有现成的代码(Java)

泛泛之交 2017-07-13 17:02:01

需要判定基本牌型吧,共有如下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.王对独立判断

偏爱自由 2017-06-19 20:29:18

感觉可以从反向开始考虑,排除一切不合法的组合

偏爱自由 2017-03-02 10:03:55

我对斗地主牌型的合法性了解不全,下面仅拿我知道的规则讲一下方法。
主要是根据所选择的牌的数量来进行判断:
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...等偶数张牌的情况,还应包括连队的检测。

瑾兮 2017-02-12 04:47:19

先sort排序,如果是3,4的话,几个if就够了。
if(a[0] == a[1] && a[0] == a[2] && a[0] != a[3] && a[3] == a[4])那么就是三带二,然后如果后面三个相等前面两个相等也是三带二。
以此类推,四个的也好比了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文