package com.gtf;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author gtf
 * @date 2024/2/10 02:24
 */
public class Demo {
    public static void main(String[] args) {
        //1。定义四张扑克牌也就是一个数组,假设这四张是我的扑克牌
        String[] poker1 = {"K", "A", "Q", "J"};
        System.out.println("原始扑克牌顺序" + Arrays.toString(poker1));
        //2。随机打乱顺序
        Collections.shuffle(Arrays.asList(poker1));
        System.out.println("打乱扑克牌以后的顺序: " + Arrays.toString(poker1));
        //3。撕下来扑克牌,那也就是 打乱以后的数组克隆一份相加
        String[] poker2 = new String[8];
        for (int i = 0; i < poker1.length; i++) {
            poker2[i] = poker1[i];
        }
        for (int i = 0; i < poker1.length; i++) {
            poker2[poker1.length + i] = poker1[i];
        }
        System.out.println("撕开扑克牌以后的数据: " + Arrays.toString(poker2));
        //todo 在这个过程过你会发现,顺序是相同的,这是魔术的关键点1,必须相同否则会有问题
        //魔术步骤1:你的名字几个字 就往下排几张 ok,我就写2个字吧,那就是把这个数组位置替换2个位置,第一个拿走的位置 就是下标1,第二个拿走的位置就是下标0
        String temp1 = poker2[poker2.length - 2];
        String temp2 = poker2[poker2.length - 1];
        for (int i = poker2.length - 1; i >= 2; i--) {
            poker2[i] = poker2[i - 2];
        }
        poker2[0] = temp1;
        poker2[1] = temp2;
        System.out.println("我就两个字测试,根据名字紫薯打乱以后的: " + Arrays.toString(poker2));
        //todo 经过上面名字切牌的过程,你会发现魔术神奇的地方来了,不关你是几个字,顺序都是一摸一样的,四个一组。
        //魔术步骤2:前面三张扑克牌,插入到中间的任意位置,我就将除第一个 最后一个随机打乱
        String[] extracted = Arrays.copyOfRange(poker2, 0, 3);
        String[] remaining = Arrays.copyOfRange(poker2, 3, poker2.length);
        // 将取出的元素插入到剩余元素数组的指定位置
        String[] poker3 = new String[extracted.length + remaining.length];
        System.arraycopy(remaining, 0, poker3, 0, 1);
        System.arraycopy(extracted, 0, poker3, 1, extracted.length);
        System.arraycopy(remaining, 1, poker3, 4, remaining.length - 1);
        System.out.println("前面三张扑克牌,插入到中间的任意位置:我插入的是下标为1的位置也就是第2个元素 "
                + Arrays.toString(poker3));
        //todo 经过这一个步骤,聪明的你又看出来问题了,无论怎么操作,只要插入到非第一张和最后一张的位置,
        // 第一张和最后一张永远是一样的
        // 魔术步骤3:将第一张牌拿出去。
        System.out.println("把第一张藏起来,拿出去的扑克牌  " + poker3[0]);
        String[] poker4 = new String[poker3.length - 1];
        System.arraycopy(poker3, 1, poker4, 0, poker4.length);
        System.out.println("男生拿出去一张扑克牌,拿出去扑克牌以后,现在的扑克牌  " + Arrays.toString(poker4));
        //魔术步骤4:男生丢掉1张,女生丢掉2张 ,这边无所谓的,保留6张就行。
        for (int i = 0; i < poker4.length - 1; i++) {
            poker4[i] = poker4[i + 1];
        }
        String[] poker5 = new String[poker4.length - 1];
        System.arraycopy(poker4, 0, poker5, 0, poker5.length);
        System.out.println("男生丢完以后的扑克牌  " + Arrays.toString(poker5));
        //todo 经过这一个步骤,聪明的你又看出来了,无论男生还是女生,只要最后一张牌不丢都无所谓的。
        //魔术步骤5:见证奇迹的时刻 ,7个字这边就定义7次循环了
        // 循环7次,每次将最后一个元素移动到第一个位置,其他元素前移
        for (int i = 0; i < 7; i++) {
            String temp = poker5[poker5.length - 1];
            for (int j = poker5.length - 1; j > 0; j--) {
                poker5[j] = poker5[j - 1];
            }
            poker5[0] = temp;
        }
        System.out.println("见证奇迹的时刻循环7次: " + Arrays.toString(poker5));
        //todo 经过这一个步骤,聪明的你又看出来了,你想预留的那个扑克牌在第一个位置不变,
        // 下面就是很随意的将第一个元素变成最后一个元素,删除掉原始的第二个元素,直到剩余最后一个元素
        int numIterations = poker5.length - 1;
        ArrayList<String> list = new ArrayList<>(Arrays.asList(poker5));
        for (int i = 0; i < numIterations; i++) {
            String removedElement = list.remove(1);
            list.add(removedElement);
        }
        String[] finalArr = new String[1];
        finalArr[0] = list.get(0);
        System.out.println("循环直到剩下最后一张扑克牌 " + Arrays.toString(finalArr));
    }
}