游戏中的斗地主棋牌游戏大厅有哪些牌型

6991人阅读
c++基础(14)
棋牌游戏算法(7)
& &地主算法之判断牌型
& & & & & & & & &&by &wojiushi3344
&&&&&&&&&&&&&&&&&&&&& QQ:
扫描二维码,添加好友,获取更多的斗地主编程技术
& & & & & & & &&&每个游戏都有属于自己的规则,当然地主也不例外,常斗地主的朋友可能知道在斗地主里面一共有13种牌型,你所出的牌必须符合13种的一种才能够出得了牌,这个就叫地主的规则。那么我们下面可以通过一个枚举结构来表示每一种的牌型,在这里我们把错误的牌型也当成是一种牌型。
SINGLE_CARD =1, //单牌
DOUBLE_CARD, //对子
THREE_CARD
BOMB_CARD,//炸弹
THREE_ONE_CARD,//3带1
THREE_TEO_CARD,//3带2
BOMB_TWO_CARD,//四个带2张单牌
BOMB_TWOOO_CARD,//四个带2对
CONNECT_CARD,//连牌
COMPANY_CARD,//连队
AIRCRAFT_CARD,//飞机不带
AIRCRAFT_SINGLE_CARD,//飞机带单牌
AIRCRAFT_DOUBLE_CARD,//飞机带对子
ERROR_CARD
//错误的牌型
& & & & & & & & &那么在编程中我们该怎么来判断一组牌到底该属于哪一种牌型了??
& & & & & & & &这就是接下来我们将解决的问题,本文中可能有些判断牌型的方法不是很好,如果你有更好的方法,欢迎留言指导!~(@^_^@)~!!
& & & & & & & &首先我们可以根据穷举的方式来罗列一下。在我以前写斗地主的时候我是根据出牌的张数来罗列牌型的,下面我也将使用这种方法,因为没有找到什么更好的方法,嘿嘿!!那就让我们开始吧!
牌的张数 & 可能的牌型
1张牌 & & & & 单牌
2张牌 & & & & 对子(排除对鬼,因为这个在出牌中出现的次数比较少)
3张牌 & & & &3不带
4张牌 & & & 3带一 &炸弹
5张牌 & & & 连牌,3带1对
6,7,8,9.........
这里我们可以用出牌张数5作为分界线,因为5刚好是连牌的起始数并且出牌张数大于5之后就比较的复杂了。
我们首先定义一个数组来存放即将出牌的牌值。
在判断牌型之前将数组排序,排序规则:如果每张牌出现的次数一样,由小到大,如果不一样就将出现次数比较多的牌放在前面。比如(7,7,3,7)排序之后就变为(7,7,7,3),这样便于我们后面的判断。
出牌张数&5
& & & & 我们只需判断第一张和最后一张牌的牌值时候相等(因为我们数组已经按照我们事先的规则排序了),如果相等则直接返回牌的张数,这里牌的张数刚好对应我们前面定义的枚举结构值。如果不相等这里要分情况,当出牌的张数等于4时,判断第一张的牌值是否等于倒数第2张,如果相等我们可以直接返回THREE_ONE_CARD牌型,其余的情况可以直接返回ERROR_CARD 。
JudgeCardTpye(int * pArray,int lenght)
单牌,对子,3不带,炸弹通用算法
if(lenght&5) //小于5张牌
if(intArray[0]==intArray[lengh-1])
if (intArray[0]==intArray[lengh-2]&&lengh==4)
return THREE_ONE_CARD;
出牌张数&=5
当出牌张数大于5张时,所组成的牌型就比较的复杂了,可以有连牌,连对,飞机,4带2等一系列牌型。
我们先来分析一下每种牌型组成的情况
连牌:由所有的单牌组成&
连队:由所有的对子组成
飞机:由3个+对子,或者3个,或者3个+单张
4带2:4个+2张单牌,4个+2对牌,4个+1对牌
写一个计算数组中所有值是否为连续的方法。我们假设这个函数名叫做CheckContinuous,如果全连续返回true,否则返回false
下面是没种牌型的具体检查方法。
连牌牌型:if(CheckContinuous(出牌数组)==true)出牌数组中所有牌的牌值必须小于2
连队牌型:将出牌数组中的对子,挨个抽出,看是否还有剩余的牌,如果有剩余的牌就说明不能组成连队,则进行下面牌型的判断。如果没有剩余的牌,再根据判断连牌的方法来判断。(筛选条件:张数&=6张&&张数%2==0)
飞机和4带2就比较的复杂了,因为这2种牌型不像上面2种那样组成的牌比较单一,这2种牌型可以由很多种牌来组成。
接下来我们就可以定义一个结构体,来记录每种牌(单个,对子,3个,4个)出现的次数。最后我们只要根据结构体中每种牌出现的数量就很容易判断出到底是什么牌了。
struct &CRAD_INDEX
vector &int & &single_//记录单张的牌
vector&int& doble_ //记录对子的牌
vector&int &three_//记录3张
vector&int& four_//记录张
飞机牌型:
我们把能组成飞机的所有牌型列举出来:&,
通过一个遍历记录方法,上面结构体的值就变成这样了。
333444 & & & & & & & & & &&
single_index & & & & & & &空
doble_index & & & & & & &&空
three_index & & & & & & & 3,4
four_index & & & & & & & & &空
& & & & & & & & & & & &
single_index & & & & & & 5,6
doble_index & & & & & &&&空
three_index & & & & & & & 3,4
four_index & & & & & & & & 空
& & & & & & & & & & & &
single_index & & & & & & &空
doble_index & & & & & & &5,6
three_index & & & & & & & 3,4
four_index & & & & & & & & 空
这3种飞机牌型都有一个共同点,three_index 中的数据必须为连续的并且four_index 必须为空。这个也是最开始筛选的条件之一,如果这个条件都不满足则直接返回。
如果上面个条件满足,接下来计算一下牌的数量就OK了
飞机不带:three_index .sziz()*3==出牌的数量&&single_index+doble_index &==0
飞机带1张 :three_index .sziz()*3+single_index.size()==出牌的数量&&doble_index.size()==0
飞机带1对:three_index .sziz()*3+doble_index.size()*2==出牌的数量&&single_index.size()==0
同样4带2也可以这样来分析
4带2牌型(牌张数%2==0)
还是像上面一样来列举出具体的牌型来判断
single_index & & & & & & &2,3
doble_index & & & & & & 空
three_index & & & & & & & 空
four_index & & & & & & & & 4
single_index & & & & & & 空
doble_index & & & & & & 2
three_index & & & & & & & 空
four_index & & & & & & & & 4
single_index & & & & & & 空
doble_index & & & & & & 2,3
three_index & & & & & & & 空
four_index & & & & & & & & 4
首先找出必须满足的条件:four_index .size()必须等于1,并且出牌张数%2==0,并且three_index.size()==0
如果这个条件不满足则直接进行下面牌型的判断
如果满足就计算牌的张数
第一种情况: 带2张单牌
((four_index.size()==1&&single_index.size()==2)||(four_index.size()+single_index.size()*4==出牌的张数))
第二种情况 :带2对牌
((four_index.size()==1&&doble_index.size()==1)||(four_index.size()*2+single_index.size()*4==出牌的张数))
((four_index.size()==1&&doble_index.size()==2)||(four_index.size()*2+single_index.size()*4==出牌的张数))
至此所有的牌型就判断完毕了!!如果一副牌上面所有的牌型都不满足则是错误的牌型!!!小弟技术有限,如果你有更好的方法欢迎留言指导。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:141459次
积分:1847
积分:1847
排名:第17534名
原创:26篇
转载:12篇
评论:115条
棋牌游戏开发公司 QQ: 电话:
&&大话设计模式&&
阅读:56559
(1)(2)(2)(1)(3)(1)(1)(1)(1)(1)(4)(1)(2)(5)(13)很多棋牌游戏都有这种可以万能通用的癞子牌,现在就拿QQ游戏里的欢乐斗地主癞子场来举例。
假设手上有按降序排好序的N张非癞子牌,和M张癞子,要正确地将正常牌和癞子牌匹配出正确的牌型。
我个人的方案是根据角色出牌的张数来判断应有的牌型,比如他出3张相同的普通牌和1张癞子牌,那么就只可能是3带1和软炸弹。
有没有其他更加高效的求解方法来解决这个牌型匹配的问题呢?
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (2972) 次}

我要回帖

更多关于 斗地主棋牌游戏平台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信