使用枚举类,抽象类进行遍历实现类,匹配响应的牌型(十三水特殊牌型)


public abstract class SpecialPokerRegularSss implements Comparator<PokerHolderSss>{

public enum SpecialType{

TRIPLET_SEQUENCE(new SpecialPokerRegularSssTripletSequence()), // 三顺子
TRIPLET_SAME_COLOR(new SpecialPokerRegularSssTripletSameColor()), // 三同花
SIX_HALF(new SpecialPokerRegularSssSixHalf()), // 六对半
FIVE_PAIR_THREE_STRIP(new SpecialPokerRegularSssFivePairThreeStrip()), // 五对三条
FOUR_SET_TRIPLET_STRIP(new SpecialPokerRegularSssFourSetTripletStrip()), // 四套三条
ALL_SAME_COLOR(new SpecialPokerRegularSssAllSameColor()), // 凑一色
ALL_SMALL(new SpecialPokerRegularSssAllSmall()), // 全小
ALL_BIG(new SpecialPokerRegularSssAllBig()), //全大
THREE_POINTS_WORLD(new SpecialPokerRegularSssTripletPointsWorld()), // 三分天下
TRIPLET_SAME_COLOR_SEQUENCE(new SpecialPokerRegularSssTripletSameColorSequence()), //三同花顺
TWELVE_ROYALTY(new SpecialPokerRegularSssTwelveRoyalty()), // 十二皇族
A_DRAGON(new SpecialPokerRegularSssADragon()), // 一条龙
SUPERME_DRAGON(new SpecialPokerRegularSssSupermeDragon()); // 至尊清龙

private final SpecialPokerRegularSss specialPokerRegularSss;
private static final Map<Integer, SpecialType> SPECIAL_TYPE_MAP;

private SpecialType(SpecialPokerRegularSss specialPokerRegularSss) {
this.specialPokerRegularSss = specialPokerRegularSss;
}


public SpecialPokerRegularSss getSpecialPokerRegularSss() {
return specialPokerRegularSss;
}

static {
SPECIAL_TYPE_MAP = new HashMap<>(SpecialType.values().length);
for (final SpecialType item : SpecialType.values()) {
SpecialType.SPECIAL_TYPE_MAP.put(item.ordinal(), item);
}
}


public static SpecialPokerRegularSss getSpecialTypeFrom(Integer ordinal) {
return SpecialType.SPECIAL_TYPE_MAP.get(ordinal).getSpecialPokerRegularSss();
}
}

public static SpecialPokerRegularSss getSpecialPokerRegularsFrom(List<Poker> pokers) throws BizException {
return SpecialPokerRegularSss.getSpecialPokerRegularsFrom(pokers == null ? new Poker[0] : pokers.toArray(new Poker[pokers.size()]));
}

public SpecialPokerRegularSss() {

}

//  获取所有SpecialPokerRegularSss.class的抽象类的实现类  最后用canPlay()方法匹配响应的实现类

//因为是十三水的特殊牌型 ,所以从最大的至尊清青龙开始 

public static SpecialPokerRegularSss getSpecialPokerRegularsFrom(Poker... pokers) throws BizException {
pokers = pokers == null ? Poker.EMPTY_POKERS : pokers;
for(int index = SpecialType.values().length - 1; index >=0; index--){
SpecialPokerRegularSss specialPoker =  SpecialType.getSpecialTypeFrom(index);
if(specialPoker != null && specialPoker.canPlay(pokers)){
return specialPoker;
}
}
return null;
}

@Override
public final boolean canPlay(Poker[] pokers) throws BizException {
final PokerHolderSss pokerHolderSss = new PokerHolderSss(pokers);
return this.canPlay(pokerHolderSss);
}


protected abstract boolean canPlay(PokerHolderSss pokerHolderSss);


}

实现类 

举例,这是其中一个,每个都是这样实现,就能自动匹配到实现类的canPlay方法

class SpecialPokerRegularSssADragon extends SpecialPokerRegularSss { // 一条龙


@Override
protected boolean canPlay(PokerHolderSss pokerHolderSss) { // A ~ K
return pokerHolderSss.getValueCount() == pokerHolderSss.getPokerCount();
}


}





猜你喜欢

转载自blog.csdn.net/Jon_jing/article/details/78365233