package chapter6.demo64;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        /* 第一步：准备扑克牌的基本元素 */
        // 准备4种花色
        ArrayList<String> colors = new ArrayList<String>();
        colors.add("♠");
        colors.add("♥");
        colors.add("♣");
        colors.add("♦");

        // 准备13种点数（2-10，J，Q，K，A）
        ArrayList<String> point = new ArrayList<String>();
        for (int i = 2; i <= 10; i++) {
            point.add(i + "");
        }
        point.add("J");
        point.add("Q");
        point.add("K");
        point.add("A");

        /* 第二步：组装54张扑克牌 */
        // 用HashMap将每张牌的编号(0-53)与具体牌面对应起来
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        int index = 0;      // 牌的编号，从0开始

        // 两层循环，生成52张普通牌（13点数 × 4花色）
        for (String number : point) {
            for (String color : colors) {
                // 将花色与数字组合，形成52张牌，并赋予其编号
                map.put(index++, color + number);
            }
        }

        // 加入大小王，编号为52和53
        map.put(index++, "小☺");
        map.put(index++, "大☻");

        /* 第三步：洗牌准备 */
        // 准备一个数字序列，代表54张牌
        ArrayList<Integer> cards = new ArrayList<Integer>();
        for (int i = 0; i <= 53; i++) {
            cards.add(i);   // 此时的cards顺序为0-53
        }

        // 使用shuffle方法打乱牌的顺序（洗牌）
        Collections.shuffle(cards);

        /* 第四步：发牌 */
        // 创建4个集合，分别存储三个玩家的牌和底牌
        ArrayList<Integer> iPlayer = new ArrayList<Integer>();  // 玩家1的牌
        ArrayList<Integer> iPlayer2 = new ArrayList<Integer>(); // 玩家2的牌
        ArrayList<Integer> iPlayer3 = new ArrayList<Integer>(); // 玩家3的牌
        ArrayList<Integer> iSecretCards = new ArrayList<Integer>(); // 底牌

        // 发牌规则：留3张底牌，其余轮流发给3个玩家
        for (int i = 0; i < cards.size(); i++) {
            if (i >= 51) {
                iSecretCards.add(cards.get(i));// 留取3张底牌
            } else {
                if (i % 3 == 0) {
                    iPlayer.add(cards.get(i));  // 与3取余为0的牌发给玩家1
                } else if (i % 3 == 1) {
                    iPlayer2.add(cards.get(i)); // 与3取余为1的牌发给玩家2
                } else {
                    iPlayer3.add(cards.get(i)); // 其余的牌发给玩家3
                }
            }
        }

        /* 第五步：整理手牌 */
        // 对每个玩家手中的牌排序
        Collections.sort(iPlayer);
        Collections.sort(iPlayer2);
        Collections.sort(iPlayer3);

        /* 第六步：转换牌面并显示 */
        // iPlayer 中的存储的是每个玩家拥有的牌的编号（0-53）
        // 将玩家手中的牌号转换为具体的牌面
        ArrayList<String> sPlayer = new ArrayList<String>();
        ArrayList<String> sPlayer2 = new ArrayList<String>();
        ArrayList<String> sPlayer3 = new ArrayList<String>();
        ArrayList<String> sSecretCards = new ArrayList<String>();

        // 根据牌号，从map中找出对应的牌面
        for (Integer key : iPlayer) {
            sPlayer.add(map.get(key));
        }
        for (Integer key : iPlayer2) {
            sPlayer2.add(map.get(key));
        }
        for (Integer key : iPlayer3) {
            sPlayer3.add(map.get(key));
        }

        for (Integer key : iSecretCards) {
            sSecretCards.add(map.get(key));
        }

        // 展示每个玩家的牌
        System.out.println("玩家1：" + sPlayer);
        System.out.println("玩家2：" + sPlayer2);
        System.out.println("玩家3：" + sPlayer3);
        System.out.println("底牌：" + sSecretCards);
    }
}
