java麻将算法_Java实现的麻将胡牌算法

这篇博客详细介绍了如何使用Java实现各种麻将胡牌算法,包括平胡、对对胡、七小对、门清、全求人、清一色、七大对和豪华大七对。文章首先定义了麻将牌类`MajiangCard`,然后通过`judgeNormalHuType`方法判断正常胡牌类型,如平胡、七小对、对对胡等。对于平胡,还专门提供了一个`PingHuAnalyser`类进行分析。整体算法逻辑清晰,便于理解和实现。
摘要由CSDN通过智能技术生成

胡牌:

平胡:1对将及4副(顺子/刻子)

对对胡:4副刻子+1对将组成的胡牌

七小对:全部牌都是1对

门清:全部牌都是自己摸的,没有碰和暗杠

全求人:全部碰或明杠,手上只剩一张牌,并且是点炮胡,不能自摸

清一色:全部都是一色的平胡(包含万、条、筒、字)

七大对:有4张一样的牌且没杠,其余牌都是对子

豪华大七对:有至少两个4张一样的牌,其余牌都是对子

定义麻将牌:

public class MajiangCard extends Card{

protected byte card;

public MajiangCard(){

}

public MajiangCard(byte card){

this.card = card;

}

public MajiangCard(byte cardValue, byte cardType){

this.card = (byte) (cardValue + (cardType<<4));

}

public boolean reqValid(){

return card > 0;

}

public byte getCard() {

return card;

}

public void setCard(byte card) {

this.card = card;

}

@Override

public String toString() {

return MJUtil.mjToStr(this);

}

public byte reqType(){

byte value = (byte)(card>>4);

return value;

}

public byte reqValue(){

byte type = (byte)(0x0F & card);

return type;

}

}

麻将牌占一个字节,高4位为类型(1-4为万条筒字),低4位为数据(1-9)

/**

* 判断 正常的胡牌类型

* @param isSelfCard 是否自摸牌

* @param cpCards 手牌

* @param gangCards 扛牌

* @param touchCards 碰牌

* @return

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

public static int judgeNormalHuType(boolean isSelfCard, ListcpCards,

ListgangCards, ListtouchCards){

ListtmpCards = MJCommonFuncs.cpList(cpCards);

MapnumMap = MJCommonFuncs.transCardsToMap(tmpCards);

MapnumMapCp = (Map) MJCommonFuncs.cpMap((Map,?>)(Map)numMap);

//先判断是否是豪华7大对

int fourPairNum = 0;

int cardSerValue = MJCommonFuncs.filtCardNum(numMapCp, 4);

while(cardSerValue != 0){

fourPairNum++;

numMapCp.remove(cardSerValue);

cardSerValue = MJCommonFuncs.filtCardNum(numMapCp, 4);

}

fourPairNum += gangCards.size();

int ret = MJConst.HUTYPE_DISABLE;

if(fourPairNum >= 2 && touchCards.size() == 0){

//其他是对子

boolean isHu = true;

for(int cnt : numMapCp.values()){

if(cnt != 2){

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值