麻将什么时候听牌里什么是听牌

麻将听牌(叫胡)类型_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
麻将听牌(叫胡)类型
上传于||暂无简介
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢感觉网上关于麻将的源码资源很少,一般这种算法都是用递归,把牌堆分解成若干子牌堆然后针对2-3张牌的情形给出一个出口。
和牌算法比较常见,毕竟只要是麻将编程都要用到,后面两种虽然普通的麻将编程用不到,但是要编写AI对策以及某些特殊规则(例如日本麻将)就有用了,尤其一向听的算法。
三种算法原理差不多,都是先分析牌数较少的情形,然后牌数较多的情形通过牌堆分解后,对提取剩余牌堆调用自身。
本源码使用C++,分MDeck和MDeckExtract类。这两个类定义如下:
typedef int MT
class MDeckE
class MDeck
MTile tile[200];
class MDeckExtract
int methodC
MDeck extracted[10];
MDeck remained[10];
其中MDeck类实际上就是一个由MTile(int)组成的数组和牌堆长度,跟CArray类很像。
而MDeckExtract类则用于存储牌堆的提取结果。其中methodCount是提取方案的数目,extracted存储提取方案中可以提取的目标牌堆,remain则存储剩余牌堆。举个简单的例子:
例如一个牌堆为 3,3,4,5,6,若对其进行顺子提取操作,则MDeckExtract应该是这样的:
methodCount 为 2,即两种提取方案。
extracted[0]为3,4,5,remain[0]为3,6;extracted[1]为4,5,6,remain[1]为3,3。
接下来是提取方法(其中有的较为简单的方法的定义例如牌堆排序、创建不包含重复的牌的副本、牌堆连接、加入等方法就不帖进来了,很容易实现)的源码。
&MDeckExtract MDeck::extractDuizi(){
sortTile();
int i = 0;
MDeck dr = removeRepeatedTile();
for(i = 0;i&dr.i++){
t = dr.tile[i];
dt = (*this);
de.length = 0;
if(dt.countTile(t)&1){
dt.removeTile(t);
dt.removeTile(t);
de.pushTile(t);
de.pushTile(t);
e.extracted[e.methodCount] =
e.remained[e.methodCount] =
e.methodCount ++;
MDeckExtract MDeck::extractShunzi(){
sortTile();
int i = 0;
MDeck dr = removeRepeatedTile();
for(i = 0;i&dr.i++){
t = dr.tile[i];
dt = (*this);
de.length = 0;
if(dt.countTile(t+1)&0 && dt.countTile(t+2)&0){
dt.removeTile(t);
dt.removeTile(t+1);
dt.removeTile(t+2);
de.pushTile(t);
de.pushTile(t+1);
de.pushTile(t+2);
e.extracted[e.methodCount] =
e.remained[e.methodCount] =
e.methodCount ++;
MDeckExtract MDeck::extractKezi(){
sortTile();
int i = 0;
MDeck dr = removeRepeatedTile();
for(i = 0;i&dr.i++){
t = dr.tile[i];
dt = (*this);
de.length = 0;
if(dt.countTile(t)&2){
dt.removeTile(t);
dt.removeTile(t);
dt.removeTile(t);
de.pushTile(t);
de.pushTile(t);
de.pushTile(t);
e.extracted[e.methodCount] =
e.remained[e.methodCount] =
e.methodCount ++;
接下来就是基于牌堆分解递归的和牌算法。大致步骤如下(这个大家似乎都经常用):
1. 检查牌堆长度是否被3除余2(因为和牌情况只能是2、5、8、11、14等张数的情形),若不是,返回false。
2. 检查牌堆是否满足特殊情况,例如七对子(有的规则里有国士无双等),若是,返回true,否则继续。
3. 检查牌堆长度是否为2,若是,则牌堆两张相同则返回true,否则返回false;若长度不为2,则继续。
4. 对牌堆进行顺子提取,然后对提取结果中的remain(Deck数组)里的每个元素(Deck)分别执行该算法,只要有一个元素(Deck)执行结果为true,则直接返回true,否则继续。
5. 对牌堆进行刻子提取,然后对提取结果中的remain(Deck数组)里的每个元素(Deck)分别执行该算法,只要有一个元素(Deck)执行结果为true,则直接返回true,否则继续。
6. 返回false。
bool MDeck::isHu(){
//对特殊情况判别
if(length == 14){
e = extractDuizi();
if(e.methodCount == 7){
//对一般情况判别
if(length % 3 != 2){
if(length == 2){
if(isDuizi()){
e = extractKezi();
for(i = 0;i&e.methodCi++){
if(e.remained[i].isHu()){
e = extractShunzi();
for(i = 0;i&e.methodCi++){
if(e.remained[i].isHu()){
然后是基于牌堆分解递归的听牌算法。
所谓听牌,就是手里的牌再加一张就能构成一副和牌。
听牌算法其实可以使用和牌算法和对所有麻将牌的遍历来实现,但是这样极端影响速度,因此最好还是从本源做起。
听牌跟和牌不一样,因为听牌方式有3种,分别是摸一张构成对子(单骑)、刻子(对倒)、顺子(边张或者砍张)。而构成牌的数目也不同,分别是2、3、3,因此,听牌牌堆的长度应该满足2+3N-1或者3+3N-1即被3除余1或者2,因此被3整除的情形是肯定不能算听牌的。
该算法返回牌堆能听的所有牌,大致步骤如下:
1. 初始化返回结果,置为空牌堆。
2. 检查牌堆长度是否被3整除,若是,返回空牌堆,否则继续(如果不对这种情况进行处理,则自然而然就返回空牌堆了,所以这步可以去掉)。
3. 检查牌堆长度是否为13,若是,检查是否有6组对子,如果有,则听剩余的那张牌(七对子的规则),将其加入返回结果;不管有没有6组对子,都继续进行。
4. 检查牌堆长度是否为1,若是,将仅有的这张牌加入返回结果(单骑听牌),然后继续进行。
5. 检查牌堆长度是否为2,若是,分以下情况进行讨论:
a) 两张牌相同,将这张牌加入返回结果(双碰听牌),然后继续进行。
b) 两张牌相邻,将两张牌往两边扩展的那张牌(例如7,8则扩展的牌为6和9,若为8和9则只有7)均加入返回结果(边张听牌),然后继续进行。
c) 两张牌隔一,将这两张牌中间的那张牌(例如6,8则中间那张牌为7)加入返回结果(砍张听牌),然后继续进行。
d) 不满足以上三种情形,则不加入,并继续进行。
6. 检查牌堆长度是否为4,若是,依次对其进行对子提取,刻子提取和顺子提取,并将提取结果的remain数组里的每个元素(Deck)都做听牌算法,并将结果悉数加入返回结果,然后继续进行。
7. 检查牌堆长度是否大于4,若是,依次对其进行刻子提取和顺子提取(同6一样,只不过不做对子提取),并将提取结果的remain数组里的每个元素(Deck)都做听牌算法,并将结果悉数加入返回结果,然后继续进行。
8. 将这个返回结果的非重复牌堆副本作为返回值,OK。
MDeck MDeck::ting(){
//特殊情况
if(length == 13){
dr = removeRepeatedTile();
e = extractDuizi();
if(e.methodCount == 6){
for(i=0;i&dr.i++){
if(countTile(dr.tile[i])==1){
result.pushTile(dr.tile[i]);
if(length == 1){
result.pushTile(tile[0]);
if(length == 2){
if(isDuizi()){
result.pushTile(tile[0]);
if(isShangbianzhang()){
result.pushTile(tile[0]-1);
if(isXiabianzhang()){
result.pushTile(tile[0]+2);
if(isKanzhang()){
result.pushTile(tile[0]+1);
if(isLiangmian()){
result.pushTile(tile[0]-1);
result.pushTile(tile[0]+2);
if(length == 4){
e = extractDuizi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].ting());
e = extractKezi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].ting());
e = extractShunzi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].ting());
if(length & 4){
e = extractKezi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].ting());
e = extractShunzi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].ting());
return result.removeRepeatedTile();
最后是基于牌堆分解递归的一向听算法。
所谓一向听,就是牌堆打出一张后进入听牌的状态。例如制作麻将游戏中,玩家摸到牌后,判断听牌按钮是否会亮起就需要该方法的支撑;日本麻将中的能否进行“立直”也需要该算法的支撑。
同听牌算法一样,一向听的算法可以根据听牌算法和对手牌的遍历来实现,但是该方法也是特别耗时……
如果从源头做起的话,一向听的分析方式要比听牌还要复杂……该方法返回所有打出的牌使其成为听牌状态的集合,具体步骤如下:
1. 初始化返回结果,置为空牌堆。
2. 检查牌堆是否已经构成和牌,若是,则返回牌堆本身,否则继续(这步可以省略,某些极端情况可以大量减少运行时间,毕竟玩麻将基本遇不到自己和牌后不宣告和牌反而报听的。如果是检测算法的运算效率,强烈建议不要添加这步)。
3. 检查牌堆长度是否被3除余1,若是,返回空牌堆,否则继续(如果不对这种情况进行处理,则自然而然就返回空牌堆了,所以这步可以去掉)。
4. 检查牌堆长度是否为14,若是,检查是否有7组对子,如果有,则将每一个对子的牌加入返回结果(即七对子已经和牌);若有6组对子,将剩余的两张落单的牌加入返回结果(也就是说,打出任何一张落单的牌都能进入七对子听牌状态),然后继续进行。
5. 检查牌堆长度是否为2,若是,将这两张牌加入返回结果,然后继续进行。
6. 检查牌堆长度是否为3,若是,则:若任意两张牌数值距离&=2,则将第三张牌加入返回结果,然后继续进行。
例如,这三张牌是2,3,5,由于2和3距离位1&2,因此将5加入返回结果;2和5的距离为3&2,PASS;3和5的距离为2,将2加入返回结果,总共就是将2和5加入返回结果。
7. 检查牌堆长度是否为5,若是,依次对其进行对子提取,刻子提取和顺子提取,并将提取结果的remain数组里的每个元素(Deck)都做一向听算法,并将结果悉数加入返回结果,然后继续进行。
8. 检查牌堆长度是否大于5,若是,依次对其进行刻子提取和顺子提取(同7一样,只不过不做对子提取),并将提取结果的remain数组里的每个元素(Deck)都做一向听算法,并将结果悉数加入返回结果,然后继续进行。
9. 将这个返回结果的非重复牌堆副本作为返回值,OK。
MDeck MDeck::xting(){
//特殊情况
if(length == 14){
dr = removeRepeatedTile();
e = extractDuizi();
if(e.methodCount == 7){
for(i=0;i&7;i++){
result.pushTile(tile[i]);
if(e.methodCount == 6){
for(i=0;i&dr.i++){
if(countTile(dr.tile[i]) % 2 ==1){
result.pushTile(dr.tile[i]);
if(length == 2){
result.pushTile(tile[0]);
result.pushTile(tile[1]);
if(length == 3){
if (isDiffBelow2(tile[0], tile[1])) {
result.pushTile(tile[2]);
if (isDiffBelow2(tile[0], tile[2])) {
result.pushTile(tile[1]);
if (isDiffBelow2(tile[1], tile[2])) {
result.pushTile(tile[0]);
if(length == 5){
e = extractDuizi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].xting());
e = extractKezi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].xting());
e = extractShunzi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].xting());
if(length & 5){
e = extractKezi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].xting());
e = extractShunzi();
for(i = 0;i&e.methodCi++){
bineDeck(e.remained[i].xting());
return result.removeRepeatedTile();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:150次
排名:千里之外麻将里听是什么意思-学网-提供健康,养生,留学,移民,创业,汽车等信息
麻将里听是什么意思
点听就不用在自己出牌了,系统帮你自动出牌,知道有你胡的那一张听牌就是指手上的牌已经成形,等对方打出或自己摸到需要的一张牌就可以胡牌,简单的说就是你就差一张牌就胡了. 如果你是玩的电脑麻将,选择听牌后,你胡牌了会多一番听牌是麻将游戏术语,是局中只差所需要的一张牌即能胡牌的状态。 如当你的牌型组成... 听牌是你胡牌前缺一张牌(如34条,3个3筒,3个南风,123万,一对5万,这个时候你就听了,可... 也就是说快要胡牌了。 术语,牌局之中,到达了「只要再凑一张即可成功胡牌」的阶段,就叫「听牌」。 听就是差一张牌能胡牌了...麻将 具体怎么打建议你看看游戏说明每个地方说法不一样,如果一起牌就听牌的话一般叫"天听",一起牌叫"天和",很少见。闭门听在我们这里一般指的是不吃不碰并且听牌(山东地区) 听是你牌面就差一张就胡了 听之后就不能自由打了只能等你那张缺的 听牌糊了有加倍天听?就是庄家第一把就听牌 连七~就是连庄七次 连七拉七 我是台湾人 不过台湾麻将分两种 一种南部麻将 一种北部麻将 南部麻将没有花牌 北部麻将有花牌就说明你要胡牌了 必须叫别人知道 这是QQ麻将的规定 而且听的时候就必须胡你想要的那颗牌 也就是说在听以后抓来不能胡的其他什么牌都要打出去
您可能还关注:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
大类导航: |& & 当前位置
欢乐麻将攻略 你听的是啥!听牌有技巧
  腾讯的最新手机游戏《欢乐麻将》已经正式登陆iOS,玩家现在可以在手机上体验实时的麻将对战。本作是腾讯倾力打造的一款经典国粹棋牌游戏。时尚简约的中国风画面,真人实时对战玩法,陪伴你欢乐每一天。在欢乐麻将中,其实村子了许多的技巧攻略,今天小编给小伙伴们带来一瓶啊,欢乐麻将攻略,教小伙伴怎样在游戏中听牌。
  听多门:一个数列通常会听好几个洞,比如二三四五,听二五,二三四五六,听一四七。不过小伙伴们必须注意胡其中某些牌可能破坏牌型(如一条龙、平胡....)
  听单调:及一张单张牌,要凑一个对子(将牌)
  听中洞:例如二四万,听中洞三万。(俗称“卡隆)
  听边张:例如七八万,听九万。
  听对对:留有两组对子,只要再凑一组刻子,另一组当将牌,因此听两张
  以上就是今天小编给小伙伴们带来的 ,欢乐麻将攻略。小伙伴们现在你们知道了在欢乐麻将中怎么样听牌了吗?更多的欢乐麻将规则、攻略、资讯尽在口袋巴士【欢乐麻将专区】
责任编辑:admin
24小时更新
··········
················
新游戏评测
驯龙战机3D是一款飞行射击类手游,在游戏中飞龙是玩家的重要战斗伙伴,拥有一条好的飞龙能够让大家挑战关卡轻松很多,很多飞龙都是需要大家解锁来获得的,下面小编给大家主要讲
天天酷跑孔雀灵王是小伙伴们非常期待的ss神宠,小伙伴们都在等待它的上架,那么它的属性和技能大家了解吗?下面小爱哦吧给大家带来了天天酷跑超强神宠孔雀灵王属性技能讲解,感
乱斗西游排行榜是小伙伴们非常喜欢的玩法,很多小伙伴都在不断的冲击排行榜,那么在排行榜中我们要如何搭配呢?下面小编给大家带来了乱斗西游排行榜最强搭配组合推荐,感兴趣的
今天7k7k小编为大家带来的最新消息,天天风之旅S级宠物土豪卷纸来了~腾讯首款3D轻动作跑酷手游《天天风之旅》于10月31日喜迎双平台上线。在迎来iOS小伙伴们的同时,最受欢迎的“土
今天7k7k小编为大家带来的是天天风之旅的角色介绍,下面是天天风之旅忍者的详细玩法介绍,希望大家可以喜欢。天天风之旅是一款腾讯自研的3D轻动作跑酷手游。在传统的跑酷游戏基
爱养成2是一款美少女养成游戏,一改前作俏皮的风格,续作把故事设定在降魔师与魔王的时代。而在本作中,玩家也不需要再顶着大叔的头像,而是可以自行选择性别,这对于喜爱《爱
《糖果粉碎苏打传奇》增加了不少适合夏天品尝的甜点,比如说苏打和果冻等等,玩法也因此发生了改变,更加缤纷的色彩和口味,难度却不降反升,“糖果粉碎”系列仍然保留了以甜
Rainblocks《雨滴方块》这个复古像素风的小游戏,就是一个精简版的九宫格游戏,在一定程度上简化了玩法,又通过各种小道具的设置来丰富游戏的趣味性,实是一个令人上瘾的小游戏。
通过360安全认证

我要回帖

更多关于 麻将听牌 的文章

 

随机推荐