揭秘刘谦春晚魔术,使用C#实现刘谦春晚魔术

2024年的春晚上,刘谦表演了一个魔术,是让所有人可以参与的一个魔术,那么他是怎么让所有人实现的呢? 这个扑克牌魔术究竟有怎样的奥秘?
咱们一起从数学的角度出发,带大家感受这一魔术的魅力

魔 术 步 骤

首先,准备4张扑克牌,跟随魔术步骤来一起“见证奇迹”
步骤1:将准备好的4张扑克牌,平均撕成两份并叠在一起
步骤2:将牌堆顶数量为【名字字数】的牌移至牌堆底
步骤3:将前三张牌放在牌堆中间并取出牌堆顶的牌放置在一旁
步骤4:取出牌堆顶的若干张牌,插入牌堆中间,此处选择的牌数为,南方人取1张,北方人取2张,若不确定是南方人还是北方人取3张
步骤5:男生扔掉牌堆顶1张,女生扔掉牌堆顶2张
步骤6:执行“见证奇迹的时刻”循环,每说一个字,就取出牌堆顶一张牌放置在牌堆底
步骤7:执行如下操作,从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌,检查此牌和放置在一旁的牌是否吻合,若吻合,则魔术成功

=======================================================================================

 

揭秘刘谦春晚魔术,发现了尼格买提翻车的那一步!

如果要评选 龙年春晚最好笑的节目 ,我投一票给刘谦的 搞笑小品 魔术!这个魔术最大的亮点不是魔术本身,而是 尼格买提现场表演时翻车了!
图片
这反应绝对不像演的,而是真的翻车了!果然差生往往坐在离讲台最近的位置 图片
刘谦这个魔术, 手法的要求几乎为0 ,背后其实是一个巧妙的数学规律。 也正因为它的操作异常简单,才让小尼的春晚翻车显得难 能可贵。
在仔细回看了5次之后,我终于发现了小尼失败的细节! 今天就给大家简单介绍一下这个魔术,以及小尼究竟是咋翻车的!
 
可以开着BGM阅读本文 图片


一、省流版魔术过程
1、准备4张扑克,任意洗乱。
难度:有扑克牌就行。
图片

2、把这4张牌对折,撕成两半,叠放在一起。
难度:很大,这一步劝退了大部分人!毕竟 明天还要和亲戚打扑克,怎么能撕掉呢 图片 此时4张牌变成8个半张牌:
图片
8张牌现在是这种形式:ABCD-ABCD。 我们要的就是这个重复的形式!

3、把牌背面朝 上。你的名字是几个字,就从顶上拿几张到最底下。
难度:你有个名字就行。这一步根本不重要!
比如我就拿3张到最底下。比如尼格买提·热合曼就拿7张到最底下。
图片
这个操作纯属营造神秘感。不管你拿了几张,8张牌依然保持着“ABCD-ABCD”的形式。
当然,像 我毕导的爷爷毕加索,全名 巴勃罗·迭戈·何塞·弗朗西斯科·狄·保拉·胡安·纳波穆西诺·玛莉亚·狄·洛斯·雷梅迪奥斯·西普里亚诺·狄·拉·圣地西玛·特里尼达·路易斯·毕加索 ,他确实在这一步就可以退出游戏了。

4、从牌堆最顶上拿3张牌,随意地插入中间。
难度:有手就行。
图片
只要你把顶上的3张牌插到牌堆中间,那头尾两张牌肯定是一样的。比如我们这里就是两个红桃3,这对后面的魔术环节就够了!

5、把最顶上的牌藏在屁股底下。
难度:有屁股就行。
图片
下面魔术的任务,就是一通操作后找到和屁股底下这张牌一样的牌,我们称为 “屁股牌” 吧。在我们的案例中是红桃3。

