-
需求:在启动游戏房间的时候,应该提前准备好54张牌,完成洗牌、发牌、牌排序、逻辑。
-
分析:
-
当系统启动的同时需要准备好数据的时候,就可以用静态代码块了。
-
洗牌就是打乱牌的顺序。
-
定义三个玩家、依次发出51张牌
-
给玩家的牌进行排序(拓展)
-
输出每个玩家的牌数据。
源码如下
package set;
import java.util.*;
public class GameDemo {
/**
* 定义一个静态的集合存储54张牌对象
*
* @param args
*/
public static List<Card> allCards = new ArrayList<>();
/**
* 做牌: 定义静态代码块初始化牌数据
* @param args
*/
static {
// 1. 定义点数: 个数确定 ,类型确定,使用数组
String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
// 2. 定义花色
String[] colors = {"♥", "♣", "♦", "♠"};
// 3. 组合点数和花色
int index = 0;// 记录牌的大小
for (String size : sizes) {
index++;
for (String color : colors) {
// 4. 封装成一个牌对象
Card c = new Card(size, color, index);
// 5. 存入到集合容器
allCards.add(c);
}
}
// 大小王存入到集合对象
Card c1 = new Card("", "小王", ++index);
Card c2 = new Card("", "大王", ++index);
Collections.addAll(allCards, c1, c2);
System.out.println("新牌" + allCards);
}
public static void main(String[] args) {
// 9. 洗牌
Collections.shuffle(allCards);
System.out.println("洗牌后" + allCards);
// 10. 发牌(定义三个玩家,每个玩家的牌也是一个集合容器)
List<Card> hui = new ArrayList<>();
List<Card> wen = new ArrayList<>();
List<Card> li = new ArrayList<>();
// 11. 开始发牌51张牌+3张底牌
for (int i = 0; i < allCards.size() - 3; i++) {
// 先拿到当前牌对象
Card c = allCards.get(i);
if (i % 3 == 0) {
// 请li接牌
li.add(c);
} else if (i % 3 == 1) {
// 请liwen接牌
liwen.add(c);
} else if (i % 3 == 2) {
liwenhui.add(c);
}
}
// 12. 拿到最后三张底牌 (把最后三张牌截取成一个子集和)
List<Card> lastThereCards = allCards.subList(allCards.size() - 3, allCards.size());
//13. 给玩家的牌排序(从大到小)
// Collections.sort(li, new Comparator<Card>() {
// @Override
// public int compare(Card o1, Card o2) {
// return 0;
// }
// });
sortCards(li);
sortCards(wen);
sortCards(hui);
//14. 输出玩家的牌
System.out.println("李: " + li);
System.out.println("文: " + wen);
System.out.println("汇: " + hui);
System.out.println("底牌: " + lastThereCards);
}
/**
* 给牌排序
*
* @param cards
*/
private static void sortCards(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
// o1 = J♥
// o2 = A♦
// 知道牌的大小才可以指定规则
return o1.getIndex() - o2.getIndex();
}
});
}
}
package set;
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 int getIndex() {
return index;
}
public void setIndex(int index) {
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 Card(String color) {
this.color = color;
}
@Override
public String toString() {
return size + color;
}
}