`
FansUnion
  • 浏览: 153357 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

斗地主算法的设计与实现(四)--对牌进行排序

 
阅读更多

在判断牌的类型的时候,比如判断387654的牌型的时候,需要首先对牌进行排序,这样才能判断这6张牌是个顺子。

本篇简要介绍下 如何对一手牌或很多牌进行排序。

在前几篇定义牌Card的属性的时候,有个grade字段,这个字段就是用来对牌进行比较和排序的。

比如大王的grade是17,小王的grade是16,这样大王>小王,其它单张牌的比较是类似的。

1.根据牌的id,获得一张牌的等级

 /**
     * 根据牌的id,获得一张牌的等级
     *
     * @param id
     *            牌的id
     * @return 与牌数字对应的等级
     */
    public static int getGrade(int id) { 

        if (id < 1 || id > 54) {
            throw new RuntimeException("牌的数字不合法");
        } 

        int grade = 0; 

        // 2个王必须放在前边判断
        if (id == 53) {
            grade = 16;
        } else if (id == 54) {
            grade = 17;
        } 

        else {
            int modResult = id % 13; 

            if (modResult == 1) {
                grade = 14;
            } else if (modResult == 2) {
                grade = 15;
            } else if (modResult == 3) {
                grade = 3;
            } else if (modResult == 4) {
                grade = 4;
            } else if (modResult == 5) {
                grade = 5;
            } else if (modResult == 6) {
                grade = 6;
            } else if (modResult == 7) {
                grade = 7;
            } else if (modResult == 8) {
                grade = 8;
            } else if (modResult == 9) {
                grade = 9;
            } else if (modResult == 10) {
                grade = 10;
            } else if (modResult == 11) {
                grade = 11;
            } else if (modResult == 12) {
                grade = 12;
            } else if (modResult == 0) {
                grade = 13;
            } 

        } 

        return grade;
    } 


2.对牌进行排序,从小到大,使用冒泡排序

/**
     * 对牌进行排序,从小到大,使用冒泡排序,此种方法不是很好
     *
     * @param cards
     *            牌
     */
    public static boolean bubbleSortCards(List<Card> cards) {
        if (cards == null) {
            return false;
        } 

        int size = cards.size();
        // 冒泡排序,从左到右,从小到大
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size – i – 1; j++) {
                int gradeOne = cards.get(j).grade;
                int gradeTwo = cards.get(j + 1).grade; 

                boolean isExchange = false;
                if (gradeOne > gradeTwo) {
                    isExchange = true;
                } else if (gradeOne == gradeTwo) {
                    // 2张牌的grade相同
                    CardBigType type1 = cards.get(j).bigType;
                    CardBigType type2 = cards.get(j + 1).bigType; 

                    // 从做到右,方块、梅花、红桃、黑桃
                    if (type1.equals(CardBigType.HEI_TAO)) {
                        isExchange = true;
                    } else if (type1.equals(CardBigType.HONG_TAO)) {
                        if (type2.equals(CardBigType.MEI_HUA)
                                || type2.equals(CardBigType.FANG_KUAI)) {
                            isExchange = true;
                        }
                    } else if (type1.equals(CardBigType.MEI_HUA)) {
                        if (type2.equals(CardBigType.FANG_KUAI)) {
                            isExchange = true;
                        }
                    }
                } 

                if (isExchange) {
                    Card cardOne = cards.get(j);
                    Card cardTwo = cards.get(j + 1);
                    // 交换
                    cards.set(j + 1, cardOne);
                    cards.set(j, cardTwo);
                }
            }
        }
        return true;
    } 


3.使用JDK自带的类库进行排序

  /**
     * 对牌进行排序,从小到大,比较器为CardComparator
     *
     * @param cards
     *            牌的集合
     */
    public static void sortCards(List<Card> cards) {
        // 策略模式;复用已有类;
        Collections.sort(cards, new CardComparator());
    } 

public class CardComparator implements Comparator<Card> { 

    public int compare(Card card1, Card card2) {
        int result = -1; 

        int grade1 = card1.grade;
        int grade2 = card2.grade; 

        if (grade1 > grade2) {
            result = 1;
        } else if (grade1 < grade2) {
            result = -1;
        } else {
            // 等级相同的情况,比如都是9
            CardBigType bigType1 = card1.bigType;
            CardBigType bigType2 = card2.bigType;
            // 从左到右,方块、梅花、红桃、黑桃
            if (bigType1.equals(CardBigType.HEI_TAO)) {
                result = 1;
            } else if (bigType1.equals(CardBigType.HONG_TAO)) {
                if (bigType2.equals(CardBigType.MEI_HUA)
                        || bigType2.equals(CardBigType.FANG_KUAI)) {
                    result = 1;
                }
            } else if (bigType1.equals(CardBigType.MEI_HUA)) {
                if (bigType2.equals(CardBigType.FANG_KUAI)) {
                    result = 1;
                }
            }
            // 2张牌的等级不可能完全相同,程序内部采用这种设计
            else {
                result = -1;
            }
        } 

        return result;
    } 

} 


相关阅读

斗地主算法的设计与实现

面向对象实现斗地主程序的核心算法,包括洗牌、发牌、判断牌型、比较牌的大小、游戏规则等。

原文参见: http://FansUnion.cn/articles/2734

分享到:
评论

相关推荐

    斗地主算法的设计与实现-FansUnion-DouDiZhu-20131012.zip

    斗地主项目的主要实现了,斗地主中的洗牌、发牌、判断牌型、排序等一系列算法,但这并不是一个完整的项目。 界面操作部分,功能很有限,仅供参考,有兴趣的同学自行完善。 我的CSDN博客还有很多优质原创文章,有...

    Lua脚本的斗地主的提示出牌算法。

    Lua脚本的斗地主的提示出牌算法。 包括: 查找某牌型的算法:查找所有的单牌,查找所有的对子,查找所有的三条,查找所有的单顺,双顺,飞机,飞机带单,飞机带双。 排序算法。 转成花色,转成点数, 比较算法等。

    基于Unity3D多平台网络斗地主的设计与实现毕业设计.doc

    12 4.3 游戏逻辑程序结构 13 4.3.1 数据层 13 4.3.2 控制层 13 4.3.3 显示层 14 4.4 游戏设计流程图 14 4.5 数学建模 15 第5章 详细设计与系统实现 16 5.1 斗地主洗牌算法 16 5.2 斗地主之"排序"算法 16 5.3 基于...

    《信息学竞赛宝典-基础算法》视频讲解-第9章 搜索算法

    《信息学竞赛宝典--基础算法》,人民邮电出版社 c++基础算法视频讲解---第9章 第9章 9.1.2迷宫问题 9.1.1四色地图 9.1.6单词接龙 9.1.5机器人搬重物 ...第07章 排序算法 第08章 高精度算法 第09章 搜索算法

    C#编写--斗地主源码.rar

    对玩家出的牌进行检验.判断是否符合出牌规则. (关于斗地主的出牌规则网上有很多) 思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在4个数组中.拆分规则如下: 假设有牌:333\444\555\789 则拆分后数组中的数据...

    斗地主核心算法源码讲解.rar

    斗地主核心算法源码讲解 1、定义构造一张牌 2、如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 3、如何比较两手牌的大小 4、对牌进行排序 5、洗牌和发牌

    斗地主(求爱版)源码

    对玩家出的牌进行检验.判断是否符合出牌规则. (关于斗地主的出牌规则网上有很多) 思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在4个数组中.拆分规则如下: 假设有牌:333\444\555\789 则拆分后数组中的数据...

    JavaScript插入排序算法原理与实现方法示例

    本文实例讲述了JavaScript插入排序算法原理与实现方法。分享给大家供大家参考,具体如下: 一、插入排序简介: 想象我们斗地主,摸排阶段,手里的牌都按照从小到大排序。如果每摸一张牌,我们就把他插入合适的位置,...

    Java代码开发斗地主游戏全代码

    用一千多行Java代码实现的斗地主游戏,后端使用的技术栈是Springboot+SpringCache+Websocket,项目中运用了Java基础及面向对象的各类技术,类、接口、对象、枚举、集合、Map、数组、排序、算法、缓存等都有使用........

    斗地主牌型相关算法.rar

    用一个枚举存储牌的大类型(黑红梅方),再用一个枚举存储牌的小类型(A~K,dawang,xaiowang)。 牌的等级:grade 大王等级最高 对牌排序的时候用到

    python实现斗地主分牌洗牌

    本文实例为大家分享了python实现斗地主分牌洗牌的具体代码,供大家参考,具体内容如下 1、建立一个序列,共54个元素,表示一副扑克牌,初始化时是有顺序的。 2、编写一段代码完成洗牌功能,即将刚才的序列从有序的...

    安卓斗地主源码

    斗地主项目的主要实现了,斗地主中的洗牌、发牌、判断牌型、排序等一系列算法,但这并不是一个完整的项目。 界面操作部分,功能很有限,仅供参考,有兴趣的同学自行完善。 项目结构

    java版斗地主源码-Java-Learning:java基础相关学习代码,按照不同的学习路径通过分支进行归档

    java版斗地主源码 Java-Learning Java学习项目,学习Java相关知识点,记录一些重要算法问题的代码实现。 注意:com.nowcoder包下是所有算法实现的代码,以下记录的算法代码实现均在此包下,其他作为日常学习使用 ...

    C#七大经典排序算法系列(下)

    这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后,扑克梳理完毕,4条3,5条s,哇塞…… 回忆一下,俺们当时是怎么梳理的。 最左一张牌是3,第二张牌...

    C#代码实现扑克牌排序的几种方式

    扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。...比如说:赖子斗地主的时候,当选出赖子牌之后,就需要对手牌再次排序,那么new List来存一下赖子牌,选定赖子牌之后,存

    java版斗地主源码-PokerSystem:更新小案例,巩固学习Java面向对象思想

    java版斗地主源码 ...调用排序算法 注: 更多详情参见本项目更高版本的说明文档,或者API开发文档 功能实现: 牌面组合 洗牌 发牌 看牌 源码如下: package com.kris.landlords; /** * 主程序 * * @author: Kris *

    java版斗地主源码-Interview-Summary:回顾这两年来学了些什么和日记,private

    java版斗地主源码 前言 放弃考研的我,一是感觉自己技术面还算广,二是觉得或许自己并不适合搞研究,三是太久没刷数学题了写李永乐的全书头疼,故放弃。但遗憾的是可能会错过三四月的春招了(感觉自己还是菜,不敢...

    java进阶13天资料.zip

    day06-Map集合,HashMapTreeMap,斗地主、图书管理系统,排序算法 day07-异常,线程的创建方式,,线程安全,线程同步 day08-线程状态,volatile关键字、原子性、并发包、死锁、线程池 day09-方法引用, Stream流,File类...

Global site tag (gtag.js) - Google Analytics