最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用代碼實(shí)現(xiàn)春晚?yè)淇伺颇g(shù)

 更新時(shí)間:2024年02月20日 15:54:04   作者:全棧小5  
這篇文章主要為大家詳細(xì)介紹了C#如何使用代碼實(shí)現(xiàn)龍年春晚?yè)淇伺颇g(shù)(守歲共此時(shí)),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

前言

2024年春晚上,表演了一個(gè)魔術(shù)《守歲共此時(shí)》,博主也跟著做了一遍,確實(shí)都成功了。

對(duì)于此魔術(shù)的好奇心,博主從代碼邏輯的角度思考了下,肯定是可以實(shí)現(xiàn)的,畢竟代碼只是一個(gè)工具,只要實(shí)際邏輯合理基本沒(méi)問(wèn)題。

本篇文章將通過(guò)代碼步驟進(jìn)行描述和實(shí)現(xiàn)。

實(shí)際上,了解原理后,使用遞歸方法和循環(huán)隊(duì)列去實(shí)現(xiàn)是比較合理的。

實(shí)現(xiàn)步驟

為了方便查看,每一個(gè)步驟都把變化前的撲克牌保存到一個(gè)泛型變量里

設(shè)置變量

姓名、來(lái)自區(qū)域、以及性別,這三者為變量,決定每個(gè)人手上牌的順序會(huì)不一樣。

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

設(shè)置牌

設(shè)置好52張撲克牌

List<string> tempList = new List<string>();

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<string> pokerList = pokerStr.Split('、').Select(a=>a.Replace("\r\n","").Trim()).ToList();

隨機(jī)牌

通過(guò)上一步驟設(shè)置的52張牌,隨機(jī)產(chǎn)生4張牌

// 隨機(jī)四張
List<string> myPokerList = new List<string>();
for(int i = 0; i < 4; i++)
{
    int randomIndex = new Random().Next(0, pokerList.Count);
    string pokder = pokerList[randomIndex];
    myPokerList.Add(pokder);
    pokerList.RemoveAt(randomIndex);
}

撕開(kāi)兩半

撕開(kāi)兩半,并且右邊的一半放到底部,對(duì)于數(shù)組而言實(shí)際上就是放到首位

// 撕開(kāi)2半
List<string> newList = new List<string>();
tempList = NewOrder(myPokerList);

// 右半邊
for (int i = 0; i < tempList.Count; i++)
{
    newList.Add($"{tempList[i]}-右");
}

// 左半邊
for (int i = 0; i < tempList.Count; i++)
{
    newList.Add($"{tempList[i]}-左");
}

姓名牌

每個(gè)人姓名長(zhǎng)度不一樣,順序也就不一樣,下面代碼實(shí)現(xiàn)比較邏輯,其實(shí)目標(biāo)就是把最上面的一張牌放到底部,多少個(gè)字就放幾次。
博主姓名是三個(gè)字,就依次放三張牌到底部。代碼實(shí)現(xiàn)邏輯就是數(shù)組最后一個(gè)值放到首位。

// 姓名數(shù)字 - 動(dòng)態(tài)值
int myNameLength = myName.Length;
string nameString = string.Empty;
List<string> nameList = new List<string>();
List<string> nameListMy = new List<string>();
for (int i = 0; i < myNameLength; i++)
{
    string pv = newList[newList.Count - 1 - i];
    nameListMy.Add(pv);
    nameString = $"{pv},{nameString}";
}
for (int i = 0; i < newList.Count - myNameLength; i++)
{
    nameString += $",{newList[i]}";
}
nameList = nameString.Split(',').Where(a => !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<string> top3List = new List<string>();
for (int i = 0; i < nameList.Count - topValue; i++)
{
    if (i == randomValue)
    {
        for (int j = topValue; j > 0; j--)
        {
            top3List.Add(nameList[nameList.Count - j]);
        }
    }

    top3List.Add(nameList[i]);
}

標(biāo)記牌

拿起最上面一張牌,就是黑桃3-右,放到一遍,在數(shù)組里就是移除此張牌,并保存到一個(gè)變量里

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

區(qū)域牌

南方人:拿起一張牌、北方人:拿起兩張牌、不知道是南方還是北方人:拿起三張牌

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

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

    fromList.Add(sevenList[i]);
}

性別牌

男生:拿起一張、女生:拿起兩張、拿起的牌,撒到空中去,就是從數(shù)組中移除

