需求: 在启动游戏房间的时候,应该提前准备好54张牌,完成洗牌、发牌、牌排序、逻辑。
分析:
当系统启动的同时需要准备好数据的时候,就可以用静态代码块了。
洗牌就是打乱牌的顺序。
定义三个玩家、依次发出51张牌
给玩家的牌进行排序(拓展)
输出每个玩家的牌数据。
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;}@Overridepublic String toString() {return size + color;}
}
public class GameDemo {/**1、定义一个静态的集合存储54张牌对象*/public static List<Card> allCards = new ArrayList<>();/**2、做牌:定义静态代码块初始化牌数据*/static {// 3、定义点数:个数确定,类型确定,使用数组String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};// 4、定义花色:个数确定,类型确定,使用数组String[] colors = {"♠", "♥", "♣", "♦"};// 5、组合点数和花色int index = 0; // 记录牌的大小for (String size : sizes) {index++;for (String color : colors) {// 6、封装成一个牌对象。Card c = new Card(size, color, index);// 7、存入到集合容器中去allCards.add(c);}}// 8 大小王存入到集合对象中去 "👲" , "🃏"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> linhuchong = new ArrayList<>();List<Card> jiumozhi = new ArrayList<>();List<Card> renyingying = new ArrayList<>();// 11、开始发牌(从牌集合中发出51张牌给三个玩家,剩余3张作为底牌)// allCards = [🃏, A♠, 5♥, 2♠, 2♣, Q♣, 👲, Q♠ ...// i 0 1 2 3 4 5 6 7 % 3for (int i = 0; i < allCards.size() - 3; i++) {// 先拿到当前牌对象Card c = allCards.get(i);if(i % 3 == 0) {// 请阿冲接牌linhuchong.add(c);}else if(i % 3 == 1){// 请阿鸠jiumozhi.add(c);}else if(i % 3 == 2){// 请盈盈接牌renyingying.add(c);}}// 12、拿到最后三张底牌(把最后三张牌截取成一个子集合)List<Card> lastThreeCards = allCards.subList(allCards.size() - 3 , allCards.size());// 13、给玩家的牌排序(从大到小 可以自己先试试怎么实现)sortCards(linhuchong);sortCards(jiumozhi);sortCards(renyingying);// 14、输出玩家的牌:System.out.println("啊冲:" + linhuchong);System.out.println("啊鸠:" + jiumozhi);System.out.println("盈盈:" + renyingying);System.out.println("三张底牌:" + lastThreeCards);}/**给牌排序* @param cards*/private static void sortCards(List<Card> cards) {// cards = [J♥, A♦, 3♥, 🃏, 5♦, Q♥, 2♥Collections.sort(cards, new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {// o1 = J♥// o2 = A♦// 知道牌的大小,才可以指定规则return o2.getIndex() - o1.getIndex();}});}}