胡牌:
平胡: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){