【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

2024-02-26 1041阅读

温馨提示:这篇文章已超过403天没有更新,请注意相关的内容是否还可用!

欢迎来到《小5讲堂》

大家好,我是全栈小5。

这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解,

特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。

温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

目录

  • 前言
  • 实现步骤
    • 设置牌
    • 随机牌
    • 撕开两半
    • 姓名牌
    • 任意牌
    • 标记牌
    • 区域牌
    • 性别牌
    • 循环牌
    • 好运牌
    • 约瑟夫原理
    • 完整代码
      • 主要代码
      • 打乱顺序
      • 相关文章

        前言

        2024年春晚上,表演了一个魔术《守岁共此时》,博主也跟着做了一遍,确实都成功了。

        对于此魔术的好奇心,博主从代码逻辑的角度思考了下,肯定是可以实现的,毕竟代码只是一个工具,只要实际逻辑合理基本没问题。

        上一篇已经对魔术步骤进行了描述,本篇文章将通过代码步骤进行描述和实现。

        实际上,了解原理后,使用递归方法和循环队列去实现是比较合理的。

        实现步骤

        为了方便查看,每一个步骤都把变化前的扑克牌保存到一个泛型变量里

        ##设置变量

        姓名、来自区域、以及性别,这三者为变量,决定每个人手上牌的顺序会不一样。

        string myName = "小美";
        string positionValue = "北方人";
        string sex = "女生";
        

        设置牌

        设置好52张扑克牌

        List tempList = new List();
        string pokerStr = @"黑桃-A、黑桃-2、黑桃-3、黑桃-4、黑桃-5、黑桃-6、黑桃-7、黑桃-8、黑桃-9、黑桃-10、黑桃-J、黑桃-Q、黑桃-K、
        红桃-A、红桃-2、红桃-3、红桃-4、红桃-5、红桃-6、红桃-7、红桃-8、红桃-9、红桃-10、红桃-J、红桃-Q、红桃-K、
        梅花-A、梅花-2、梅花-3、梅花-4、梅花-5、梅花-6、梅花-7、梅花-8、梅花-9、梅花-10、梅花-J、梅花-Q、梅花-K、
        方块-A、方块-2、方块-3、方块-4、方块-5、方块-6、方块-7、方块-8、方块-9、方块-10、方块-J、方块-Q、方块-K";
        List pokerList = pokerStr.Split('、').Select(a=>a.Replace("\r\n","").Trim()).ToList();
        

        随机牌

        通过上一步骤设置的52张牌,随机产生4张牌

        // 随机四张
        List myPokerList = new List();
        for(int i = 0; i  
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        撕开两半

        撕开两半,并且右边的一半放到底部,对于数组而言实际上就是放到首位

        // 撕开2半
        List newList = new List();
        tempList = NewOrder(myPokerList);
        // 右半边
        for (int i = 0; i  
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        姓名牌

        每个人姓名长度不一样,顺序也就不一样,下面代码实现比较逻辑,其实目标就是把最上面的一张牌放到底部,多少个字就放几次。

        博主姓名是三个字,就依次放三张牌到底部。代码实现逻辑就是数组最后一个值放到首位。

        // 姓名数字 - 动态值
        int myNameLength = myName.Length;
        string nameString = string.Empty;
        List nameList = new List();
        List nameListMy = new List();
        for (int i = 0; i  !string.IsNullOrWhiteSpace(a)).ToList();
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        任意牌

        拿起最上面3张牌,插入到任意牌的中间,1、2、3、4、5,1到5之间插入

        // 
        int topValue = 3;
        int randomValue = new Random().Next(1, nameList.Count - topValue - 1);
        List top3List = new List();
        for (int i = 0; i  0; j--)
                {
                    top3List.Add(nameList[nameList.Count - j]);
                }
            }
            top3List.Add(nameList[i]);
        }
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        标记牌

        拿起最上面一张牌,就是黑桃3-右,放到一遍,在数组里就是移除此张牌,并保存到一个变量里

        // 【第一次移除牌】
        // 拿起最上面一张牌,就是黑桃3-右,放到一遍
        string topPoker = top3List[top3List.Count - 1];
        List sevenList = new List();
        for (int i = 0; i  
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        区域牌

        南方人:拿起一张牌、北方人:拿起两张牌、不知道是南方还是北方人:拿起三张牌

        插入到剩下牌的中间,1到5或者1到6之间插入

        // 
        int fromValue = (positionValue == "南方人" ? 1 : positionValue == "北方人" ? 2 : 3);
        int randomValue2 = new Random().Next(1, sevenList.Count - fromValue - 1);
        List fromList = new List();
        for (int i = 0; i  0; j--)
                {
                    fromList.Add(sevenList[sevenList.Count - j]);
                }
            }
            fromList.Add(sevenList[i]);
        }
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        性别牌

        男生:拿起一张、女生:拿起两张、拿起的牌,撒到空中去,就是从数组中移除

        // 【再次移除牌】
        int sexType = (sex == "男生" ? 1 : 2);
        List sexList = new List();
        for (int i = 0; i  
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        循环牌

        见证奇迹的时刻,这是七个字,就是循环遍历7次,对于数组而言,就是循环从最后一个值移动到第一个值。

        string textValue = "见证奇迹的时刻";
        List forList = new List();
        for (int i = 0; i  
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        好运牌

        最后一个环节:好运留下来,烦恼丢出去

        第一张放到下面,然后最上面的丢出去,就是移除数组最后一个

        // 
        List lastList = new List();
        for (int i = 0; i  1)
        {
            string lastElement = lastList[lastList.Count - 1]; // 保存最后一个元素的值
            lastList.RemoveAt(lastList.Count - 1); // 移除最后一个元素
            lastList.Insert(0, lastElement); // 将最后一个元素插入到第一个位置
            lastList.RemoveAt(lastList.Count - 1);
        }
        string lastPoker = lastList[0];
        // 合并扑克牌
        string allPoker = $"【{lastPoker}】【{topPoker}】";
        

        【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        约瑟夫原理

        上面扑克牌魔术没想到用到了这个原理,不是每个人都能快速理解各种各样的原理,所以这也早就了魔术神奇而又神秘的一面。

        约瑟夫原理(也称为约瑟夫问题或约瑟夫环)是一个著名的理论问题,其起源可以追溯到公元1世纪的一个历史事件。据传,著名犹太历史学家Josephus和他的同伴被敌人包围,在面临绝境时,他们决定通过自杀的方式结束生命。为了执行这个决定,他们围成一个圈,然后按照一定的规则来选择自杀的人,直到只剩下最后一个人。Josephus作为一个不愿意自杀的人,快速地计算出了一个位置,使得他成为了最后一个存活的人,从而有机会逃脱。

        这个问题可以用数学模型进行抽象和解释。假设有n个人围成一圈,从某个人开始,按顺时针方向逐一编号。接着从编号为1的人开始报数,每数到m就将该人从圈中排除,然后从下一个人重新开始报数,直到圈中只剩下一个人。最后剩下的这个人的位置就是从1开始数的序号。这个问题可以用数学公式或伪代码进行求解。

        约瑟夫原理在理论计算机科学、组合数学、离散数学等领域有着广泛的应用。它不仅是一个有趣的问题,还可以用于解决各种实际问题,如任务调度、资源管理、网络通信等。通过研究和应用约瑟夫原理,可以更好地理解和解决一些复杂的计算和决策问题。

        完整代码

        博主使用C#语言比较多,因此下面是以C#代码进行实现,感兴趣的小伙伴可以使用其他语言实现

        主要代码

        string myName = "小美";
        string positionValue = "北方人";
        string sex = "女生";
        List tempList = new List();
        string pokerStr = @"黑桃-A、黑桃-2、黑桃-3、黑桃-4、黑桃-5、黑桃-6、黑桃-7、黑桃-8、黑桃-9、黑桃-10、黑桃-J、黑桃-Q、黑桃-K、
        红桃-A、红桃-2、红桃-3、红桃-4、红桃-5、红桃-6、红桃-7、红桃-8、红桃-9、红桃-10、红桃-J、红桃-Q、红桃-K、
        梅花-A、梅花-2、梅花-3、梅花-4、梅花-5、梅花-6、梅花-7、梅花-8、梅花-9、梅花-10、梅花-J、梅花-Q、梅花-K、
        方块-A、方块-2、方块-3、方块-4、方块-5、方块-6、方块-7、方块-8、方块-9、方块-10、方块-J、方块-Q、方块-K";
        List pokerList = pokerStr.Split('、').Select(a=>a.Replace("\r\n","").Trim()).ToList();
        // 随机四张
        List myPokerList = new List();
        for(int i = 0; i  !string.IsNullOrWhiteSpace(a)).ToList();
        // 拿起最上面3张牌,插入到任意牌的中间,1、2、3、4、5,1到5之间插入
        int topValue = 3;
        int randomValue = new Random().Next(1, nameList.Count - topValue - 1);
        List top3List = new List();
        for (int i = 0; i  0; j--)
                {
                    top3List.Add(nameList[nameList.Count - j]);
                }
            }
            top3List.Add(nameList[i]);
        }
        // 【第一次移除牌】
        // 拿起最上面一张牌,就是黑桃3-右,放到一遍
        string topPoker = top3List[top3List.Count - 1];
        List sevenList = new List();
        for (int i = 0; i  0; j--)
                {
                    fromList.Add(sevenList[sevenList.Count - j]);
                }
            }
            fromList.Add(sevenList[i]);
        }
        // 【再次移除牌】
        // 男生:拿起一张、女生:拿起两张、拿起的牌,撒到空中去,就是从数组中移除
        int sexType = (sex == "男生" ? 1 : 2);
        List sexList = new List();
        for (int i = 0; i  1)
        {
            string lastElement = lastList[lastList.Count - 1]; // 保存最后一个元素的值
            lastList.RemoveAt(lastList.Count - 1); // 移除最后一个元素
            lastList.Insert(0, lastElement); // 将最后一个元素插入到第一个位置
            lastList.RemoveAt(lastList.Count - 1);
        }
        string lastPoker = lastList[0];
        // 合并扑克牌
        string allPoker = $"【{lastPoker}】【{topPoker}】";
        

        打乱顺序

        private List NewOrder(List list)
        {
            Random random = new Random();
            for (int i = list.Count - 1; i > 0; i--)
            {
                int j = random.Next(i + 1);
                string temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
            return list;
        }
        

        相关文章

        【C#】使用代码实现刘谦龙年春晚扑克牌魔术(守岁共此时),代码实现篇

        【C#】使用代码实现刘谦龙年春晚扑克牌魔术(守岁共此时),流程描述篇

        【C#】约瑟夫原理举例2个代码实现

        【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推

        温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]