在判断牌的类型的时候,比如判断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 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 cards) {

// 策略模式;复用已有类;

Collections.sort(cards, new CardComparator());

}

public class CardComparator implements Comparator {

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;

}

}

相关阅读:

java斗地主比大小_斗地主算法的设计与实现–如何比较两手牌的大小相关推荐

  1. java斗地主比大小_斗地主算法的设计与实现(三)--如何比较两手牌的大小

    本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 牌型比较 火箭最大:炸弹次之:再次是一般牌型(单牌.对牌.三张牌.三带一.单顺.双顺.三顺 ...

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

    本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 斗地 ...

  3. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  4. java雪花数据库长度_雪花算法(SnowFlake)Java实现

    算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long ...

  5. java每日打卡_“365算法每日学计划”:03打卡-贪心算法

    自从开始做公众号开始,就一直在思考,怎么把算法的训练做好,因为思海同学在算法这方面的掌握确实还不够.因此,我现在想做一个"365算法每日学计划"."计划"的主要 ...

  6. 用java实现combin函数_【算法-Java实现】组合总和

    [算法-Java实现]组合总和 一.问题描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.c ...

  7. 堆排序算法java左程云_堆排序算法以及JAVA实现

    堆的定义如下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki ...

  8. java 数据周期预测_预测算法 | Holt Winter季节性指数平滑法 附JAVA代码

    import java.util.ArrayList; import java.util.List; /** * 三次指数平滑预测,最多外推一个周期 * @author Administrator * ...

  9. Java实现mds降维_降维算法MDS

    在现实应用中,许多学习方法都涉及距离计算,而高维空间会给距离计算带来很大的麻烦.例如当维数很高时,甚至连计算内积都很不容易. 这实际上,是所有机器学习都面临的严重障碍,这被称为"维数灾难(即 ...

  10. java 汽车加油问题_贪心算法 汽车加油问题 | 学步园

    / //一辆汽车加满油后可行驶n公里.旅途中有若干个加油站.设计一个有效      // // // n和k个加油站位置,编程计算最少加油次数.并证明算法能产生一个最优解.    // //要求:   ...

最新文章

  1. 配置 腾讯云 SSL 证书 SSL证书实现https,环境:phpStudy下Apache环境
  2. JQuery 总结(7) index() data() each() 选项卡 表单验证
  3. linux sort命令 性能,linux sort 命令详解
  4. 全面解析并实现逻辑回归(Python)
  5. Perl获取当前系统时间
  6. 计算机在社区健康档案管理中的作用,某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在1..._考试资料网...
  7. 漫步最优化十五——凸函数优化
  8. ASP.NET入门教程:服务器控件
  9. jquery用ajax,超简单的jquery的AJAX用法
  10. linux充电时熄屏时间,充电时玩手机会损害电池吗
  11. 单片机ADC采样算法----消抖滤波法
  12. Java 关键字super和this的使用及区别
  13. python工资高还是java-Python和Java哪个工资高
  14. 成员方法的使用及其调用
  15. 【原创】.NET读写Excel工具Spire.Xls使用(5)重量级的Excel图表功能
  16. 刷入第三方 recovery twrp
  17. 关于WiFi密码破解的一些心得
  18. Win2000 Server***监测
  19. javaScript常用案例
  20. iPhone 13,战略性“不香”!

热门文章

  1. freeswitch 自定义application
  2. svn 安装教程 TortoiseSvn
  3. python xlwt模块下载_python 的xlwt模块
  4. 经典laravel后台管理系统
  5. 网址导航引导页面H5源码
  6. python3数据科学入门与实战技巧_Python3数据科学入门与实战
  7. 硬盘加密软件测试工资,实测加密软件BitLocker对硬盘性能有何影响
  8. 华为3500光端机基本介绍_OptixOSN3500光端机产品描述
  9. Qt 界面美化教程 QSS QML Qt自绘方式优缺点对比
  10. mysql 主键 sql语句_Mysql主键相关的sql语句集锦