`
pengmj
  • 浏览: 24597 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

麻将胡牌算法

 
阅读更多

这一段时间棋牌类非常火,这里简单的实现一下麻将的胡牌算法,算法很简单,核心代码就小几十行。由于本人不太会玩麻将,所以有些专用名词不会叫,知道意思就行。由于每个地方的麻将玩法都不太一样,我们这里先就用一些通用的胡牌规则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;
				}
			}
	}
}

 

  • 大小: 6 KB
分享到:
评论

相关推荐

    各种语言的麻将胡牌算法。干货。 c++ c# lua go js麻将胡牌算法.zip

    本压缩包中包含了多种编程语言实现的麻将胡牌算法,包括C++、C#、Lua、Go以及JavaScript。虽然标签中提到了“Java”,但在这个上下文中,我们主要关注的是其他五种编程语言的实现。 麻将胡牌算法的核心是判断一副...

    golang版超高效带癞子麻将胡牌算法

    golang版麻将胡牌算法,包含带癞子和不带癞子,将gui_index 设置为34 就是不带癞子的麻将胡牌算法,gui_index 设置为[0,34)就是带癞子的麻将胡牌算法

    麻将胡牌算法(源代码)

    自己做的一个简单的C源代码麻将胡牌算法 分享给大家学习.

    C++麻将胡牌算法

    本话题聚焦于"C++麻将胡牌算法",这是一个结合了计算机科学与传统娱乐的有趣应用。麻将胡牌算法的核心在于设计一个高效、准确的逻辑来判断一副麻将牌是否构成胡牌的条件,这涉及到数据结构、逻辑推理和优化技巧。 ...

    简单的麻将胡牌算法

    在本文中,我们将深入探讨“简单的麻将胡牌算法”这一主题。麻将,作为一种深受人们喜爱的传统娱乐活动,其胡牌规则复杂多变,涉及到许多策略和概率计算。在这个项目中,作者实现了一个基本的麻将算法,用Java语言...

    c++麻将胡牌算法,癞子胡牌算法

    本项目主要探讨了如何使用C++语言实现麻将胡牌算法,包括普通胡牌规则以及特殊的“癞子”(也称为万能牌)胡牌规则。这里我们将深入解析这两种算法的核心原理。 首先,我们来看基础的麻将胡牌算法。麻将是一种四人...

    麻将胡牌算法的判定函数

    根据给定的信息,本文将详细解释麻将胡牌算法中的判定函数。麻将作为一种深受欢迎的棋牌游戏,在不同的地区有着各自的游戏规则,但其核心在于通过玩家抓牌、打牌、吃碰杠等操作,使得手中的牌满足特定的组合条件,即...

    四川麻将胡牌算法

    总之,四川麻将胡牌算法的实现是一个涉及递归、数据结构和逻辑推理的复杂过程。通过巧妙地运用递归算法,我们可以有效地检测出任意14张牌是否构成胡牌,从而在虚拟的麻将桌上体验到与真实游戏相似的智慧较量。

    基于Java 实现的麻将胡牌算法以及AI算法

    【作品名称】:基于Java 实现的麻将胡牌算法以及AI算法 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】 # 胡牌算法 有...

    Java麻将算法汇总(胡牌算法、AI算法、查胡算法、评估算法、出牌算法)majiang_algorithm-master.zip

    本压缩包"majiang_algorithm-master.zip"包含了一系列与麻将相关的算法实现,如胡牌算法、AI算法、查胡算法、评估算法和出牌算法。下面我们将深入探讨这些算法的核心概念及其在实际应用中的作用。 首先,胡牌算法是...

    Go-麻将算法封装包括牌墙算法听牌算法胡牌算法出牌推荐算法

    胡牌算法则是判断玩家能否胡牌以及计算胡牌分数的过程。首先,根据听牌算法确定的听牌类型,检查补上的牌是否能构成胡牌。接着,根据麻将规则,计算胡牌的分数。这可能包括基础分数、番数、自摸、放炮等情况的处理。...

    麻将癞子胡牌算法

    麻将癞子胡牌算法,效率超快。4个5个癞子都测试过,python语言写的。

    麻将胡牌表_lua_列表_majiang_计算式_算法_

    在本文中,我们将深入探讨如何使用Lua编程语言创建一个麻将胡牌表的计算方法。麻将是一种深受人们喜爱的策略游戏,而胡牌是游戏的核心部分。理解胡牌的计算方式对于设计麻将游戏算法至关重要。 首先,我们要明确的...

    麻将算法源码(任意癞子)

    分享一个麻将胡牌算法,支持多癞子,自己对麻将胡牌的理解写的一套快速识别胡牌逻辑,核心逻辑500行代码,仅对同条万进行处理,字花牌不包含在内,易理解,1M次随机胡牌牌型大概3秒左右。原创分享,我的算法也许可以...

    麻将清一色胡牌算法(C版)

    根据给定的信息,本文将详细解释“麻将清一色胡牌算法(C版)”的知识点,包括算法的实现逻辑、关键函数的功能以及整体代码框架的理解。 ### 麻将清一色胡牌算法概述 #### 标题解读 标题“麻将清一色胡牌算法(C版...

    日本人 发明的胡牌算法,比普通的拆解法更好

    不懂日文的的,下载后可以翻译下日文。资源包括说明文件和代码文件。当然也可以直接访问原作者的文章地址:http://hp.vector.co.jp/authors/VA046927/mjscore/mjalgorism.html

    麻将游戏源码VB写的麻将游戏源码

    标签“麻将”进一步确认了这个游戏的核心玩法是麻将,麻将是一种源自中国的策略性桌面游戏,通常需要四名玩家参与,涉及到牌的组合、碰、杠和胡牌等规则。 在压缩包的文件名称列表中,我们可以看到以下文件: 1. `...

    tensorflow麻将智能出牌源码

    本项目聚焦于一个独特的应用——麻将智能出牌,通过Tensorflow这一强大的深度学习框架,实现了自动选择出牌的算法。下面,我们将深入探讨这一系统的实现细节。 首先,我们要理解的是`mahjong_common.py`,这个文件...

Global site tag (gtag.js) - Google Analytics