// 【再次移除牌】

int sexType = (sex == "男生" ? 1 : 2);
List<string> sexList = new List<string>();
for (int i = 0; i < fromList.Count - sexType; i++)
{
    sexList.Add(fromList[i]);
}

循環(huán)牌

見(jiàn)證奇跡的時(shí)刻,這是七個(gè)字,就是循環(huán)遍歷7次,對(duì)于數(shù)組而言,就是循環(huán)從最后一個(gè)值移動(dòng)到第一個(gè)值。

string textValue = "見(jiàn)證奇跡的時(shí)刻";
List<string> forList = new List<string>();
for (int i = 0; i < sexList.Count; i++)
{
    forList.Add(sexList[i]);
}

for (int i = 0; i < textValue.Length; i++)
{
    string lastElement = forList[forList.Count - 1]; // 保存最后一個(gè)元素的值
    forList.RemoveAt(forList.Count - 1); // 移除最后一個(gè)元素
    forList.Insert(0, lastElement); // 將最后一個(gè)元素插入到第一個(gè)位置
}

好運(yùn)牌

最后一個(gè)環(huán)節(jié):好運(yùn)留下來(lái),煩惱丟出去

第一張放到下面,然后最上面的丟出去,就是移除數(shù)組最后一個(gè)

List<string> lastList = new List<string>();
for (int i = 0; i < forList.Count; i++)
{
    lastList.Add(forList[i]);
}
while (lastList.Count > 1)
{
    string lastElement = lastList[lastList.Count - 1]; // 保存最后一個(gè)元素的值
    lastList.RemoveAt(lastList.Count - 1); // 移除最后一個(gè)元素
    lastList.Insert(0, lastElement); // 將最后一個(gè)元素插入到第一個(gè)位置

    lastList.RemoveAt(lastList.Count - 1);
}
string lastPoker = lastList[0];

// 合并撲克牌
string allPoker = $"【{lastPoker}】【{topPoker}】";

約瑟夫原理

上面撲克牌魔術(shù)沒(méi)想到用到了這個(gè)原理,不是每個(gè)人都能快速理解各種各樣的原理,所以這也早就了魔術(shù)神奇而又神秘的一面。

約瑟夫原理(也稱為約瑟夫問(wèn)題或約瑟夫環(huán))是一個(gè)著名的理論問(wèn)題,其起源可以追溯到公元1世紀(jì)的一個(gè)歷史事件。據(jù)傳,著名猶太歷史學(xué)家Josephus和他的同伴被敵人包圍,在面臨絕境時(shí),他們決定通過(guò)自殺的方式結(jié)束生命。為了執(zhí)行這個(gè)決定,他們圍成一個(gè)圈,然后按照一定的規(guī)則來(lái)選擇自殺的人,直到只剩下最后一個(gè)人。Josephus作為一個(gè)不愿意自殺的人,快速地計(jì)算出了一個(gè)位置,使得他成為了最后一個(gè)存活的人,從而有機(jī)會(huì)逃脫。

這個(gè)問(wèn)題可以用數(shù)學(xué)模型進(jìn)行抽象和解釋。假設(shè)有n個(gè)人圍成一圈,從某個(gè)人開(kāi)始,按順時(shí)針?lè)较蛑鹨痪幪?hào)。接著從編號(hào)為1的人開(kāi)始報(bào)數(shù),每數(shù)到m就將該人從圈中排除,然后從下一個(gè)人重新開(kāi)始報(bào)數(shù),直到圈中只剩下一個(gè)人。最后剩下的這個(gè)人的位置就是從1開(kāi)始數(shù)的序號(hào)。這個(gè)問(wèn)題可以用數(shù)學(xué)公式或偽代碼進(jìn)行求解。

約瑟夫原理在理論計(jì)算機(jī)科學(xué)、組合數(shù)學(xué)、離散數(shù)學(xué)等領(lǐng)域有著廣泛的應(yīng)用。它不僅是一個(gè)有趣的問(wèn)題,還可以用于解決各種實(shí)際問(wèn)題,如任務(wù)調(diào)度、資源管理、網(wǎng)絡(luò)通信等。通過(guò)研究和應(yīng)用約瑟夫原理,可以更好地理解和解決一些復(fù)雜的計(jì)算和決策問(wèn)題。

完整代碼

