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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cordic算法圆周系统计算sin、cos、平方和开根、atan、坐标系变换

cordic算法圆周系统计算sin、cos、平方和开根、atan 一、cordic圆周系统旋转模式和向量模式1.1 旋转模式1.2 向量模式 二、一些需要考虑的事项2.1角度范围2.2输入正负2.3关于迭代精度2.4坐标系旋转 参考文献&#xff1a; 若想计算 s i n sin sin、 c o s cos cos、 x 2 y 2 \s…

python3 中try 异常调试 raise 异常抛出

一、什么是异常&#xff1f; 异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响了程序的正常执行。 一般情况下&#xff0c;在Python无法正常处理程序时就会发生一个异常。 异常是Python对象&#xff0c;表示一个错误。 当Python脚本发生异常时我…

Django学习全纪录:编写你的第一个 Django 应用,Django内置数据库的配置,以及扩展性的数据库介绍和配置

天下古今之庸人&#xff0c;皆以一惰字致败&#xff1b;天下古今之人才&#xff0c;皆以一傲字致败。——[清]曾国藩 导言 大家好&#xff0c;在上一篇文章里&#xff0c;我们一起学习了Django的视图以及路由&#xff0c;并且对Django的应用有了初步的认识&#xff0c;掌握了…

Java实现CRM客户管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 用例设计3.2 E-R 图设计3.3 数据库设计3.3.1 客户表3.3.2 商品表3.3.3 客户跟踪表3.3.4 客户消费表3.3.5 系统角色表 四、系统展示五、核心代码5.1 查询客户5.2 新增客户跟踪记录5.3 新增客户消费订单5.4 查…

本地搭建three.js官方文档

因为three.js官网文档是国外的网站&#xff0c;所以你没有魔法的情况下打开会很慢&#xff0c;这时我们需要在本地搭建一个官方文档便于我们学习查看。 第一步&#xff1a;首先我们先访问GitHub地址 GitHub - mrdoob/three.js: JavaScript 3D Library. 下载不下来的小伙伴们私…

30、二维数组/字符串操作相关练习20240214

一、编程实现二维数组的杨辉三角。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(in…

本地部署Stable Diffusion WebUI

官网 Stable Diffusion在线 Github上的Stable Diffusion WebUI 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、 环境所需资源 PythonPycharmAnacondastable-diffusion-webui项目代码 注意事项 python版本一定要3.10&#xff0c;最好是3.10.6版本的。…

vue3 之 商城项目—购物车

购物车业务逻辑梳理拆解 1️⃣整个购物车的实现分为两个大分支&#xff0c;本地购物车操作和接口购物车操作 2️⃣由于购物车数据的特殊性&#xff0c;采取Pinia管理购物车列表数据并添加持久话缓存 本地购物车—加入购物车实现 stores/cartStore.js // 封装购物车模块 imp…

片上网络NoC(6)——路由算法

目录 一、概述 二、路由算法的类型 三、避免死锁 四、实现 4.1 源路由实现 4.2 基于节点查找表的路由实现 4.3 组合电路实现 五、总结 一、概述 路由算法&#xff08;routing algorithm&#xff09;&#xff0c;即决定数据包在网络拓扑中从起点到终点路径的算法。路由算…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码&#xff0c;robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

Ubuntu Linux使用PL2302串口和minicom进行开发板调试

调试远程的服务器上面的BMC&#xff0c;服务器上面安装了Ubuntu&#xff0c;想着可以在服务器接个串口到BMC&#xff0c;然后SSH到服务器的Ubuntu&#xff0c;用minicom来查看串口信息。 准备&#xff1a; 服务器Ubuntu安装mimicom 本机可以ssh到Ubuntu 串口工具PL2302 或者CH3…

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解

目录 前言 父组件传子组件 ---- props 给要传递数据的子组件绑定要传过去的属性及属性值 在子组件中使用props配置项接收 props配置项 子组件传父组件 ---- 组件的自定义事件 子组件向父组件传递数据 通过代码来绑定自定义事件 前言 本文将介绍在Vue中父子组件如何进行…

算法学习——LeetCode力扣回溯篇4

算法学习——LeetCode力扣回溯篇4 332. 重新安排行程 332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

一周学会Django5 Python Web开发-Django5 Hello World编写

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

【Godot4自学手册】第十三节初建创建敌人

从本节起&#xff0c;将要学习创建第一人。 一、创建敌人动画 1.导入素材。 在Sprites文件夹下新建Enemy文件夹&#xff0c;并将需要的敌人素材导入到文件夹。文档结构如下&#xff1a; 2.创建Enemy场景。 新建场景&#xff0c;根节点设置为CharacterBody2D&#xff0c;命…

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…