本篇主要讲解斗地主中如何比较两手牌的大小。
友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇。
斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)
牌型比较
火箭最大;炸弹次之;再次是一般牌型(单牌、对牌、三张牌、三带一、单顺、双顺、三顺、飞机带翅膀、四带二)
一般牌型:只有牌型且张数相同的牌才可按牌点数比较大小。
其中三带一、飞机带翅膀、四带二组合牌型,比较其相同张数最多的牌点数大小。
1.比较我的牌和上家的牌的大小,决定是否可以出牌
/** * 比较我的牌和上家的牌的大小,决定是否可以出牌 * * @param myCards * 我想出的牌 * * @param myCardType * 我的牌的类型 * @param prevCards * 上家的牌 * @param prevCardType * 上家的牌型 * @return 可以出牌,返回true;否则,返回false。 */ public static boolean isOvercomePrev(List<Card> myCards, CardType myCardType, List<Card> prevCards, CardType prevCardType) { // 我的牌和上家的牌都不能为null if (myCards == null || prevCards == null) { return false; } if (myCardType == null || prevCardType == null) { logger.info("上家出的牌不合法,所以不能出。"); return false; } // 上一首牌的个数 int prevSize = prevCards.size(); int mySize = myCards.size(); // 我先出牌,上家没有牌 if (prevSize == 0 && mySize != 0) { return true; } // 集中判断是否王炸,免得多次判断王炸 if (prevCardType == CardType.WANG_ZHA) { logger.info("上家王炸,肯定不能出。"); return false; } else if (myCardType == CardType.WANG_ZHA) { logger.info("我王炸,肯定能出。"); return true; } // 集中判断对方不是炸弹,我出炸弹的情况 if (prevCardType != CardType.ZHA_DAN && myCardType == CardType.ZHA_DAN) { return true; } // 默认情况:上家和自己想出的牌都符合规则 CardUtil.sortCards(myCards);// 对牌排序 CardUtil.sortCards(prevCards);// 对牌排序 int myGrade = myCards.get(0).grade; int prevGrade = prevCards.get(0).grade; // 比较2家的牌,主要有2种情况,1.我出和上家一种类型的牌,即对子管对子; // 2.我出炸弹,此时,和上家的牌的类型可能不同 // 王炸的情况已经排除 // 单 if (prevCardType == CardType.DAN && myCardType == CardType.DAN) { // 一张牌可以大过上家的牌 return compareGrade(myGrade, prevGrade); } // 对子 else if (prevCardType == CardType.DUI_ZI && myCardType == CardType.DUI_ZI) { // 2张牌可以大过上家的牌 return compareGrade(myGrade, prevGrade); } // 3不带 else if (prevCardType == CardType.SAN_BU_DAI && myCardType == CardType.SAN_BU_DAI) { // 3张牌可以大过上家的牌 return compareGrade(myGrade, prevGrade); } // 炸弹 else if (prevCardType == CardType.ZHA_DAN && myCardType == CardType.ZHA_DAN) { // 4张牌可以大过上家的牌 return compareGrade(myGrade, prevGrade); } // 3带1 else if (prevCardType == CardType.SAN_DAI_YI && myCardType == CardType.SAN_DAI_