6、如果你是南方人,就从牌顶拿1张牌放到中间。如果你是北方人,放2张。如果你不知道是南方人还是北方人,就插3张。
难度:是中国人、有南北的概念就行 这一步根本不重要!
图片
你从顶上拿多少张牌插到中间,屁股牌都在最底下,是不会动的!

7、如果你是 男生,从最上面拿1张洒到空中。如果你是女生,从最上面拿2张洒到空中。
难度:有生理意义上的性别概念就行 (其实,即使你是第3性别扔3张牌,或者是无性别认知扔0张牌,魔术还是成立)
图片
这一步操作完,屁股 牌还是在最底下!

8、口中念“见证奇迹的时刻”7个字,每念一次,把一张牌从上面拿到底层。
难度:能数到7就行。
图片
这一步是魔术的关键! 如果你是女生,经过这一通操作,你的屁股牌位于第3张。如果你是男生,屁股牌位于第5张。这个位置很巧妙。

9、口中喊“好运留下来!”并把顶上的牌放到底层。再喊“烦恼丢出去!”把顶上的牌扔到空中。女生循环4次,男生循环5次。
难度:别搞着搞着突然忘了该放牌还是扔牌就行。
图片

10、这就变完了!此时拿起剩下的牌,发现它和屁股下的牌,刚好是同一张牌!
图片
 



二、小尼是咋翻车的?
我开始很纳闷,这个魔术本来就没几个步骤,更何况其中大部分操作都是不产生实际影响,只是单纯和观众互动营造气氛的。这也能出错???
回看的时候我发现了问题,小尼竟然错在了 “南方人放1张,北方人放2张” 这一步 图片
小尼是新疆人,属于北方,此时应该从牌顶上拿2张牌,插入牌堆中间。 这一步操作完,理论上屁股牌应该还在牌的最底下。
但小尼不知为啥,他没把2张牌插入牌堆中间,而是把其中一张放到了牌堆最底下。请看VCR:
图片
 
就是在这,他稀里胡涂就把牌放最底下了……
图片
总之,这个魔术一共就一个关键点: 插牌的时候都是从顶上拿牌、插到牌堆中间,保证屁股牌一直在最底下。
结果小尼一通操作猛如虎,把别的牌放到最底下去了,屁股牌变了那当然就失败了……
一共就这么一个能翻车的地方,竟然翻车了。
当然,也不止是小尼……左下角这个AJ姐也有点尴尬,不知导播是不是故意的。

图片

图片


 

三、魔术的原理
看完上面的过程,相信大家都能看明白这个魔术的原理,那就是没啥原理 图片
要说数学的话, 它属于“约瑟夫问题”的一个简单特例。 但即使我们不去管约瑟夫环这些复杂的概念,就拿几张扑克牌稍微摆一下,也能想明白为啥刚好能拼起来!
刘谦这个魔术的功力,不在于设计多么复杂,场面多么震撼, 而在于他把很简单的操作变得很有趣味性!
说出来大家可能不信,我还在B站上跟着学过刘谦魔术课,还在我们工作室表演过,唬得大家一愣一愣 图片 所以魔术未必对手法有要求,我这样的傻子都能学会 图片

图片

 
总之,刘谦这个魔术参与性强、包袱多、喜庆热闹,好运留下来,烦恼丢出去, 这不就是春晚的意义吗!
当然,尼格买提应该是把烦恼留下来,好运丢出去了 图片
欢迎大家在评论区说说你对本届春晚的感受!以及,有人能告诉我刘谦第一个38:67魔术是怎么变的吗……

 

 

出处:https://mp.weixin.qq.com/s?__biz=Mzg2MTg4MDcxMQ==&mid=2247542022&idx=1&sn=dfa79533ce79ec703f96378514871677

=======================================================================================

C#代码实现过程

