春晚刘谦魔术java代码揭秘

    172
    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));
        }
    }