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

本文介绍了如何在Java中实现斗地主游戏中一手牌的排序,包括冒泡排序和使用JDK内置的Comparator接口进行排序。通过比较牌的等级和花色来确定牌的顺序。
摘要由CSDN通过智能技术生成

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

}

}

相关阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值