下面是使用代码实现的过程:

    internal class Program
    {
        static List<string> list=new List<string>() { "A","B","C","D","A","B","C","D" };
        static string hiddenEle1 = string.Empty;//第一次藏起来的牌
        static void Main(string[] args)
        {
            Console.WriteLine($"初始牌组:{string.Join(',',list)}");
            //第一趴 名字有几个字
            Console.WriteLine("请输入你的名字有几个字");
            var nameCount = Convert.ToInt32(Console.ReadLine());
            Fun1(nameCount);
            Console.WriteLine($"变化之后:{string.Join(',', list)}");
            //第二趴 拿掉三张牌
            Fun2(3);
            Console.WriteLine($"插入三张牌后:{string.Join(',', list)}");
            //第三趴 把最上面一张牌藏起来
            Fun3();
            Console.WriteLine($"藏起来第一张牌后:{string.Join(',', list)}");
            //第四趴南方人北方人
            Console.WriteLine("北方-1 南方-2 不南不北-3,请输入对应数字");
            var directCount=Convert.ToInt32(Console.ReadLine());
            Fun2(directCount);
            Console.WriteLine($"南北方人后:{string.Join(',', list)}");
            //第五趴 男女生
            Console.WriteLine("男-1 女-2,请输入对应数字");
            var sexCount = Convert.ToInt32(Console.ReadLine());
            Fun4(sexCount);
            Console.WriteLine($"男女生后:{string.Join(',', list)}");
            //第六趴 见证奇迹的时刻
            Fun5();
            Console.WriteLine($"见证奇迹后:{string.Join(',', list)}");
            //第七趴 好运留下来烦恼丢出去
            Console.WriteLine("开始好运留下了 烦恼丢出去");
            var hiddenEle2 = Fun6(sexCount);

            Console.WriteLine($"牌1:{hiddenEle1} 牌2:{hiddenEle2}");
        }
        private static void Fun1(int nameCount)
        {
            if (nameCount >= list.Count)
            {
                // 如果 nameCount 大于或等于列表长度,则不需要进行操作
                return;
            }

            for (int i = 0; i < nameCount; i++)
            {
                string element = list[0];  // 获取第0个元素
                list.RemoveAt(0);          // 移除第0个元素
                list.Add(element);         // 将第0个元素添加到最后
            }
        }
        private static void Fun2(int forCount)
        {
            //被删除掉的三张牌
            var removeElement = new List<string>();
            for (int i = 0; i < forCount; i++)
            {
                removeElement.Add(list[0]);
                list.RemoveAt(0);
            }

            //把拿到的三张牌插到中间
            var random = new Random();
            int insertIndex = random.Next(1, list.Count - 1); // 生成一个介于第一个和倒数第二个位置之间的随机插入位置

            for (int i = removeElement.Count - 1; i >= 0; i--)
            {
                list.Insert(insertIndex, removeElement[i]);
            }
        }
        private static void Fun3()
        {
            //把第一张牌藏起来
            hiddenEle1 = list[0];
            list.RemoveAt(0);
        }

        private static void Fun4(int count)
        {
            for (int i = 0; i < count; i++)
            {
                list.RemoveAt(0);
            }
        }

        private static void Fun5()
        {
            for (int i = 0; i < 7; i++)
            {
                string element = list[0];
                list.RemoveAt(0);
                list.Add(element);
            }
        }

        private static string Fun6(int sexCount)
        {
            int forCount = 0;
            if (sexCount == 1) forCount = 5;//男生要5次
            else forCount = 4;
            for (int i = 0; i < forCount; i++)
            {
                // 把第一张牌放到数组最后面 (好运留下来)
                string element = list[0];
                list.RemoveAt(0);
                list.Add(element);

                //烦恼丢出去
                list.RemoveAt(0);
            }
            return list[0];
        }
    }

 

2024-02-19 16:58:08【出处】:https://www.cnblogs.com/cyfj/p/18017196

=======================================================================================

posted on 2024-02-19 17:00  jack_Meng  阅读(67)  评论(0编辑  收藏  举报

导航