一个有关扑克牌牌型分析的问题

原创 2004年06月22日 21:46:00

此前,在公司的项目开发中,我负责着手解决这样一个问题:在斗地主游戏中,根据玩家出的牌分析出这手牌的牌型。

大家知道,在斗地主游戏中,总计有十一种牌型:

火箭:即双王(大王和小王)。
炸弹:四张同数值牌(如四个7)。
单牌:单个牌(如红桃5)。
对牌:数值相同的两张牌(如梅花4+方块4)。
三张牌:数值相同的三张牌(如三个J)。
三带一:数值相同的三张牌 + 一张单牌或一对牌。例如: 333+6或444+99
单顺:五张或更多的连续单牌(如:45678或78910JQK)。不包括2点和双王。
双顺:三对或更多的连续对牌(如:334455、7788991010JJ)。不包括2点和双王。
三顺:二个或更多的连续三张牌(如:333444、555666777888)。不包括2点和双王。
飞机带翅膀:三顺+同数量的单牌(或同数量的对牌)。
如:444555+79 或333444555+7799JJ
四带二:四张牌+两手牌。(注意:四带二不是炸弹)。
如:5555+3+8或4444+55+77。

那么,如何由玩家出的牌分析出这手牌到底是哪一种牌型呢?

在我们试着用程序解决这个问题之前,先来回顾一下在现实的生活中是如何分辨一手牌的牌型的。在斗地主游戏中,确定不同牌型的一个重要依据是看这手牌中有多少张牌的数字是相同的。比如一手这样的牌:梅花2+方块3+红桃3+黑桃3,在我们的思维中,首先会计算有最多相同数字的那些牌的个数,也就是这里的三个3,在这里,3总计出现了3次。根据最多出现相同数字的情况,我们可以把一手牌先分成四种情况:

1、所有数字只出现一次

2、相同数字的牌出现两次

3、相同数字的牌出现三次

4、相同数字的牌出现四次

5、不可能出现的情况:相同数字的牌出现大于四次或小于1次。

其中,在以上的1、2、3、4中又可能分为多种情况,比如在1中,虽然相同数字最多只出现一次,但不能因此就断定它是单张,它也有可能是双王(这里假定大小王的数字不相同)或单顺;在2中,出现两次的情况下,又进一步分为:对子和双顺两种情况;在3中,出现三次的情况下,可能有以下牌型:单三张,三带一,三顺或飞机;在4中,出现4个相同数字牌的时候,可能有以下牌型:炸弹和四带二。

为了建立以上的这种分析模型,我们需要对出的牌进行排序和统计,找出最大的相同个数及相同的数字,再进一步分析它的特征直到最终确定当前牌的牌型。用于实现牌型分析伪过程如下:

注:cardlist为所出牌的列表,cardcount为所出牌的个数。二维数组cardArray[0..12,0..1]是用于分析的辅助数据结构。

1、对cardlist按牌的数字大小进行升序排序

2、对carlist中的每张牌顺序进行以下操作

 将cardlist中牌的数字记入cardarray的低维中,即首先记cardlist[0]的数字于cardarray[0,0]中,并将cardarray[0,1]置为1,然后顺序取出cardlist中的后继牌,判断后继牌是否等于cardarray当前位置的cardarray[X,0]值,如果等于,则在card[x,1]中加1,以求得相同牌的个数,如果不等于,则在新单元cardarray[X+1,0]中记入cardlist当前牌的数字,并把cardarray[x+1,1]置为1。如此循环,对cardlist中的每张牌都进行扫描后,cardarray数组中,低维存放的就是当前这手牌中出现的所有数字,而在其对应的高维中则存放这些数字出现的次数。由这个二维数组,我们便可以初步判定这手牌的牌型。

这是我在实际工作中所采用的牌型分析方法,此方法最初由我们的teamleader提出,后来我作了些小小改动,不知有没有作相同问题研究的朋友,如果有更好的方法可以判断,请不吝赐教。

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 原文地址:http://m.blog.csdn.net/blog/wuwuwuwuwuwuwuwu/9370937 ...
  • my_belief
  • my_belief
  • 2015年10月14日 10:13
  • 2179

棋牌游戏判断牌型算法---适合所有的棋牌游戏

斗地主牌型基本算法升级版本                              好久没更新博客了,前段时间和朋友一起开了一个公司 做APP,最后失败了。现在又开始做棋牌游戏了,最近在看网狐的源码...
  • wojiushi3344
  • wojiushi3344
  • 2015年04月03日 10:15
  • 11030

扑克牌中的数学——梭哈中各牌型的概率如何计算

梭哈中的牌型包括 皇家同花顺 (royal flush):由AKQJ10五张组成,并且这5张牌花色相同 同花顺 (straight flush):由五张连张同花色的牌组成,比大小的话看最大的一张牌 ...
  • robinvista
  • robinvista
  • 2016年01月12日 22:34
  • 3436

一个简单的扑克牌洗牌算法|无重复

1.最初的想法:      第一个数:随机产生一个1-52 之间的数;  第二个数:随机产生一个,和第一个比较,如果相同,就再产生一个随机的,直到不同为止;  第三个数:随机产生一个,和第一、第...
  • wusuopuBUPT
  • wusuopuBUPT
  • 2013年04月19日 11:29
  • 3240

第四天:用数组方式写一个扑克牌案例(创建,洗牌,发牌)

希望对初学者有用,因为我也是从零基础自学入门的一个学生,希望大家能互相帮助互相学习。...
  • java_wht
  • java_wht
  • 2017年05月12日 22:35
  • 215

很久以前写的一个java模拟扑克牌洗牌发牌的小程序,学的知识少写的比较麻烦,不过也放上来吧

package org.phz.poke; import java.util.ArrayList; import java.util.Collections; import java.util.L...
  • panhongzhi02
  • panhongzhi02
  • 2013年11月19日 18:03
  • 2567

扑克牌洗牌问题<用java写出算法:54张扑克,分成上下两等份有规律的洗牌,多少次可以返回初始值>

问题来源于用java写出算法:54张扑克,分成上下两等份有规律的洗牌,多少次可以返回初始值 代码思路源于 @Tim Chen 相关代码:OneTest.java package pers.mine...
  • dzgt10076
  • dzgt10076
  • 2016年10月15日 10:15
  • 544

关于扑克牌排序和洗牌问题

编写一个表示一副扑克牌的类(无大小王)。并有输出一副扑克牌的方法和洗牌的方法。输出一副扑克盘的方法结果如下图所示: 洗牌方法即随机生成一个扑克牌的排列。 牌面大小和花色可以存储在字符串数组...
  • Voraginem
  • Voraginem
  • 2017年11月20日 19:46
  • 46

洗牌问题——偶数张扑克牌,分成两等份, 洗牌多少次回到原来顺序?

使用群论,将洗牌问题从复杂繁琐的编程问题变为简洁优雅的数学问题
  • Smiling_Wang
  • Smiling_Wang
  • 2016年09月11日 17:01
  • 226

一个简单的扑克牌小程序

新手一枚,最近刚学了java的集合框架,就拿来用一用(水平有限,欢迎交流) 游戏规则是:取两人各自手中点数最大的牌进行比较,点数大的赢;若两人各自的点数相等,则按花色比较。 感觉主要是以下几个方...
  • sxl871532815
  • sxl871532815
  • 2016年09月26日 10:50
  • 1063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个有关扑克牌牌型分析的问题
举报原因:
原因补充:

(最多只允许输入30个字)