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