这一段时间棋牌类非常火,这里简单的实现一下麻将的胡牌算法,算法很简单,核心代码就小几十行。由于本人不太会玩麻将,所以有些专用名词不会叫,知道意思就行。由于每个地方的麻将玩法都不太一样,我们这里先就用一些通用的胡牌规则3n+2的形式,还有最后只剩下一个对子也算胡牌。下面我们简单的介绍一下算法,然后贴一个java实现的代码。
麻将的大概:
麻将一共有34种牌,东,南,西,北,红中,白板,发财,一万--九万,一条--九条,一筒--九筒,总共136张牌。
数据结构:
我们把34种牌定义成一个byte[34]或int[34]的数组,我们这边就用int[34]。每个玩家身上都放一个int[34]的数组,牌数最多是14张,下标表示牌的类型,内容表示牌的数量,类似下图:(东风写成东方了,懒的改了)
算法描述:
1、找到所有数量是2张或2张以上的牌,放到一个列表里面,这里的操作不影响玩家手中的牌,不要删掉对子。
2、对上面的列表进行遍历,这时把玩家手中的牌去掉一个相应的对子,如果剩下的牌是3n类型的,也就是说要么3张一样,要么都能结合成1+2+3这种牌型的,那么就算胡牌。
3、接上面,如何判断是3n类型的?首先遍历玩家手上的int[34]数组,每个牌种有5种数量,就是说可以有0到4张牌。
a、在下标小于7时,就是上面的“东,南,西,北,红中,白板,发财”,因为它们不能组成1+2+3这种模式,所以只要它们不等于3就说明不是胡牌。
b、下标7--16(不含),16--25(不含),25-34(不含),这三段的处理方式一致。
*当该牌的数量是0时,则跳过,执行下一种牌;
*当为1时,一定要和后面的2张牌构成一个“顺子”,如果构不成,那就不是胡牌。能构成,则把相应的牌数量减去1,然后执行下一种牌;
*当为2时,方法和1一样,但是执行的不是下一种牌,而是还是当前的牌;
*当为3时,因为可以构成一个“杠”,所以直接跳过执行下一种牌,(这里会涉及到另一种情况,比如3*3*3,每种连续的牌都有三张,可能因为结算的倍数不一致而导致算法不一样,这个具体看麻将规则)。
*当为4时,先执行为1时的步骤,然后执行为3时的步骤。
4、上方的遍历时可以使用递归的调用。
java代码:由于时间花的不多,难免有差错。个人网站:http://www.pengmj.com/396.html
public class Mahjong { final static String[] paicn = {"东","南","西","北","红","财","白","一万","二万","三万","四万","五万","六万","七万","八万","九万","一条","二条","三条","四条","五条","六条","七条","八条","九条","一筒","二筒","三筒","四筒","五筒","六筒","七筒","八筒","九筒"}; final static int MJMAX = 136; /** * 手上的牌数 */ final static int PLAYINITCOUNT = 14; /** * 麻将的种类 */ public final static int MAX_SIZE = 34; public static void main(String[] args) { long l = System.currentTimeMillis(); int[] pai = new int[MAX_SIZE]; //这里是简单的随机发牌 int[] all = new int[MJMAX]; for(int n=0;n<4;n++){ for(int j=0;j<MAX_SIZE;j++){ all[n*MAX_SIZE+j] = j; } } Set fapai = new HashSet(); int c = 0; while(true){ Random ran = new Random(); int t = (int)(ran.nextDouble()*MJMAX); if(fapai.contains(t))continue; fapai.add(t); c++; if(c==PLAYINITCOUNT) break; } for(Iterator it=fapai.iterator();it.hasNext();){ pai[all[it.next().intValue()]]++; } //~~~~~ //int[] pai = {0,3,0,2,0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; for(int i=0;i<MAX_SIZE;i++){//打印一下手中牌的中文 if(pai[i]==0)continue; int j = pai[i]; for(int n=0;n<j;n++){ System.out.print(paicn[i]); } } System.out.println(); List yidui = new ArrayList(); for(int m=0;m<MAX_SIZE;m++){//把所有对拉出来 if(pai[m]>=2){ yidui.add(m); } } boolean hu = false; for(Integer yd : yidui){ int[] paitemp = new int[34]; System.arraycopy(pai, 0, paitemp, 0, MAX_SIZE);//把手中的牌拷贝一份进行操作,可能占用的内存比较大,这个还没仔细考虑过 paitemp[yd] = paitemp[yd]-2; boolean sign = handlerSign(paitemp,0,7); if(!sign)continue; boolean sun1 = handlerShun(paitemp,7,16); if(!sun1)continue; boolean sun2 = handlerShun(paitemp,16,25); if(!sun2)continue; boolean sun3 = handlerShun(paitemp,25,34); if(!sun3)continue; hu = true; break; } if(hu) System.out.println("HU");//胡 else System.out.println("BU HU");//不胡 哈哈 System.out.println("time:"+(System.currentTimeMillis()-l)); } /** * 检测单牌的 */ public static boolean handlerSign(int[] pai,int start,int end){ for(int i=start;i<end;i++){ if(pai[i]!=3)return false; } return true; } /** * 检测顺子 */ public static boolean handlerShun(int[] pai,int start,int end){ int i = start; if(i==end-1){ if(pai[i]==0||pai[i]==3)return true; return false; } if(pai[i]==0){ return handlerShun(pai,++i,end); } if(pai[i]<3){ if(i+2<end&&pai[i+1]>0&&pai[i+2]>0){//后续是否有茬 pai[i]=pai[i]-1; pai[i+1] = pai[i+1]-1; pai[i+2] = pai[i+2]-1; return handlerShun(pai,i,end); } else{ return false; } } else if(pai[i]==3){ return handlerShun(pai,++i,end); } else { if(i+2<end&&pai[i+1]>0&&pai[i+2]>0){//后续是否有茬 pai[i]=pai[i]-1; pai[i+1] = pai[i+1]-1; pai[i+2] = pai[i+2]-1; return handlerShun(pai,i,end); } else { return false; } } } }
相关推荐
本压缩包中包含了多种编程语言实现的麻将胡牌算法,包括C++、C#、Lua、Go以及JavaScript。虽然标签中提到了“Java”,但在这个上下文中,我们主要关注的是其他五种编程语言的实现。 麻将胡牌算法的核心是判断一副...
golang版麻将胡牌算法,包含带癞子和不带癞子,将gui_index 设置为34 就是不带癞子的麻将胡牌算法,gui_index 设置为[0,34)就是带癞子的麻将胡牌算法
自己做的一个简单的C源代码麻将胡牌算法 分享给大家学习.
本话题聚焦于"C++麻将胡牌算法",这是一个结合了计算机科学与传统娱乐的有趣应用。麻将胡牌算法的核心在于设计一个高效、准确的逻辑来判断一副麻将牌是否构成胡牌的条件,这涉及到数据结构、逻辑推理和优化技巧。 ...
在本文中,我们将深入探讨“简单的麻将胡牌算法”这一主题。麻将,作为一种深受人们喜爱的传统娱乐活动,其胡牌规则复杂多变,涉及到许多策略和概率计算。在这个项目中,作者实现了一个基本的麻将算法,用Java语言...
本项目主要探讨了如何使用C++语言实现麻将胡牌算法,包括普通胡牌规则以及特殊的“癞子”(也称为万能牌)胡牌规则。这里我们将深入解析这两种算法的核心原理。 首先,我们来看基础的麻将胡牌算法。麻将是一种四人...
根据给定的信息,本文将详细解释麻将胡牌算法中的判定函数。麻将作为一种深受欢迎的棋牌游戏,在不同的地区有着各自的游戏规则,但其核心在于通过玩家抓牌、打牌、吃碰杠等操作,使得手中的牌满足特定的组合条件,即...
总之,四川麻将胡牌算法的实现是一个涉及递归、数据结构和逻辑推理的复杂过程。通过巧妙地运用递归算法,我们可以有效地检测出任意14张牌是否构成胡牌,从而在虚拟的麻将桌上体验到与真实游戏相似的智慧较量。
【作品名称】:基于Java 实现的麻将胡牌算法以及AI算法 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】 # 胡牌算法 有...
本压缩包"majiang_algorithm-master.zip"包含了一系列与麻将相关的算法实现,如胡牌算法、AI算法、查胡算法、评估算法和出牌算法。下面我们将深入探讨这些算法的核心概念及其在实际应用中的作用。 首先,胡牌算法是...
胡牌算法则是判断玩家能否胡牌以及计算胡牌分数的过程。首先,根据听牌算法确定的听牌类型,检查补上的牌是否能构成胡牌。接着,根据麻将规则,计算胡牌的分数。这可能包括基础分数、番数、自摸、放炮等情况的处理。...
麻将癞子胡牌算法,效率超快。4个5个癞子都测试过,python语言写的。
在本文中,我们将深入探讨如何使用Lua编程语言创建一个麻将胡牌表的计算方法。麻将是一种深受人们喜爱的策略游戏,而胡牌是游戏的核心部分。理解胡牌的计算方式对于设计麻将游戏算法至关重要。 首先,我们要明确的...
分享一个麻将胡牌算法,支持多癞子,自己对麻将胡牌的理解写的一套快速识别胡牌逻辑,核心逻辑500行代码,仅对同条万进行处理,字花牌不包含在内,易理解,1M次随机胡牌牌型大概3秒左右。原创分享,我的算法也许可以...
根据给定的信息,本文将详细解释“麻将清一色胡牌算法(C版)”的知识点,包括算法的实现逻辑、关键函数的功能以及整体代码框架的理解。 ### 麻将清一色胡牌算法概述 #### 标题解读 标题“麻将清一色胡牌算法(C版...
不懂日文的的,下载后可以翻译下日文。资源包括说明文件和代码文件。当然也可以直接访问原作者的文章地址:http://hp.vector.co.jp/authors/VA046927/mjscore/mjalgorism.html
标签“麻将”进一步确认了这个游戏的核心玩法是麻将,麻将是一种源自中国的策略性桌面游戏,通常需要四名玩家参与,涉及到牌的组合、碰、杠和胡牌等规则。 在压缩包的文件名称列表中,我们可以看到以下文件: 1. `...
本项目聚焦于一个独特的应用——麻将智能出牌,通过Tensorflow这一强大的深度学习框架,实现了自动选择出牌的算法。下面,我们将深入探讨这一系统的实现细节。 首先,我们要理解的是`mahjong_common.py`,这个文件...