【原理分析】用JAVA还原刘谦在2024央视春晚的扑克牌魔术

news2024/11/29 20:54:09

【原理分析】用JAVA分析刘谦在2024央视春晚的扑克牌魔术

  • 前言
  • 原理分析
  • 代码实现
    • 程序结构
    • 变量和方法
    • 程序思路
    • 代码实现
    • 运行截图
  • 总结


前言

      央视春晚与魔术师刘谦从2009年开始,近十年间深度捆绑,刘谦开辟了春晚近景魔术的先河,一句“见证奇迹的时刻”成为刘谦在观众心中的Slogan。 2024年,刘谦重返央视春晚舞台,从观众的反响上来看,可以说,刘谦还是刘谦。

在这里插入图片描述

(当然,还有没拼上的小尼哈哈哈哈)

在这里插入图片描述


原理分析

      这两天博主也是刷到很多关于分析刘谦今年的魔术的文章或者视频,各位都通过自己的所学专业知识来分析,条条大路通罗马,大家最后的分析结果也是殊途同归。原理方面就不过多介绍了,下面放一个简单的流程。


1. 定义参数:名字长度、性别和地区
2. 模拟撕牌过程:复制四张扑克牌,得到8张扑克牌
3. 按照名字长度依次将第一张牌放到最后
4. 将上面3张牌放到剩余5张牌的中间
5. 将第一张扑克牌拿出来
6. 根据地理位置拿起1-3张放在剩下牌的中间
7. 根据性别将前1-2张牌扔掉
8. 见证奇迹的时刻:循环执行7次,每次将第一张扑克牌取出并添加到扑克牌末尾
9. 好运留下来,烦恼丢出去:循环执行直到只剩一张扑克牌为止,每次将第一张扑克牌取出并添加到扑克牌末尾,并删除第一张扑克牌,再将第二张扑克牌取出并删除
10. 输出最后手里的扑克牌和藏起来的扑克牌


代码实现

程序结构

      从代码结构上看,“LiuQian”程序主要由一个名为“main”的方法组成,这是Java程序的入口点。在“main”方法内,程序首先通过Scanner对象获取用户输入的名字长度、地理位置和性别等信息,然后按照一定的规则对一副牌进行操作,最终得到一张“藏起来”的牌。
      具体而言,程序使用了一个List< String >类型的变量“cards”来表示纸牌序列,然后按照原理分析中的步骤进行操作。最终,程序会输出最后手里的牌和藏起来的牌。


变量和方法

在“LiuQian”程序中,主要使用了以下变量和方法:

变量描述
cards用于存储纸牌序列,是一个List类型的变量。
hide用于存储藏起来的牌,是一个String类型的变量。
方法描述
getRegionName根据地理位置编号返回对应的地理位置名称。
getGenderName根据性别编号返回对应的性别名称。

程序思路

      从上述代码结构和变量、方法等方面分析,“LiuQian”程序的实现过程可以概括为以下几个步骤:

获取用户输入的名字长度、地理位置和性别等信息;
使用List<String>类型的变量“cards”表示一副牌,并按照一定的规则对其进行操作,包括模拟撕牌过程、按照名字长度依次将第一张牌放到最后、将上面3张牌放到剩余5张牌的中间、根据地理位置拿起1-3张放在剩下牌的中间、根据性别将前1-2张牌扔掉、见证奇迹的时刻交换前7张牌和后7张牌、好运留下来,烦恼丢出去;
输出最后手里的牌和藏起来的牌。

这些步骤相互联系,共同构成了程序的核心思路,也是实现魔术表演中抽牌过程的关键。


代码实现

package com.richard.code;

import java.util.*;

public class LiuQian {
    private static List<String> cards;
    private static String hide;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("请输入名字长度:");
        int Name = sc.nextInt(); // 名字长度

        System.out.println("请选择地理位置(1:南方, 2:北方):");
        int Region = sc.nextInt(); // 区域选择

        System.out.println("请选择性别(1:男性, 2:女性):");
        int Gender = sc.nextInt(); // 性别

        // 步骤 1: 模拟撕牌过程
        cards = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
        List<String> split = new ArrayList<>(cards);
        cards.addAll(split);

        System.out.printf("本次测试观众是名字为%d个字的%s%s观众:\n", Name, getRegionName(Region), getGenderName(Gender));

        System.out.println("牌序为" + cards);


        // 步骤 2: 按照名字长度依次将第一张牌放到最后
        for (int i = 0; i < Name; i++) {
            String remove = cards.get(0);
            cards.remove(0);
            cards.add(remove);
        }
        System.out.println("按照名字长度换" + Name + "张牌后,纸牌顺序为:" + cards);

