斗地主算法的设计与实现 三 --如何比较两手牌的大小

               

本篇主要讲解斗地主中如何比较两手牌的大小。

友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这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_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值