从左到右,依次发牌,正面朝下,21张牌分3组,每组7张,让观众从第二组中默记一张牌,然后通过两次卡牌的重组与拆分,并让观众指出所在组别,最后猜出观众默记的牌。
代码
@Test
public void test0531() {
poker();
}
public void poker() {
int num = 21;
int[] poker = new int[21];
// 随机顺序
LinkedList<Integer> list = new LinkedList<>();
for (int i=1; i<num+1; i++) {
list.add(i);
}
Random random = new Random();
for (int i=0; i<num; i++) {
int index = random.nextInt(num-i);
poker[i] = list.remove(index);
}
Stack<Integer> group1 = new Stack<>();
Stack<Integer> group2 = new Stack<>();
Stack<Integer> group3 = new Stack<>();
// 分组
for (int i=poker.length-1; i>-1; i -= 3) {
group1.add(poker[i]);
group2.add(poker[i-1]);
group3.add(poker[i-2]);
}
System.out.println("第一组牌:");
for (int item : group1) {
System.out.print(item + "\t");
}
System.out.println();
System.out.println("第二组牌:");
for (int item : group2) {
System.out.print(item + "\t");
}
System.out.println();
System.out.println("第三组牌:");
for (int item : group3) {
System.out.print(item + "\t");
}
Scanner scanner = new Scanner(System.in);
System.out.println();
System.out.println("请从第二组牌里面默记一张牌,输入【OK】开始");
String username = scanner.nextLine();
if ("ok".equalsIgnoreCase(username)) {
System.out.println();
System.out.println();
System.out.println("重新分牌");
shuffle(poker, group1, group2, group3);
System.out.println();
System.out.println("请输入默记的牌所在组别【1,2,3】");
String round1 = scanner.nextLine();
shuffle(poker, group1, group2, group3);
System.out.println();
System.out.println("请输入默记的牌所在组别【1,2,3】");
String round2 = scanner.nextLine();
switch (round1 + round2) {
case "11":
System.out.println("11");
break;
case "12":
System.out.println("你默记的数字是:" + group2.get(5));
break;
case "13":
System.out.println("你默记的数字是:" + group3.get(5));
break;
case "21":
System.out.println("你默记的数字是:" + group1.get(3));
break;
case "22":
System.out.println("你默记的数字是:" + group2.get(3));
break;
case "23":
System.out.println("你默记的数字是:" + group3.get(3));
break;
case "31":
System.out.println("你默记的数字是:" + group1.get(1));
break;
case "32":
System.out.println("你默记的数字是:" + group2.get(1));
break;
case "33":
System.out.println("22");
break;
default:
System.out.println("输入错误");
}
}
}
private void shuffle(int[] poker, Stack<Integer> group1, Stack<Integer> group2, Stack<Integer> group3) {
int k=0;
for (int item : group1) {
poker[k++] = item;
}
for (int item : group2) {
poker[k++] = item;
}
for (int item : group3) {
poker[k++] = item;
}
group1.clear();
group2.clear();
group3.clear();
for (int i=poker.length-1; i>-1; i -= 3) {
group1.add(poker[i]);
group2.add(poker[i-1]);
group3.add(poker[i-2]);
}
System.out.println();
System.out.println("第一组牌:");
for (int item : group1) {
System.out.print(item + "\t");
}
System.out.println();
System.out.println("第二组牌:");
for (int item : group2) {
System.out.print(item + "\t");
}
System.out.println();
System.out.println("第三组牌:");
for (int item : group3) {
System.out.print(item + "\t");
}
}
示例
第一组牌:
8 12 9 15 3 4 10
第二组牌:
11 16 14 7 17 21 20
第三组牌:
18 6 19 5 1 2 13
请从第二组牌里面默记一张牌,输入【OK】开始
ok // 比如默记卡牌【14】
重新分牌
第一组牌:
13 5 18 17 16 4 9
第二组牌:
2 19 20 7 11 3 12
第三组牌:
1 6 21 14 10 15 8
请输入默记的牌所在组别【1,2,3】
3 // 【14】在第三组
重新分牌
第一组牌:
8 14 1 11 19 4 18
第二组牌:
15 21 12 7 2 16 5
第三组牌:
10 6 3 20 9 17 13
请输入默记的牌所在组别【1,2,3】
1 // 【14】在第一组
你默记的数字是:14
解密
- 观众从第二组7张牌中默记一张后,会对第二组7张牌进行第一次分牌,分三组,每组分别是3,2,2张牌。
- 由观众指出在哪一组,那么观众默记的牌就在那组的3张牌或者2张牌中,我们只要记住那3张牌或者2张牌的位置就行。
- 然后再次分牌,我们记住的那3张牌或者2张牌会均匀的分散在3组中,并且每组只有1张我们记住的牌。
- 这时再让观众指出在哪一组,那么我们可以确定的拿出那张记住的牌,而这张牌正是观众默记的那张。
- 由原来的7张中猜1张,变成1张中选1张,这样的魔术才称得上真正的魔术。