案例:
- 在启动游戏房间的时候,应该提前准备好54张牌,完成洗牌,发牌,牌排序,逻辑。
分析:
定义一个牌类:
//定义一个牌类,用于集合存储牌对象
public class Card {
private String size;//点数
private String color;//花色
private int index;//牌的大小--》用于后面对牌进行排序
public Card() {
}
public Card(String size, String color, int index) {
this.size = size;
this.color = color;
this.index = index;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public String toString() {
return size + color;
}
}
1.定义一个静态的集合存储54张牌对象 :
public static List<Card> allCards = new ArrayList<>();
2.做牌(将花色与点数组合成一副牌),定义静态代码块初始化数据(类被加载的时候被执行,且优先于各种代码块和构造函数):
//2.做牌(将花色与点数组合成一副牌),定义静态代码块初始化数据(类被加载的时候被执行,且优先于各种代码块和构造函数)
static {
//2.1定义点数,个数确定,类型确定,使用数组
String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//2.2定义花色,个数确定,类型确定,使用数组
String[] colors = {"♠","♣","♥","♦"};
//2.3组合点数和花色
int index = 0;//记录牌的大小
for (String size : sizes) {
index++;//每遍历一个点数,牌的大小加1
for (String color : colors) {
//2.4封装成一个牌对象
Card c = new Card(size,color,index);
//2.5存入集合容器
allCards.add(c);
}
}
//2.6将大小王存进集合对象中
Card c1 = new Card("","大王",++index);
Card c2 = new Card("","小王",++index);
Collections.addAll(allCards,c1,c2);
System.out.println("新牌:" + allCards);
}
3.洗牌:
//3.洗牌,使用public static void shuffle(List<?> List)打乱集合顺序
Collections.shuffle(allCards);
System.out.println("洗牌后:" + allCards);
4.发牌:
//4.发牌(定义三个玩家,每个玩家的牌也是集合容器)
List<Card> player01 = new ArrayList<>();
List<Card> player02 = new ArrayList<>();
List<Card> player03 = new ArrayList<>();
//4.1开始发牌(从总牌集合中发出51张牌给三位玩家,剩余三张牌作为地主牌)
for (int i = 0; i < allCards.size() - 3; i++) {
//4.1.1先拿到当前牌对象
Card c = allCards.get(i);
//4.1.2判断三位玩家怎么拿到相应的牌————》以三个索引为一组,每组的每个索引除3取余都是0,1,2,所以将三位玩家对应索引的余数得到相应的牌
if (i % 3 == 0){
//余数为0————》player01
player01.add(c);
}else if (i % 3 == 1){
//余数为1————》player02
player02.add(c);
}else if (i % 3 == 2){
//余数为2————》player03
player03.add(c);
}
}
//4.1.3地主牌(把最后三张牌截取成一个子集合)
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
5.给玩家的牌排序:
//5.给玩家的牌进行排序(从大到小)创建一个方法对各个玩家的牌进行排序
sortCards(player01);
sortCards(player02);
sortCards(player03);
/**
* 给玩家的牌进行排序
* @param cards 各个玩家得到的牌
*/
private static void sortCards(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o2.getIndex() - o1.getIndex();
}
});
}
6.输出各位玩家的牌和地主牌:
//6.输出各玩家的牌和地主牌
System.out.println("player01:" + player01);
System.out.println("player02:" + player02);
System.out.println("player03:" + player03);
System.out.println("地主牌:" + lastThreeCards);