        // 步骤 3: 将上面3张牌放到剩余5张牌的中间
        List<String> cardsPlugin = cards.subList(0, 3);
        Random random = new Random();
        int plugIndex = random.nextInt(4) + 4;
        List<String> newCards = new ArrayList<>(cards.subList(3, plugIndex));
        newCards.addAll(cardsPlugin);
        newCards.addAll(cards.subList(plugIndex, cards.size()));
        System.out.println("将最上面3张插入剩下第" + (plugIndex - 3) + "张纸牌下面纸牌顺序为:" + newCards);

        // 步骤 4: 根据地理位置拿起1-3张放在剩下牌的中间
        List<String> cardsRegion = newCards.subList(0, Region);
        int plugIndex2 = random.nextInt(6 - Region) + Region + 1;
        List<String> newNewCards = new ArrayList<>(newCards.subList(Region, plugIndex2));
        newNewCards.addAll(cardsRegion);
        newNewCards.addAll(newCards.subList(plugIndex2, newCards.size()));
        System.out.println("根据地理位置,前" + Region + "张牌放到剩余的第" + (plugIndex2 - 2) + "张牌之后牌序为:" + newNewCards);

        // 步骤 5: 根据性别将前1-2张牌扔掉
        for (int j = 0; j < Gender; j++) {
            newNewCards.remove(0);
        }
        System.out.println("根据性别,将前" + Gender + "张牌扔掉,纸牌顺序为:" + newNewCards);

        // 步骤 6: 见证奇迹的时刻
        for (int k = 0; k < 7; k++) {
            String exchange = newNewCards.get(0);
            newNewCards.remove(0);
            newNewCards.add(exchange);
        }
        System.out.println("根据“见证奇迹的时刻”交换后,纸牌顺序为:" + newNewCards);

        //  步骤 7: 好运留下来,烦恼丢出去
        while (newNewCards.size() > 1) {
            String goodLuck = newNewCards.get(0);
            newNewCards.add(goodLuck);
            newNewCards.remove(0);
            System.out.println("“好运留下来”后,纸牌顺序为:" + newNewCards);
            newNewCards.remove(0);
            System.out.println("“烦恼丢出去”后,纸牌顺序为:" + newNewCards);
        }

        hide = newNewCards.get(0);
        System.out.println("最后的手牌为" + newNewCards.get(0) + ",藏起来的牌是" + hide);


    }

    private static String getRegionName(int region) {
        switch (region) {
            case 1:
                return "南方";
            case 2:
                return "北方";
            case 3:
                return "中原";
            default:
                return "";
        }
    }

    private static String getGenderName(int gender) {
        switch (gender) {
            case 1:
                return "男性";
            case 2:
                return "女性";
            default:
                return "";
        }
    }
}


运行截图

以博主本人为例:
在这里插入图片描述

以小尼为例,尼格买提·热合曼:
在这里插入图片描述


总结

Respect to LiuQian!
      他将数学的逻辑和推理与魔术的幻觉和娱乐性相结合,使得观众在欣赏他的表演过程中不仅能感受到魔术的神秘感,还能够从中领略到数学的美妙之处引发对数学的讨论。这种结合不仅提升了魔术表演的艺术价值,还为观众带来了一种全新的数学体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue前端RSA使用公钥进行加密,公钥进行解密

记录下RSA使用公钥进行加密&#xff0c;公钥进行解密&#xff1a; 背景&#xff1a;由于项目要求前后端进行数据加密传输&#xff0c;具体数据使用aes进行加密&#xff0c;aes密钥使用rsa进行加密&#xff0c;加密后的aes密钥放在请求头和响应头进行传输。这里实现的是前端vue…

《Java 简易速速上手小册》第3章:Java 数据结构(2024 最新版)

文章目录 3.1 数组和字符串 - 数据的基本营地3.1.1 基础知识3.1.2 重点案例&#xff1a;统计文本中的单词频率3.1.3 拓展案例 1&#xff1a;寻找数组中的最大元素3.1.4 拓展案例 2&#xff1a;反转字符串 3.2 集合框架概述 - 数据小队的训练场3.2.1 基础知识3.2.2 重点案例&…

项目计划制定攻略:从构思到执行的完整指南

在任何项目中&#xff0c;制定一个全面、详细的项目计划是至关重要的。项目计划是项目成功的基石&#xff0c;它提供了项目的路线图和指导&#xff0c;帮助团队成员了解项目的目标、里程碑和时间表。本文将详细介绍如何制定一个高质量的项目计划&#xff0c;确保项目顺利实施。…

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…

第十三课 PCB保姆级规则设置(二)

