qq斗地主纸牌排序实现细节

本文介绍了一种用于斗地主游戏中纸牌排序的方法,包括定义纸牌实体类、实现比较方法及利用Java原生类进行排序的过程。

由于之前的博客被关了,今天重新开始博客了!

排牌规则:大王 >小王>2>A>K>Q>J>10>9>8>7>6>5>4>3,牌的点数一样就按牌的花色排序[红桃>方块>黑桃>棉花]!

纸牌图片存储地址格式如下图,

基于我们的图片地址是这样的存储格式,所以后面的代码都要围绕这点来展开!

 

数据结构:

其实也就是一个entity,名称我取为Card,代码如下:

package com.ansatsing.landlords.entity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.ansatsing.landlords.util.LandlordsUtil;
import com.google.common.base.Splitter;

public class Card{
private int number;//3,4,5,.....,14,15,16,17 对应牌3,4,5,6,7,8,9,10,J,Q,K,A,2,小王,大王
private String image;//存储地址的数字部分
private int colorFlag;//3-红桃,2-黑桃,1-棉花,0代表没有花色

public Card(int number, String image, int colorFlag) {
this.number = number;
this.image = image;
this.colorFlag = colorFlag;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public int getColorFlag() {
return colorFlag;
}
public void setColorFlag(int colorFlag) {
this.colorFlag = colorFlag;
}
}

 但我们要对纸牌排序,实体类就必须有比较方法,在java的世界里有比较方法就必须实现Comparable接口,实现后的代码如下:

package com.ansatsing.landlords.entity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.ansatsing.landlords.util.LandlordsUtil;
import com.google.common.base.Splitter;

public class Card implements Comparable<Card>{
private int number;//3,4,5,.....,14,15,16,17 对应牌3,4,5,6,7,8,9,10,J,Q,K,A,2,小王,大王
private String image;
private int colorFlag;//3-红桃,2-黑桃,1-棉花,0代表没有花色

public Card(int number, String image, int colorFlag) {
this.number = number;
this.image = image;
this.colorFlag = colorFlag;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public int getColorFlag() {
return colorFlag;
}
public void setColorFlag(int colorFlag) {
this.colorFlag = colorFlag;
}
public int compareTo(Card o) {//注意我们这是从大到小排序 所以 大于的时候返回 -1 小于的时候返回1
if(this.number > o.getNumber()) {
return -1;
}else if(this.number == o.getNumber()) {
if(this.colorFlag > o.getColorFlag()) {
return -1;
}else if(this.colorFlag == o.getColorFlag()){
return 0;
}else {
return 1;
}
}else {
return 1;
}
}

}

至于对card集合排序就直接用java原生的排序类。

通过传递指派图片地址里的数字来生成一个Card实体类,这步很关键,也是图片跟牌的点数连接的枢纽,我把这个功能写在工具类里,下面是实现这步的代码:

/**
* 根据图片地址产生Card实体对象,然后添加到list里,然后用来排序
* @param idx
* @return
*/
public static Card generateCard(int idx) {
Card card = null;
int number = 0;//3,4,5,.....,14,15,16,17 对应牌3,4,5,6,7,8,9,10,J,Q,K,A,2,小王,大王
String image;
int colorFlag = 0;//4-红桃,3-方块,2-黑桃,1-棉花 0-没有花色
if(idx ==1 ) {//大王
number = 17;
colorFlag = 0;
image = String.valueOf(idx);
card = new Card(number, image, colorFlag);
return card;
}else if(idx == 2) {// 小王
number = 16;
colorFlag = 0;
image = String.valueOf(idx);
card = new Card(number, image, colorFlag);
return card;
}else {
if(idx >=3 && idx <=15) {//黑桃
number = idx;
colorFlag = 2;
}else if(idx >= 16 && idx <= 28) {//红桃
number = idx -13;
colorFlag = 4;
}else if(idx >= 29 && idx <= 41) {//棉花
number = idx -26;
colorFlag = 1;
}else if(idx >= 42 && idx <= 54) {//方块
number = idx -39;
colorFlag = 3;
}
image = String.valueOf(idx);
card = new Card(number, image, colorFlag);
return card;
}
}

最终完整的排序测试代码如下:

public static void main(String[] args) {
String cards = LandlordsUtil.getRondomCards();//产生一副随机牌,以图片的地址里的数字作为值,产生格式如:2,4,1,....
List<String> cardList = Splitter.on(",").splitToList(cards);
List<Card> list = new ArrayList<Card>();
Card card = null;
for(String cString:cardList) {
card = LandlordsUtil.generateCard(Integer.valueOf(cString));
list.add(card);
}
for(Card card2 : list) {
System.out.print(card2.getImage()+"-");
}
Collections.sort(list/*,new CardComparator()*/);
System.out.println("=================排序后=====================");
for(Card card2 : list) {
System.out.print(card2.getImage()+"-");
}
}

 

qq斗地主源码:https://gitee.com/ansatsing

转载于:https://www.cnblogs.com/ansating/p/7736050.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值