package chapter6.demo64; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class Function { // 存储牌号和牌面的对应关系 private static HashMap cardMap = new HashMap<>(); public static void main(String[] args) { // 1. 准备牌的基本元素 ArrayList colors = prepareColors(); ArrayList points = preparePoints(); // 2. 组装54张牌 createCards(colors, points); // 3. 洗牌准备 ArrayList cards = shuffleCards(); // 4. 发牌 ArrayList> dealtCards = dealCards(cards); ArrayList iPlayer = dealtCards.get(0); ArrayList iPlayer2 = dealtCards.get(1); ArrayList iPlayer3 = dealtCards.get(2); ArrayList iSecretCards = dealtCards.get(3); // 5. 整理手牌 sortCards(iPlayer, iPlayer2, iPlayer3); // 6. 转换并显示牌面 showCards(iPlayer, iPlayer2, iPlayer3, iSecretCards); } /** * 准备扑克牌的4种花色 * @return ArrayList 包含4种花色符号的列表 */ private static ArrayList prepareColors() { ArrayList colors = new ArrayList<>(); colors.add("♠"); colors.add("♥"); colors.add("♣"); colors.add("♦"); return colors; } /** * 准备扑克牌的13种点数 * @return ArrayList 包含2-10,J,Q,K,A的点数列表 */ private static ArrayList preparePoints() { ArrayList points = new ArrayList<>(); for (int i = 2; i <= 10; i++) { points.add(i + ""); } points.add("J"); points.add("Q"); points.add("K"); points.add("A"); return points; } /** * 创建54张扑克牌,并建立编号和牌面的映射关系 * @param colors 花色列表 * @param points 点数列表 */ private static void createCards(ArrayList colors, ArrayList points) { int index = 0; for (String number : points) { for (String color : colors) { cardMap.put(index++, color + number); } } cardMap.put(index++, "小☺"); cardMap.put(index++, "大☻"); } /** * 生成54张牌的编号并随机打乱顺序 * @return ArrayList 洗好的牌的编号列表(0-53) */ private static ArrayList shuffleCards() { ArrayList cards = new ArrayList<>(); for (int i = 0; i <= 53; i++) { cards.add(i); } Collections.shuffle(cards); return cards; } /** * 将54张牌分发给三个玩家和底牌 * @param cards 洗好的牌的编号列表 * @return ArrayList> 包含四个列表的集合: * 索引0-2分别为三个玩家的牌,索引3为底牌 */ private static ArrayList> dealCards(ArrayList cards) { ArrayList iPlayer = new ArrayList<>(); ArrayList iPlayer2 = new ArrayList<>(); ArrayList iPlayer3 = new ArrayList<>(); ArrayList iSecretCards = new ArrayList<>(); for (int i = 0; i < cards.size(); i++) { if (i >= 51) { iSecretCards.add(cards.get(i)); } else { if (i % 3 == 0) { iPlayer.add(cards.get(i)); } else if (i % 3 == 1) { iPlayer2.add(cards.get(i)); } else { iPlayer3.add(cards.get(i)); } } } ArrayList> result = new ArrayList<>(); result.add(iPlayer); result.add(iPlayer2); result.add(iPlayer3); result.add(iSecretCards); return result; } /** * 对玩家手中的牌进行排序 * @param players 可变参数,接收多个玩家的牌列表 */ private static void sortCards(ArrayList... players) { for (ArrayList player : players) { Collections.sort(player); } } /** * 展示所有玩家的牌和底牌 * @param iPlayer 玩家1的牌号列表 * @param iPlayer2 玩家2的牌号列表 * @param iPlayer3 玩家3的牌号列表 * @param iSecretCards 底牌列表 */ private static void showCards(ArrayList iPlayer, ArrayList iPlayer2, ArrayList iPlayer3, ArrayList iSecretCards) { ArrayList sPlayer = convertToCardFace(iPlayer); ArrayList sPlayer2 = convertToCardFace(iPlayer2); ArrayList sPlayer3 = convertToCardFace(iPlayer3); ArrayList sSecretCards = convertToCardFace(iSecretCards); System.out.println("玩家1:" + sPlayer); System.out.println("玩家2:" + sPlayer2); System.out.println("玩家3:" + sPlayer3); System.out.println("底牌:" + sSecretCards); } /** * 将牌号转换为具体的牌面 * @param cards 牌号列表 * @return ArrayList 转换后的牌面列表 */ private static ArrayList convertToCardFace(ArrayList cards) { ArrayList result = new ArrayList<>(); for (Integer key : cards) { result.add(cardMap.get(key)); } return result; } }