卡牌魔术猜数字

从左到右,依次发牌,正面朝下,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张,这样的魔术才称得上真正的魔术。

你可能感兴趣的:(土味,java,算法,游戏)