博主使用C#語(yǔ)言比較多,因此下面是以C#代碼進(jìn)行實(shí)現(xiàn),感興趣的小伙伴可以使用其他語(yǔ)言實(shí)現(xiàn)

主要代碼

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

List<string> tempList = new List<string>();

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<string> pokerList = pokerStr.Split('、').Select(a=>a.Replace("\r\n","").Trim()).ToList();

// 隨機(jī)四張
List<string> myPokerList = new List<string>();
for(int i = 0; i < 4; i++)
{
    int randomIndex = new Random().Next(0, pokerList.Count);
    string pokder = pokerList[randomIndex];
    myPokerList.Add(pokder);
    pokerList.RemoveAt(randomIndex);
}


// 撕開(kāi)2半
List<string> newList = new List<string>();
tempList = NewOrder(myPokerList);

// 右半邊
for (int i = 0; i < tempList.Count; i++)
{
    newList.Add($"{tempList[i]}-右");
}

// 左半邊
for (int i = 0; i < tempList.Count; i++)
{
    newList.Add($"{tempList[i]}-左");
}

// 姓名數(shù)字 - 動(dòng)態(tài)值
int myNameLength = myName.Length;
string nameString = string.Empty;
List<string> nameList = new List<string>();
List<string> nameListMy = new List<string>();
for (int i = 0; i < myNameLength; i++)
{
    string pv = newList[newList.Count - 1 - i];
    nameListMy.Add(pv);
    nameString = $"{pv},{nameString}";
}
for (int i = 0; i < newList.Count - myNameLength; i++)
{
    nameString += $",{newList[i]}";
}
nameList = nameString.Split(',').Where(a => !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<string> top3List = new List<string>();
for (int i = 0; i < nameList.Count - topValue; i++)
{
    if (i == randomValue)
    {
        for (int j = topValue; j > 0; j--)
        {
            top3List.Add(nameList[nameList.Count - j]);
        }
    }

    top3List.Add(nameList[i]);
}

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

// 南方人:拿起一張牌、北方人:拿起兩張牌、不知道是南方還是北方人:拿起三張牌
// 插入到剩下牌的中間,1到5或者1到6之間插入
int fromValue = (positionValue == "南方人" ? 1 : positionValue == "北方人" ? 2 : 3);
int randomValue2 = new Random().Next(1, sevenList.Count - fromValue - 1);
List<string> fromList = new List<string>();
for (int i = 0; i < sevenList.Count - fromValue; i++)
{
    if (i == randomValue2)
    {
        for (int j = fromValue; j > 0; j--)
        {
            fromList.Add(sevenList[sevenList.Count - j]);
        }
    }

    fromList.Add(sevenList[i]);
}

// 【再次移除牌】
// 男生:拿起一張、女生:拿起兩張、拿起的牌,撒到空中去,就是從數(shù)組中移除
int sexType = (sex == "男生" ? 1 : 2);
List<string> sexList = new List<string>();
for (int i = 0; i < fromList.Count - sexType; i++)
{
    sexList.Add(fromList[i]);
}

// 見(jiàn)證奇跡的時(shí)刻
string textValue = "見(jiàn)證奇跡的時(shí)刻";
List<string> forList = new List<string>();
for (int i = 0; i < sexList.Count; i++)
{
    forList.Add(sexList[i]);
}

for (int i = 0; i < textValue.Length; i++)
{
    string lastElement = forList[forList.Count - 1]; // 保存最后一個(gè)元素的值
    forList.RemoveAt(forList.Count - 1); // 移除最后一個(gè)元素
    forList.Insert(0, lastElement); // 將最后一個(gè)元素插入到第一個(gè)位置
}

// 最后一個(gè)環(huán)節(jié):好運(yùn)留下來(lái),煩惱丟出去
// 第一張放到下面,然后最上面的丟出去,就是移除數(shù)組最后一個(gè)
List<string> lastList = new List<string>();
for (int i = 0; i < forList.Count; i++)
{
    lastList.Add(forList[i]);
}
while (lastList.Count > 1)
{
    string lastElement = lastList[lastList.Count - 1]; // 保存最后一個(gè)元素的值
    lastList.RemoveAt(lastList.Count - 1); // 移除最后一個(gè)元素
    lastList.Insert(0, lastElement); // 將最后一個(gè)元素插入到第一個(gè)位置

    lastList.RemoveAt(lastList.Count - 1);
}
string lastPoker = lastList[0];

// 合并撲克牌
string allPoker = $"【{lastPoker}】【{topPoker}】";

打亂順序

private List<string> NewOrder(List<string> 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;
}

到此這篇關(guān)于C#使用代碼實(shí)現(xiàn)春晚?yè)淇伺颇g(shù)的文章就介紹到這了,更多相關(guān)C#撲克牌魔術(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#生成Word文檔代碼示例

    C#生成Word文檔代碼示例

    這篇文章主要介紹了C#生成Word文檔代碼示例,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • C#中Type類的具體使用

    C#中Type類的具體使用

    C#中的Type類是System命名空間的核心組件,可通過(guò)typeof、GetType或Type.GetType獲取,支持檢查類型結(jié)構(gòu)、動(dòng)態(tài)創(chuàng)建對(duì)象及調(diào)用成員,下面就來(lái)具體介紹一下
    2025-07-07
  • C#高保真實(shí)現(xiàn)Word轉(zhuǎn)HTML實(shí)戰(zhàn)指南

    C#高保真實(shí)現(xiàn)Word轉(zhuǎn)HTML實(shí)戰(zhàn)指南

    在數(shù)字化辦公中,文檔內(nèi)容的高效流轉(zhuǎn)與展示是企業(yè)應(yīng)用和Web服務(wù)不可或缺的一環(huán),本文將探討如何利用 C# 語(yǔ)言,并借助專業(yè)的文檔處理庫(kù),實(shí)現(xiàn)高保真的 Word轉(zhuǎn)HTML 轉(zhuǎn)換,需要的可以了解下
    2025-08-08
  • C#中Socket通信用法實(shí)例詳解

    C#中Socket通信用法實(shí)例詳解

    這篇文章主要介紹了C#中Socket通信用法,以實(shí)例形式較為詳細(xì)的分析了UDP及TCP兩種通信方式的具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#判斷頁(yè)面中的多個(gè)文本框輸入值是否有重復(fù)的實(shí)現(xiàn)方法

    C#判斷頁(yè)面中的多個(gè)文本框輸入值是否有重復(fù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#判斷頁(yè)面中的多個(gè)文本框輸入值是否有重復(fù)的實(shí)現(xiàn)方法,是一個(gè)非常簡(jiǎn)單實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • C#中判斷、驗(yàn)證字符串是否為日期格式的實(shí)現(xiàn)代碼

    C#中判斷、驗(yàn)證字符串是否為日期格式的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C#中判斷、驗(yàn)證字符串是否為日期格式的實(shí)現(xiàn)代碼,使用DateTime類中自帶的兩個(gè)方法實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • Unity調(diào)用打印機(jī)打印圖片

    Unity調(diào)用打印機(jī)打印圖片

    這篇文章主要為大家詳細(xì)介紹了Unity通過(guò)調(diào)用打印機(jī)打印圖片的代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法

    C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)窗體抖動(dòng)的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C#程序最小化到托盤(pán)圖標(biāo)操作步驟與實(shí)現(xiàn)代碼

    C#程序最小化到托盤(pán)圖標(biāo)操作步驟與實(shí)現(xiàn)代碼

    設(shè)置窗體屬性showinTask=false;加notifyicon控件notifyIcon1,為控件notifyIcon1的屬性Icon添加一個(gè)icon圖標(biāo);添加窗體最小化事件(首先需要添加事件引用)接下來(lái)介紹實(shí)現(xiàn)代碼,感興趣的朋友可以研究下
    2012-12-12
  • C#中 paint()與Onpaint()的區(qū)別

    C#中 paint()與Onpaint()的區(qū)別

    paint是事件onpaint方法onpaint方法是調(diào)用paint事件的,用哪一個(gè),效果是一樣,就看那一個(gè)方便了內(nèi)部是這樣實(shí)現(xiàn)的:
    2013-04-04

最新評(píng)論

徐州市| 花莲市| 临湘市| 贡嘎县| 静海县| 建昌县| 六盘水市| 和静县| 新兴县| 永宁县| 无为县| 富锦市| 三江| 沙雅县| 汉阴县| 靖江市| 新竹市| 独山县| 农安县| 资中县| 永德县| 广灵县| 松江区| 中山市| 陈巴尔虎旗| 永修县| 绥化市| 万山特区| 綦江县| 广东省| 阳谷县| 曲麻莱县| 故城县| 荣昌县| 涞水县| 杭锦后旗| 永川市| 河曲县| 长葛市| 昌都县| 闻喜县|