芜湖麻将算法
- 格式:doc
- 大小:1.75 KB
- 文档页数:1
“芜湖麻将”算法规则(试行)很长时间都没有弄清芜湖麻将的算法,后经麻坛高手指点乃若有所悟,写下来以待行家指正。
一、“芜湖麻将”与周边地区不同,自成体系。
最大特点在于:成牌(胡牌)须同色八支牌以上(含八支),如果有两种花色都是八支(共16支),则为“双八支”,是全交的大嘴子(后面详述)。
二、最基本的胡牌算法是:平成一个,八支二个,庄家一个,所以是“三个的四个”。
但这里又有区别:所谓八支二个,是指8×2=16,四舍五入为二个,同理12支(12×2=24)也是二个,13支(13×2=36)就是三个了。
这一点我好长时间才明白,不知对不对?三、平成、丫档成、自摸成、自摸丫档成四种,分别是一个、二个、三个、四个。
庄家同样是一个、二个、三个、四个。
四、算嘴子的类别。
有一嘴算一嘴。
所谓嘴子,有四活、通天、对对胡、杠开、混一色共五种。
五、全交牌型必须有两个嘴子。
比如两个四活(双四活)、通天四活、杠开四活、混一色四活、混一色对对胡、混一色通天、杠开混一色、双八支、杠开对对胡均属于全交牌。
六、建议放炮者跟庄家一样付。
一般来讲,目前芜湖的麻将以三十个和五十个字码子为多。
八支成牌,有一嘴加一嘴。
成非全交的牌,字码子按平胡、丫档、自摸、自摸丫档分为四个层次。
以五十个字码子、一二三四加番为例,八支平胡为五个六个、八支自摸为十一十四、八支丫八为十个十十、自摸八支丫八为二十二十四。
全交的种类除清一色外,两嘴全交。
所谓嘴子,有四活、通天、对对胡、杠开。
比如,双四活、通天四活、杠开四活、混一色四活、混一色对对胡、混一色通天、杠开混一色、双八支、杠开对对胡均属于全交。
有的场合,混一色自摸、杠开丫档也属于全交牌种。
芜湖麻将最不合理的地方在于,一家点炮三家给。
不过目前正在改进中,有的地方已经开始放炮跟头家走。
类型支数成牌说明底番支番结果番数8平胡8支8/2=46(+2)9~10平胡(9~10)支(9~10)/2=57(+2)11~12平胡(11~12)支(11~12)/2=68(+2)押当8支:押(2)(8+2)/2=59(+4)押当8支:押(3~4)(8+3~4)/2=610(+4)押当8支:押(5~6)(8+5~6)/2=711(+4)押当8支:押(7~8)(8+7~8)/2=812(+4)押当9支:押(2~3)(9+2~3)/2=610(+4)押当9支:押(4~5)(9+4~5)/2=711(+4)押当9支:押(6~7)(9+6~7)/2=812(+4)押当9支:押(8)(9+8)/2=913(+4)押当10支:押2(10+2)/2=610(+4)押当10支:押(3~4)(10+3~4)/2=711(+4)押当10支:押(5~6)(10+5~6)/2=812(+4)押当10支:押(7~8)(10+7~8)/2=913(+4)押当11支:押(2~3)(11+2~3)/2=711(+4)押当11支:押(4~5)(11+4~5)/2=812(+4)押当11支:押(6~7)(11+6~7)/2=913(+4)押当11支:押(8)(11+8)/2=1014(+4)押当12支:押2(12+2)/2=711(+4)押当12支:押(3~4)(12+3~4)/2=812(+4)押当12支:押(5~6)(12+5~6)/2=913(+4)押当12支:押(7~8)(12+7~8)/2=1014(+4)8自摸8支8+6=1414(+6)9自摸9支9+6=1515(+6)10自摸10支10+6=1616(+6)11自摸11支11+6=1717(+6)12自摸12支12+6=1818(+6)自摸押当8支:押(2)8+2+8=1818(+8)自摸押当8支:押(3)8+3+8=1919(+8)自摸押当8支:押(4)8+4+8=2020(+8)自摸押当8支:押(5)8+5+8=2121(+8)911126自摸押当4108自摸押当82平胡8类型支数成牌说明底番支番结果番数自摸押当8支:押(6)8+6+8=2222(+8)自摸押当8支:押(7)8+7+8=2323(+8)自摸押当8支:押(8)8+8+8=2424(+8)自摸押当9支:押29+2+8=1919(+8)自摸押当9支:押39+3+8=2020(+8)自摸押当9支:押49+4+8=2121(+8)自摸押当9支:押59+5+8=2222(+8)自摸押当9支:押69+6+8=2323(+8)自摸押当9支:押79+7+8=2424(+8)自摸押当9支:押89+8+8=2525(+8)自摸押当10支:押210+2+8=2020(+8)自摸押当10支:押310+3+8=2121(+8)自摸押当10支:押410+4+8=2222(+8)自摸押当10支:押510+5+8=2323(+8)自摸押当10支:押610+6+8=2424(+8)自摸押当10支:押710+7+8=2525(+8)自摸押当10支:押810+8+8=2626(+8)自摸押当11支:押211+2+8=2121(+8)自摸押当11支:押311+3+8=2222(+8)自摸押当11支:押411+4+8=2323(+8)自摸押当11支:押511+5+8=2424(+8)自摸押当11支:押611+6+8=2525(+8)自摸押当11支:押711+7+8=2626(+8)自摸押当11支:押811+8+8=2727(+8)自摸押当12支:押212+2+8=2222(+8)自摸押当12支:押312+3+8=2323(+8)自摸押当12支:押412+4+8=2424(+8)自摸押当12支:押512+5+8=2525(+8)自摸押当12支:押612+6+8=2626(+8)自摸押当12支:押712+7+8=2727(+8)自摸押当12支:押812+8+8=2828(+8)981112108自摸押当明杠+2暗杠+4四活等+5自摸(四活等)嘴子翻倍。
小小麻将牌,浓缩千百年中国智慧,沸腾3亿人全球热情,一场牌局是游戏也是人生,方城里是朋友也是对手,牌已洗好人已入局,一场较量即将开始,然而牵制你的是手气,是技巧,还是其他未解之谜?让我们来一次解密麻将牌运之旅。
有这么一句话说,这世界上只要有人的地方就会有中国人,有中国人的地方就少不了麻将。
可见,麻将在我们中国人当中它的影响力有多大。
不过麻将虽然说参与的人多,但是对于麻将的了解大家又有多少呢?麻将的历史大概有多久呢?估计很多人都说不上来。
其实麻将当中这个骰子,它的历史就能够追溯到三千多年前的商纣王时期,而麻将本身,有一种说法就认为,它是由唐朝的名僧一行发明创造出来的,流传至今。
可惜发展到后来,这个娱乐的工具逐渐变成了赌博的工具,所以麻将在相当长的时间里给人的感觉和印象都是非常不好的,是跟一些不良嗜好联系在一起的。
到了1998年,国家体育总局正式颁布实施了《中国竞技麻将竞赛规则》之后,在很多有识之士的努力之下,麻将这项娱乐活动,这项运动才逐渐走上了一条健康之路。
不过,不管它对于是真正上比赛现场的竞技高手还是对我们的普通老百姓来说,麻将这个东西最神奇的地方,恐怕就在于手气,也就是专业人士所说的牌运。
牌运这个东西到底是什么?究竟我们能不能够人工地去控制它呢?今天的《走近科学》就为你揭开麻将牌运之谜。
这里是2005年10月中华麻将公开赛的会场,来自各个国家的100名麻将高手要在这里大赛三天一决高下,他们来的目的绝非赌博而是真正的竞技。
这里有黑马也有高手,甚至还有一些国家派出了职业牌手,然而,麻将本身是一种机会型游戏,那么对他们而言,要争取胜利是否也全凭运气呢?于光远:麻将是一种游戏游戏之一,它的特点就是,既是机遇性有运气的有手气的又是有本事动脑筋怎么打,所以两个混合性游戏的特点。
国家体育总局社会体育指导中心培训管理部主任邢小泉:你和聂卫平下棋,我敢说你下一千盘,下一万盘你都会输,但你和他打麻将就不一定。
也就是说,他可能会赢,你可能也有赢的机会。
吉安冲关麻将完全算法子:就是指牌注,一个子可以是一元,两元,五元,十元等。
冲关:牌面里的精累积到了5个或者5个以上,就叫冲关。
正、副精:一个正精是当2个算。
先以庄家为例:庄家算精:一个正精2×3=6个子(a×b,a表示每个玩家给的子数,3表示玩家数目);一个副精1×3=3个子冲关:(a×b)×c,a×b是一种算法,c是玩家数目。
例:五精冲关:(2×5)×3=30个子;六精冲关:(3×6)×3=54个子;七精冲关:(4×7)×3=84个子;八精冲关:(5×8)×3=120个子;九精冲关:(6×9)×3=162个子;十精冲关:(7×10)×3=210个子;十一精冲关:(8×11)×3=264个子;十二精冲关:(9×12)×3=324个子;如只有庄家有精,别人都没有,就叫“霸精”,乘以2。
例:五精霸精冲关30×2=60个子,六精霸精冲关54×2=108个子,以此类推。
庄家胡牌:下面是除去精得的子,胡一盘所进的子。
庄家平胡自摸:12个,每人4个子;庄家自摸无精:39个,每人13个,无精4个×2,再加5个;庄家自摸七对:24个,每人4个×2;庄家自摸无精七对:63个,每人4个×2×2,再加五个;庄家自摸大三对:48个,每人4个×2×2;庄家自摸无精大三对:111个,每人4个×2 ×2×2 ,每人再加五个;庄家自摸十三烂:24个,每人4个×2;庄家碧精十三烂:63个,每人4个×2×2,再加五个;庄家七星十三烂:48个,每人4个×2×2;庄家七星碧精十三烂:111个,每人4个×2×2×2,再加五个。
芜湖麻将算法规则(完整版)芜湖麻将分为30点和50点两种算法,即为每家起始点数为30点或50点,两种算法不尽相同。
玩家在开始前自行约定1点合为多少钱,一般为0.5元、1元或2元,当然也有更多的,即15元、30元或50元一局等。
麻将牌组成:筒、条、万的1至9,另任意四支风;成牌条件:筒、条、万三色至少有任一色达8支牌以上,不要求缺一门,风牌不属任何支牌型。
算法组成:牌支数、嘴子、胡牌、头家、开杠五种;嘴子:共五种,自摸胡牌算4点,非自摸胡牌算2点:1.四活:比如:一万、二万、三万,另有3支一万,则称为一万四活;2.混一色:牌型只有风(中发白板等)和筒条万中的任一种组成;3.一条龙:从1至9组成:123、456、789,且不再与其它牌组合成型;4.杠开:在开杠时摸牌就胡牌,称为杠开;5.对对胡:由四个三支与一对组成,不含如123的连牌;胡牌:分为四种:平胡、丫单平胡、自摸胡牌、自摸丫单胡牌,分别为一二三四点,在50点算法中也可以分为二四六八点;头家:与胡牌为相同点数,如果是头家胡牌,另三家均支付相应点数,如果非头家胡牌,由只需头家支付胡牌方相应点数;开杠:明杠:由其他方打牌开杠,算1点;暗杠:四支全由自己摸回来,算2点;在开明杠时如果其他方正好可胡此牌,则可抢杠胡牌,暗杠不可以抢杠胡;如果胡牌点数为二四六八,则开杠相应分别为2点和4点。
牌支数:由最多的同一色牌支数和丫单牌点数(不丫单的按0算)之和组成一个基数再乘以N,以乘积四舍五入到整十,结果是十的几倍则算为几点。
N的值:在30点算法中,自摸胡牌N=4,平胡牌N=2;在50点算法中,自摸胡牌N=10,平胡牌N=5;举例:30点算法中:自摸8支丫6,则为:(8+6)*4=56,四舍五入为60,即6点;平胡8支丫6,则为(8+6)*2=28,四舍五入为30,即3点。
50点算法中:自摸8支丫7,则为:(8+7)*10=150,即15点;平胡8支丫7,则为(8+7)*5=75,四舍五入为80,即8点。
芜湖麻将算法规则(完整版)芜湖麻将分为30点和50点两种算法,即为每家起始点数为30点或50点,两种算法不尽相同。
玩家在开始前自行约定1点合为多少钱,一般为0.5元、1元或2元,当然也有更多的,即15元、30元或50元一局等。
麻将牌组成:筒、条、万的1至9,另任意四支风;成牌条件:筒、条、万三色至少有任一色达8支牌以上,不要求缺一门,风牌不属任何支牌型。
算法组成:牌支数、嘴子、胡牌、头家、开杠五种;嘴子:共五种,自摸胡牌算4点,非自摸胡牌算2点:1.四活:比如:一万、二万、三万,另有3支一万,则称为一万四活;2.混一色:牌型只有风(中发白板等)和筒条万中的任一种组成;3.一条龙:从1至9组成:123、456、789,且不再与其它牌组合成型;4.杠开:在开杠时摸牌就胡牌,称为杠开;5.对对胡:由四个三支与一对组成,不含如123的连牌;胡牌:分为四种:平胡、丫单平胡、自摸胡牌、自摸丫单胡牌,分别为一二三四点,在50点算法中也可以分为二四六八点;头家:与胡牌为相同点数,如果是头家胡牌,另三家均支付相应点数,如果非头家胡牌,由只需头家支付胡牌方相应点数;开杠:明杠:由其他方打牌开杠,算1点;暗杠:四支全由自己摸回来,算2点;在开明杠时如果其他方正好可胡此牌,则可抢杠胡牌,暗杠不可以抢杠胡;如果胡牌点数为二四六八,则开杠相应分别为2点和4点。
牌支数:由最多的同一色牌支数和丫单牌点数(不丫单的按0算)之和组成一个基数再乘以N,以乘积四舍五入到整十,结果是十的几倍则算为几点。
N的值:在30点算法中,自摸胡牌N=4,平胡牌N=2;在50点算法中,自摸胡牌N=10,平胡牌N=5;举例:30点算法中:自摸8支丫6,则为:(8+6)*4=56,四舍五入为60,即6点;平胡8支丫6,则为(8+6)*2=28,四舍五入为30,即3点。
50点算法中:自摸8支丫7,则为:(8+7)*10=150,即15点;平胡8支丫7,则为(8+7)*5=75,四舍五入为80,即8点。
芜湖麻将是芜湖地区非常出名的棋牌类游戏,网络版芜湖麻将和正宗芜湖麻将的规则和其他技巧都是一样的,由958游戏平台推出,成为很多玩家必玩的项目。
打芜湖麻将多了,便多出了一些感悟,特别是关于牌风。
参与打麻将的人,由于职业不同、性格不同、修养不同、水平不同、习惯不同,表现出来的牌风也是不一样的。
性格与牌风是血肉相连的。
有什么样的性格就有什么样的牌风。
人的性格,是指对人、对事的态度和行为方式上所表现出来的心理特点.这些心理特点在麻将桌上表现得非常明显,有时候表现得淋漓尽致。
就打麻将的风格而言,有的严谨冷静,有的热情洒脱,有的稳重沉着,有的精明机巧,有的果断大胆,有的谨小镇微,有的爽直粗紊,有的烦躁虚浮,有的浪漫幽歌,有的边打边唠叨.有的边打边哼唱”李维中曾对我们四把“壶”的牌风,描述如下。
崔择:冷静,产谨,规范,一丝不苟。
杨家齐:工于计算,神出兔没,出其不意,攻其不备。
张家禄:手舞足蹈,返老还童,念念有词,妙语连珠。
李维中:顽强不言效,输牌不愉志,“妙不可言”是其口头禅。
诚哉,斯言!可见,我们打牌的风格是多样的。
其实以前对棋牌游戏不怎么感兴趣,后来朋友一起玩,推荐我玩芜湖麻将,结果一玩上就一发不可收拾呢,没事的时候,就喜欢在958游戏上玩会,不仅在其中找到一份不一样的快乐,更获得许多人生的领悟。
芜湖麻将貌似热闹有余,沉稳不足,少了象棋、围棋的深思熟虑,其实芜湖麻将蕴含着人生的哲理,他不仅单看个人,而是看大家的协作精神,在团队作战中,有人当炮灰,却是为了整个团队更好的发展,最终获得整个团队的荣誉。
芜湖麻将其实需要极强的思考能力,能够锻炼自己的思维能力。
其价值取向上融合了围棋精神和桥牌精神,在此不能逞莽夫之勇,而是需要以智谋取胜,生活中许多事都是需要三思而后行的。
其实棋牌游戏自身都蕴含着哲理,看你善不善于去发现这些生活的启示,如果只是纯粹娱乐了,那就少了棋牌游戏的另一番韵味,正所谓来源于生活,而它应该更高于生活。
[参考]麻将胡牌算法/*万牌: 一万至九万,用1~9表示条牌: 一条至九条,用21~29表示筒牌: 一筒至九筒,用41~49表示字牌: 东61, 南64, 西67, 北70, 中73, 发76, 白79百搭: 用100表示麻将中以十四张牌计算胡牌胡牌的基本牌型aa xxx xxx xxx xxx(注:aa=将或对子 xxx=任意的顺子(如123)、刻子(如444)) */#include#define bd 100 //wild card#define maxg 14 //the max. number of groups divided #define maxc 28 //the max. number of groups createdint mjlist[14];int select[14];int glist[maxg][maxc][3];int trace[maxg][3];int node;int creategroup(int d);void makegroup(int gr[]);void unmakegroup(int gr[]);int search(int d);int iswin();void disp();main(){int i, j;cout << "万牌: 一万至九万,用1~9表示"<cout << "条牌: 一条至九条,用21~29表示"<cout << "筒牌: 一筒至九筒,用41~49表示"<cout << "字牌: 东61, 南64, 西67, 北70, 中73, 发76, 白79"< cout << "百搭: 用100表示"<<endl<cout << "请按从小到大输入牌局:"<int mj[14];for(i=0; i<14; i++){cin>>mj[i];mjlist[i] = mj[i];}cout << "mj list:";for(i=0; i<14; i++){cout << " " << mjlist[i];cout << endl;for(i=0; i<14; i++)select[i] = 0;for(i=0; ifor(j=0; j<3; j++)trace[i][j] = -2;node = 0;int r;r = search(0);// cout<<"node:"<<node< if(r){disp();cout << "win !" << endl; }elsecout << "fail !"<< endl;return 0;}int creategroup(int d){int c,c1,i,j,k,t,nbd;nbd = 0;for(i=0; i<14; i++){if(mjlist[i] == bd)nbd++;}for(i=0; i{if(trace[i][1]==-1 || trace[i][2]!=-1) continue;if(mjlist[trace[i][0]] != mjlist[trace[i][1]]) nbd--;}if (nbd<0){return -1;}for(c=0; c{glist[d][c][0] = -1;glist[d][c][1] = -1;glist[d][c][2] = -1;}c = 0;t = -1;for(i=0; i<14; i++) // search ke zi{if(select[i]==1 || t==mjlist[i] || mjlist[i]==bd) cont</node<</endl<inue;t = mjlist[i];k = 0;for(j=i; j<14; j++)if(mjlist[j]==t){glist[d][c][k] = j;k++;if(k==3)break;}c++;}c1 = c;t = -1;for(i=0; i<14; i++) // search shun zi{if(select[i]==1 || t==mjlist[i] || mjlist[i]==bd) continue;t = mjlist[i];k = 0;for(j=i; j<14; j++)if(mjlist[j]==t+1 && select[j]==0){k++;glist[d][c][k] = j;break;}for(j=i; j<14; j++)if(mjlist[j]==t+2 && select[j]==0){k++;glist[d][c][k] = j;break;}if(k+nbd >= 2){glist[d][c][0] = i;c++;c1 -= k;}}if(c1>5)return -1;return c;}void makegroup(int gr[]) {int i;for (i=0; i<3; i++){if(gr[i] != -1)select[gr[i]] = 1;}}void unmakegroup(int gr[]) {}int search(int d){node++;int count, i, j, res;int orgsel[14];count = creategroup(d);if(count==0)return iswin();if(d==5 && count>0) return 0;for(i=0; i{for(j=0; j<14; j++) orgsel[j] = select[j];makegroup(glist[d][i]);trace[d][0] = glist[d][i][0]; trace[d][1] = glist[d][i][1]; trace[d][2] = glist[d][i][2];res = search(d+1);for(j=0; j<14; j++) // unmake select[j] = orgsel[j];if(res==0){trace[d][0] = -2;trace[d][1] = -2;trace[d][2] = -2;}if (res)return 1;}return 0;}int iswin(){int d, i, sum;int grlen[maxg]; // group lengthfor(d=0; d{grlen[d] = 0;}for(d=0; ;d++){if(trace[d][0]==-2)break;int t = mjlist[trace[d][1]] - mjlist[trace[d][0]]; if(t==1 || t==2) // shun zi groupgrlen[d] = 3;else{for(i=0; i<3; i++)if(trace[d][i] != -1)grlen[d]++;if(grlen[d]<2)grlen[d] = 2;}}sum = 0;for(d=0; d{sum += grlen[d];}if(sum <= 14) // sum is the minimum length return 1;elsereturn 0;}void disp(){int i, j, n;int gdisp[maxg][3];for(i=0; i{gdisp[i][0] = 0;gdisp[i][1] = 0;gdisp[i][2] = 0;}n = 0;for(i=0; i<14; i++)if(mjlist[i] == bd)n++;for(i=0; i{if(trace[i][0] == -2)break;gdisp[i][0] = mjlist[trace[i][0]];if (trace[i][1] != -1)gdisp[i][1] = mjlist[trace[i][1]];if (trace[i][2] != -1)gdisp[i][2] = mjlist[trace[i][2]];}for(i=0; i{if(n==0 || gdisp[i][0]==0)break;if(gdisp[i][1] == 0){gdisp[i][1] = bd;n--;continue;}if(gdisp[i][2]==0 && gdisp[i][0]!=gdisp[i][1]) {gdisp[i][2] = bd;n--;}}for(i=0; ;i++) {if(n==0) break;if(gdisp[i][0]==0) {gdisp[i][0] = bd; n--;if(n==0) break;}if(gdisp[i][1]==0) {gdisp[i][1] = bd; n--;if(n==0) break;}if(gdisp[i][2]==0) {gdisp[i][2] = bd; n--;if(n==0) break;}for(i=0; i{if(gdisp[i][0]==0) break;for(j=0; j<3; j++){if(gdisp[i][j] == 0) break;cout << gdisp[i][j] <<" "; }cout << endl;}cout << endl;}发表者:heavenchang。
⿇将普通胡牌算法JS版(含癞⼦,⾮轮训)记录⼀下⿇将的通⽤胡牌算法实现,只要满⾜X*ABC + Y*DDD + EE 即可胡牌。
在这⾥先分析⼀下最简单的胡牌思路:先找出所有可能的将牌,若除去两张将牌之外的所有牌都能成刻或顺,则可胡牌。
将牌就是公式⾥唯⼀的对⼦即是EE、顺⼦ABC或者刻⼦DDD。
将牌的查找:遍历每张⼿牌,若有两张以上相同牌就能作将,或者⽤⼀张癞⼦凑也可。
接下来就只要判断⼀副牌是否成扑,伪码如下:function isShunKe=(牌){ // 这⾥约定传⼊的牌是有序的、张数是3的倍数if(没牌){return true;}if(若第⼀张是顺⼦中的⼀张){if(isShunKe(去掉该顺⼦剩下的牌)){return true;}}if(若第⼀张是刻⼦中的⼀张){if(isShunKe(去掉该刻⼦剩下的牌)){return true;}}return false;}只要思路清晰了算法就很简单,为什么只考虑第⼀张牌?其实函数内部递归调⽤了每张牌都会计算到的,除⾮没牌了。
下⾯给出详细代码:function isShunKe(cards, laiziCount){if (cards.length === 0){return true;}// 若第⼀张是顺⼦中的⼀张for (var first = cards[0] - 2; first <= cards[0]; first++) {if(first % 10 > 7 || (laiziCount === 0 && first < cards[0])) {// 顺⼦第⼀张牌不会⼤于7点、⽆赖⼦情况下顺⼦第⼀张只能⽤⼿上的牌 continue;}var shunCount = 0;for (var i=0;i<3;i++) {if (cards.indexOf(first + i) >= 0) {shunCount++;}}if (shunCount === 3 || shunCount + laiziCount >= 3) {// 找到包含第⼀张牌的顺⼦var puCards = cards.slice();var puLaizi = laiziCount;for (var i=0; i<3; i++) {var deletePos = puCards.indexOf(first + i);if (deletePos >= 0) {puCards.splice(deletePos, 1);}else {puLaizi--;}}if (isShunKe(puCards, puLaizi)) {// 剩下的牌成扑return true;}}}// 若第⼀张是刻⼦中的⼀张var keziCount = 1;var keziCard = cards[0];if (cards[1] === keziCard) {keziCount++;}if (cards[2] === keziCard) {keziCount++;}if (keziCount === 3 || keziCount + laiziCount >= 3) {var puCards = cards.slice();var puLaizi = laiziCount;for (var i = 0; i < 3; i++) {var deletePos = puCards.indexOf(keziCard);if (deletePos >= 0) {puCards.splice(deletePos, 1);}else {puLaizi--;}}if (isShunKe(puCards, puLaizi)) {return true;}}return false;}下⾯是判断胡牌的函数:function canHuLaizi(cards, laiziCount) {if ((cards.length + laiziCount + 1) % 3 != 0) {// 若牌张数不是2、5、8、11、14则不能胡return false;}// 排序⽅便胡牌判断cards.sort(function(a, b) {return a - b;})// 依次删除⼀对牌做将,其余牌全部成扑则可胡for (var i = 0; i < cards.length; i++) {if (i > 0 && cards[i] == cards[i - 1]){// 和上⼀次是同样的牌,避免重复计算continue;}if ((i + 1 < cards.length && cards[i] == cards[i + 1]) || laiziCount > 0) {// 找到对⼦、或是⽤⼀张癞⼦拼出的对⼦var puCards = cards.slice();var puLaizi = laiziCount;puCards.splice(i, 1);if (puCards[i] == cards[i]) {puCards.splice(i, 1);}else {puLaizi--;}// 删去对⼦判断剩下的牌是否成扑if (isShunKe(puCards, puLaizi)) {return true;}}}if (laiziCount >= 2 && isShunKe(cards, laiziCount - 2)) {// 两个癞⼦做将牌特殊判定处理return true;}return false;}这⾥做⼀下两个输⼊参数的说明:1. cards:⼿牌数组,不超过14张牌,每张牌由整数表⽰如下2. 数字 {01 ~ 09} 表⽰ {1 ~ 9} 筒数字 {11 ~ 19} 表⽰ {1 ~ 9} 条数字 {21 ~ 29} 表⽰ {1 ~ 9} 万数字 {31 33 35 37 } 表⽰风 { 东 南 西 北 } // 为什么间隔两个数字记录⼀个,就是为了防⽌将⾃拍在⾃⼰算过程中组成顺⼦数字 {41 43 45} 表⽰箭 {中 發 ⽩}3. laiziCount:癞⼦数量,⽤整数表⽰有关算法代码重构,这⾥有个⼩技巧:使⽤随机⽣成的牌型数据,将新版本代码与⽼版本代码对⽐,当运算结果不⼀样时候可以快速的找出bug,也可以循环⼤量输⼊统计耗时⽐较效率。
芜湖麻将315算法
2009-02-06 04:28:17 来自: GEEK(物是人非什么的,最让人心生惆怅)
一.成牌要八支,每人三十个纸码。
二.成牌类型:1.平胡 2.押档 3.自摸 4. 自摸押档
三.嘴子:所谓嘴子,就是混一色,对对胡,四核,通天,杠后开花。
如果成牌的时候有两个嘴子的话则全交。
比如混一色对对胡全交,四核通天全交,等等。
而清一色,双八支算两嘴,如果是自摸的话除了全交还要加钱,315是一家加5块。
就是说自摸清一色一家要给20。
四.底番算法:平胡的底番是1个,押档的底番是2个,自摸的底番是3个,自摸押档的底番是4个。
五.支番算法:按成牌的支数算,如果是八支平胡成的话,8*2=16,四舍五入的话是 20, 20/10= 2,所以支番就是2。
再加上平胡的底番1个,总共就是3个。
庄家输牌多付一倍底番,就是1*2+2=4,如果是庄家成牌的话,那输牌的就要多付给庄家底番,同样也是4个。
因为平胡就算成牌有12支,支番也是2。
所以,平胡也就是俗称的“萝卜”,不算嘴子和杠的话,成牌是3个~4个,若是庄家成牌的话就是俗称的“萝卜头”或“大萝卜”,那就是每家都给4个。
如果是成押档的话,算法基本相同。
比如八支押三(“三”就是成的那张牌的点数,比如三万,三条),算法就是,(8+3)*2 = 22,四舍五入是20,20/10=2,支番是2。
加上底番2个,
所以八支押三的番数是4个,庄家多付底番,所以是4个~6个。
同样,庄家成的话,每个给6个。
自摸分为自摸押档和不押档。
自摸不押档,只看支数,比如是8支成牌,由于自摸支番和嘴子都要翻番,所以和平胡不同的是,8*4= 32 ,四舍五入是30,30/10= 3,支番是3,加上底番3个,总共是6个。
庄家多付底番,所以是6个~9个。
庄家成的话,每人给9个。
8支自摸不押档是自摸最小的牌,所以只要你自摸至少都会有6个~9个。
自摸押档的话,不仅要看成牌的支数,还要看成的牌的点数,如自摸八支押三,支番的算法是:(8+3)*4 = 44 ,四舍五入是40,再除以10,所以支番是4。
底番也是4,所以总共是8番。
庄家多付底番,所以是8个~12个,庄家成的话,每个给12个。
六.嘴子和杠:如果成牌时有一个嘴子的牌的话,没有自摸的话加2番,自摸的话嘴子翻番加4番。
有明杠的话,加1番,暗杠加2番。