1.Routing&#xff1a;信号的线宽规则&#xff0c;包含了过孔的规则 1&#xff09;线宽设置 线宽和安全距离一致&#xff08;主控芯片决定&#xff09; 电源和GND线宽不同设置 2&#xff09;网络类&#xff1a;Net Class的设置 快捷键&#xff1a;DC 点击<All Nets>&a…

Leetcode 606.根据二叉树创建字符串

给你二叉树的根节点root&#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对"root"表示&#xff0c;转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射…

【C++】static静态关键字

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java并发基础:ConcurrentLinkedDeque全面解析!

内容概要 ConcurrentLinkedDeque类提供了线程安全的双端队列操作&#xff0c;支持高效的并发访问&#xff0c;因此在多线程环境下&#xff0c;可以放心地在队列的两端添加或移除元素&#xff0c;而不用担心数据的一致性问题。同时&#xff0c;它的内部实现采用了无锁算法&…

Web安全研究(六)

文章目录 HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs文章结构Introjs obfuscationmethodologyExample HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs CCS 2019 CISPA 恶意软件领域&#xff0c;基于学习的系统已经非常流行&am…

嵌入式Qt 计算器界面设计代码重构

一.计算器界面设计代码重构 计算器界面设计&#xff1a;嵌入式Qt 计算器界面设计-CSDN博客 重构的概念&#xff1a; 代码实现与代码重构的不同&#xff1a; 软件开发过程&#xff1a; 什么样的代码需要重构&#xff1a; 计算器界面代码重构的框架设计&#xff1a; 实验&#…

实现JNDI

实现JNDI 问题陈述 Smart Software Developer Ltd.想要开发一款Web应用程序,它使用servlt基于雇员ID显示雇员信息,雇员ID由用户通过HTML用户界面传递。雇员详细信息存储在Employee_Master表中。另外,Web应用程序应显示网站被访问的次数。 解决方案 要解决上述问题,需要执…

福布斯2023年推荐:十佳项目管理软件榜单揭晓

项目管理软件可以轻松规划项目、分配任务并保持团队井井有条&#xff0c;以便满足截止日期和目标。然而当今市场上有如此多的项目管理系统&#xff0c;选择适合您需求的正确选项可能很困难。为了提供帮助&#xff0c;福布斯小型企业顾问团队分析了数十家领先的提供商&#xff0…

【医学知识图谱 自动补全 关系抽取】生成模型 + 医学知识图谱 = 发现三元组隐藏的关系实体对

生成模型 医学知识图谱 发现三元组新关系实体对 提出背景问题&#xff1a;如何自动发现并生成医疗领域中未被标注的实体关系三元组&#xff1f;CRVAE模型 提出背景 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3219819.3220010 以条件关系变分自编码器&#xff08;…

【通讯录案例-归档解档 Objective-C语言】

一、接下来,我们来说这个“归档”、“解档”、 1.归档、解档、这一块儿呢 首先呢,我们这个目标啊,还是跟“代理”差不多,要会用, 一会儿给大家画一幅图,让大家去了解“归档”、“解档”、每一句话,到底都干了什么, 好,我们先新建一个项目, 新建一个项目 新建一个…

Python实现EMV指标计算:股票技术分析的利器系列(2)

Python实现EMV指标计算&#xff1a;股票技术分析的利器系列&#xff08;2&#xff09; 介绍算法解释&#xff1a; 核心代码&#xff1a;rolling函数介绍 完整代码&#xff1a;一定要看 介绍 先看看官方介绍&#xff1a; EMV(简易波动指标&#xff09; 用法 1.EMV 由下往上穿越…

“操作符大揭秘:一篇文章让你秒懂所有!”

目录 1. ⼆进制介绍 2. 原码、反码、补码 3. 移位操作符 4. 位操作符&#xff1a;&、|、^ 5. 逗号表达式 6. 下标访问[]、函数调⽤() 7. 操作符的属性&#xff1a;优先级、结合性 8. 整型提升 9. 算术转换 10. 表达式求值 正文开始&#xff1a; 1. ⼆进制 其实我…

Leetcode 1035 不相交的线

题意理解&#xff1a; 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…

阿里云游戏服务器一年费用多少?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

【JavaEE进阶】 图书管理系统开发日记——陆

文章目录 &#x1f38b;前言&#x1f343;删除图书&#x1f6a9;约定前后端交互接口&#x1f6a9;完善前端代码&#x1f6a9;接口测试 &#x1f38d;批量删除&#x1f6a9;约定前后端交互接口&#x1f6a9;实现后端服务器代码&#x1f388;控制层&#x1f388;业务层&#x1f3…