在判断牌的类型的时候,比如判断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
分享到:
相关推荐
斗地主项目的主要实现了,斗地主中的洗牌、发牌、判断牌型、排序等一系列算法,但这并不是一个完整的项目。 界面操作部分,功能很有限,仅供参考,有兴趣的同学自行完善。 我的CSDN博客还有很多优质原创文章,有...
Lua脚本的斗地主的提示出牌算法。 包括: 查找某牌型的算法:查找所有的单牌,查找所有的对子,查找所有的三条,查找所有的单顺,双顺,飞机,飞机带单,飞机带双。 排序算法。 转成花色,转成点数, 比较算法等。
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 基于...
《信息学竞赛宝典--基础算法》,人民邮电出版社 c++基础算法视频讲解---第9章 第9章 9.1.2迷宫问题 9.1.1四色地图 9.1.6单词接龙 9.1.5机器人搬重物 ...第07章 排序算法 第08章 高精度算法 第09章 搜索算法
对玩家出的牌进行检验.判断是否符合出牌规则. (关于斗地主的出牌规则网上有很多) 思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在4个数组中.拆分规则如下: 假设有牌:333\444\555\789 则拆分后数组中的数据...
斗地主核心算法源码讲解 1、定义构造一张牌 2、如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 3、如何比较两手牌的大小 4、对牌进行排序 5、洗牌和发牌
对玩家出的牌进行检验.判断是否符合出牌规则. (关于斗地主的出牌规则网上有很多) 思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在4个数组中.拆分规则如下: 假设有牌:333\444\555\789 则拆分后数组中的数据...
本文实例讲述了JavaScript插入排序算法原理与实现方法。分享给大家供大家参考,具体如下: 一、插入排序简介: 想象我们斗地主,摸排阶段,手里的牌都按照从小到大排序。如果每摸一张牌,我们就把他插入合适的位置,...
用一千多行Java代码实现的斗地主游戏,后端使用的技术栈是Springboot+SpringCache+Websocket,项目中运用了Java基础及面向对象的各类技术,类、接口、对象、枚举、集合、Map、数组、排序、算法、缓存等都有使用........
用一个枚举存储牌的大类型(黑红梅方),再用一个枚举存储牌的小类型(A~K,dawang,xaiowang)。 牌的等级:grade 大王等级最高 对牌排序的时候用到
本文实例为大家分享了python实现斗地主分牌洗牌的具体代码,供大家参考,具体内容如下 1、建立一个序列,共54个元素,表示一副扑克牌,初始化时是有顺序的。 2、编写一段代码完成洗牌功能,即将刚才的序列从有序的...
斗地主项目的主要实现了,斗地主中的洗牌、发牌、判断牌型、排序等一系列算法,但这并不是一个完整的项目。 界面操作部分,功能很有限,仅供参考,有兴趣的同学自行完善。 项目结构
java版斗地主源码 Java-Learning Java学习项目,学习Java相关知识点,记录一些重要算法问题的代码实现。 注意:com.nowcoder包下是所有算法实现的代码,以下记录的算法代码实现均在此包下,其他作为日常学习使用 ...
这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后,扑克梳理完毕,4条3,5条s,哇塞…… 回忆一下,俺们当时是怎么梳理的。 最左一张牌是3,第二张牌...
扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用。...比如说:赖子斗地主的时候,当选出赖子牌之后,就需要对手牌再次排序,那么new List来存一下赖子牌,选定赖子牌之后,存
java版斗地主源码 ...调用排序算法 注: 更多详情参见本项目更高版本的说明文档,或者API开发文档 功能实现: 牌面组合 洗牌 发牌 看牌 源码如下: package com.kris.landlords; /** * 主程序 * * @author: Kris *
java版斗地主源码 前言 放弃考研的我,一是感觉自己技术面还算广,二是觉得或许自己并不适合搞研究,三是太久没刷数学题了写李永乐的全书头疼,故放弃。但遗憾的是可能会错过三四月的春招了(感觉自己还是菜,不敢...
day06-Map集合,HashMapTreeMap,斗地主、图书管理系统,排序算法 day07-异常,线程的创建方式,,线程安全,线程同步 day08-线程状态,volatile关键字、原子性、并发包、死锁、线程池 day09-方法引用, Stream流,File类...