原创干货!麻将平胡算法
此算法基本可以通用于所有麻将的平胡规则,即满足m * ABC + n * AAA + AA(其中m、n可为0)的胡牌公式,红黑字牌也可由此算法演变。
首先,我们要约定每张麻将都可以由一个数字表示,比如11表示一万,12表示二万,21表示一条,22表示二条,31表示一筒,32表示二筒……
即所有牌用两位数表示,表示万条筒的两位数个位为牌点,十位为牌类型,其它表示非字牌的两位数与牌类型相同,以下用一个枚举类定义:
以上定义了各张牌的数字表示,接下来我们分析手牌的存储结构,手牌可以用一个数组表示,数组下标号能除尽10的数组元素为保留位,不用于存储任何数据。举例解释此数组存储牌的数据结构:
0号下标保留位
1~9号下标为万字牌牌点,其对应的数组元素为牌的张数
10号下标保留位
11~19号下标为条字牌牌点,其对应的数组元素为牌的张数
20号下标为保留位
21~29号下标为筒字牌牌点,其对应的数组元素为牌的张数
40~46号下标分别表示东、南、西、北、中、发、白的存储位。
根据以上的定义,则可以根据数组下标获得万条筒字牌的类型和牌点,(下标/10 + 1) 则为字牌类型,(下标%10) 则为字牌点数。
准备工作都做好了,怎么使用上面定义的数据结构实现平胡算法呢?平胡满足m * ABC + n * AAA + AA(其中m、n可为0)的胡牌公式,分析此公式,AA表示一对牌,则算法必然需要分析手牌中是否含有一对牌,ABC表示三张相同类型且连续的牌,AAA表示三张相同类型且牌点也相同的牌。
依据公式,我们用递归思路编写一个平胡胡牌算法(其中包含简单的测试用例):
觉得不错请点赞支持,欢迎留言或进我的个人群855801563领取【架构资料专题目合集90期】、【BATJTMD大厂JAVA面试真题1000+】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不定期答题、探讨。
麻将程序对和牌判断的逻辑是什么?
先进算法当然有啊,有详细的介绍,思路非常屌爆。
大体意思如下(以下掺杂我的个人理解,可能有解释错误之处。会日语的读者请尽量阅读链接原文):
暴力拆解比较吃计算,查表法比较吃内存,虽然这两者对于当今的PC都不是问题,但如果平台机能特别有限,可以采用改进的查表法。
基础的查表法,是给每种牌编一个id,麻将中共34种牌因此需要至少6位空间。手牌14张也就是84位。要保存和牌的全部组合约1700万种需要约175MB存储。
改进的思路是先给手牌排序,然后不管具体牌面,只计算连续牌的张数,得到一个「牌型」,再从表中查牌型是否胡。
例如222456万345678饼北北,可以编码为30111011111102(三张相同牌,三张连续牌,六张连续牌,两张相同牌,中间隔开)。
下一步是将其二进制化,采用如下特制规则:
1→0
2→110
3→11110
4→1111110
10→10
20→1110
30→111110
40→11111110
很容易看出,这样编码后每张牌只占用1到2位空间,最恶情况子下(十四张不连单牌)仅占用27位。跟之前的84位相比,单组数据压缩了三分之二以上。更牛逼的是,和牌表从1700万种具体组合下降到仅仅9362种形状排列!
另外,作者反复强调:查表时需要大量整型比较运算,将数据控制在32位以内对于(2008年成文当时主流的)32位CPU本身也是优化(省操作次数)。
结论上,根据作者测试,优化后的查表算法比暴力拆解快大约50倍,而且速度特别稳定。相对地,传统的拆解法碰上清一色这种同色牌多的牌型会变慢。
还有一个是役的计算,分为事后判定(先检查是否和牌、再检查役种)和事前判定(检查和牌的同时检查役种)。文中的算法支持一部分役的事前判定。
谁用java做过麻将
简单的说一下,页面这个没问题。swing。
就是业务逻辑方面的,
业务逻辑我感觉一步一步的来,也不会太难。
首先,分牌,这个设个list链表,里面包含麻将所有的对象,随机分配。
第二出牌,一人一张,设个标记位,4个线程,一个出牌之后改标记位让下一个线程运行。
第三判断,手下判断是否胡了,然后再判断是否杠上,然后判断。。。。。
当然,实际做的过程中会很多未知的问题,慢慢做吧。
其实解决这些未知的问题才是收获最大的地方。
计算麻将的番数(C++/Java)
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
String string=null;
Scanner cin = new Scanner(System.in);
while (cin.hasNext()){
string=cin.next();
}
String str[]=string.split(“,”);
int i=0;
int count=0;
if(str.length==7){
count=count+2;
}
else{
for(i=0;istr.length;i++){
if(str[i].length()==6str[i].charAt(0)==’1’str[i].charAt(2)==’2′
str[i].charAt(4)==’3’str[i].charAt(1)==’T’
str[i].charAt(3)==’T’str[i].charAt(5)==’T’){
count=count+1;
}
else if(str[i].length()==8){
count=count+2;
}
}
}
System.out.println(count);
}
}
麻将的玩法胡牌的规则
1、平胡这是所有麻将胡牌牌型中胡的最多的没有之一,牌型组成为将对、顺子与刻子,在所有胡牌牌型中,正是因为去组牌难度小,因此很多玩家都会选择这种牌型胡牌。
2、碰碰胡胡牌的牌型要求手中的麻将牌全部是刻子加一个将对,需要注意的一点是玩家可以进行碰和杠操作,但是不允许吃牌,一旦吃牌则不能组此胡牌牌型。
3、七对这种牌型要求玩家手中的麻将牌全部是对子,并且所有的对子都在手中持有,在整个过程中不能进行碰和杠操作。
4、清一色胡牌的时候手中所有的麻将牌由同一种花色的牌组成,同时要满足基本胡牌牌型要求。
5、混一色胡牌的时候手中所有的牌只存在两种情况,一种麻将牌同一种花色,另外一种是东南西北中发白,两种牌混合组成的胡牌牌型。
6、大小三元胡牌的时候手中的中发白如果是三个刻子的牌型则称之为大三元,如果三张中有一个是将对则称之为小三元。