python模拟春晚刘谦魔术

在今年的春晚上,刘谦表演了一个与"约瑟夫问题"相关的卡牌魔术。这两天忙来忙去,终于有空用代码来复现一下。

这是魔术的过程:

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

抽卡

我们先模拟抽卡的过程,这里需要先从排队中抽取4张牌,这里我使用了python的randint模块,他可以生成随机整数,这里需要注意的是randint的取值是前闭后闭。这里要分别取得牌的数字和花色,需要注意的是,为了能区分结果,在抽牌时我们用 if pork not in porks 判断已抽取的牌堆中没有重复的牌:

python 复制代码
from random import randint

porks = []
while len(porks) < 4:
    num = randint(0, 12)
    ranks = [
        "Ace",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "Jack",
        "Queen",
        "King",
    ]
    colornnum = randint(0,4)
    color = ["♥", "♠", "♦", "♣"]

    pork = ranks[num] + color[colornnum]
    if pork not in porks:
        porks.append(pork)

要模拟撕卡的过程很简单,在代码中重复抽取的卡片即可。

python 复制代码
porks = porks + porks

根据名字移动卡片

第二步,我们要将牌堆顶数量为【名字字数】的牌移至牌堆底。这里我对名字的长度进行模拟,randint(2, 8) 随机生成2-8个字长度的名字。如果需要的话,也可以改成认为输入名字并判断长度。nameporks表示抽出的卡片,porks[num:] + nameporks把抽出点卡片放到牌堆底部。

python 复制代码
num = randint(2, 8)
print(f"名字的字数是{num}")

nameporks = porks[:num]
print(f"名字抽出的卡片是{nameporks}")
porks = porks[num:] + nameporks
print(f"此时的卡片是{porks}")

移动三张卡片和抽取卡片

这一步需要我们抽出牌堆顶部的三张牌,牌堆顶部的三张卡片并插入到剩下的牌堆中,其中我用headporks 代表抽出点头三张牌,bottomporks是剩下的牌。

num = randint(1, 4) 是要插入纸牌的位置,需要注意点是,这里我插入纸牌的位置要排除掉首位和末尾。在完成卡片的插入后,我们取出牌堆顶的第一张卡片。

python 复制代码
headporks = porks[:3]
bottomporks = porks[3:]

num = randint(1, 4)
print(f"插入扑克的位置是{num}")

porks = bottomporks[:num] + headporks + bottomporks[num:]
print(f"插入扑克卡片顺序是{porks}")

# 藏起卡片
print(f"删除的卡片是{porks[0]}")
porks = porks[1:]

抽出若干牌插入剩下的的牌堆

这里我通过生成随机数来判断是北方人、南方人还是其他,还是像之前做过的一样,通过生成随机数来判断是什么人num = randint(0, 2)

python 复制代码
num = randint(0, 2)

if num == 0:
    selectcards = porks[:1]
    porks = porks[1:]
    numpork = randint(1, 5)
    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(num)
    print("南方人")
elif num == 1:
    selectcards = porks[:2]
    porks = porks[2:]
    numpork = randint(1, 4)
    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(num)
    print("北方人")
elif num == 2:
    selectcards = porks[:3]
    porks = porks[3:]
    numpork = randint(1, 3)
    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(numpork)
    print("外国人")
print(porks)

男生扔掉牌堆顶 1 张,女生扔掉牌堆顶 2 张。

这里根据男女,去掉顶部的牌,男生去掉一张,女生去掉三张。

python 复制代码
num = randint(0, 1)
if num == int(0):
    porks = porks[1:]
    print("性别为男")
elif num == int(1):
    porks = porks[2:]
    print("性别为女")
print(f"卡片上{porks}")

执行"见证奇迹的时刻"循环

这里循环七次即可,每次把顶部的第一张牌移动到底部。需要注意的是,在抽取牌的过程中,如果只抽出第一张牌,要人为增加一个列表[porks[0]]。

python 复制代码
for i in range(0, 7):

    headporks = [porks[0]]
    bottomporks = porks[1:]
    porks = bottomporks + headporks
    print(porks)

print(f"交换后的卡片是{porks}")

幸福留下来和烦恼丢出去

在这一步的过程中,如果牌堆中的牌数大于1,就进行循环,首先把顶部的牌放到底部,然后扔掉顶部的牌。

python 复制代码
while len(porks) > 1:
    headporks = [porks[0]]
    bottomporks = porks[1:]
    porks = bottomporks + headporks
    print(f"欢乐{porks}")

    # 烦恼
    porks = porks[1:]
    print(f"烦恼{porks}")

完整代码:

python 复制代码
from random import randint

# 步骤 1:将准备好的 4 张扑克牌平均撕成两份,并叠在一起。
porks = []
while len(porks) < 4:
    num = randint(0, 12)
    ranks = [
        "Ace",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "Jack",
        "Queen",
        "King",
    ]
    colornnum = randint(0, 3)
    color = ["♥", "♠", "♦", "♣"]

    pork = ranks[num] + color[colornnum]
    if pork not in porks:
        porks.append(pork)

print(porks)
porks = porks + porks


print(f"卡片顺序是{porks}")
# 步骤 2:将牌堆顶数量为【名字字数】的牌移至牌堆底。
num = randint(2, 8)
print(f"名字的字数是{num}")

nameporks = porks[:num]
print(f"名字抽出的卡片是{nameporks}")
porks = porks[num:] + nameporks
print(f"此时的卡片是{porks}")

# 步骤 3:将前三张牌放在牌堆中间并取出牌堆顶的牌,放置在一旁。
headporks = porks[:3]
bottomporks = porks[3:]

num = randint(1, 4)
print(f"插入扑克的位置是{num}")

porks = bottomporks[:num] + headporks + bottomporks[num:]
print(f"插入扑克卡片顺序是{porks}")

# 藏起卡片
print(f"删除的卡片是{porks[0]}")
porks = porks[1:]


print(porks)
# 南方人1,北方人2,其他3
num = randint(0, 2)

if num == 0:
    selectcards = porks[:1]
    porks = porks[1:]
    numpork = randint(1, 5)
    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(num)
    print("南方人")
elif num == 1:
    selectcards = porks[:2]
    porks = porks[2:]

    numpork = randint(1, 4)

    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(num)
    print("北方人")
elif num == 2:
    selectcards = porks[:3]
    porks = porks[3:]
    numpork = randint(1, 3)
    porks = porks[:numpork] + selectcards + porks[numpork:]
    print(numpork)
    print("外国人")
print(porks)
# 男生1,女生2
# 0 男生 1 女生

num = randint(0, 1)
if num == int(0):
    porks = porks[1:]
    print("性别为男")
elif num == int(1):
    porks = porks[2:]
    print("性别为女")
print(f"卡片上{porks}")

# 见证奇迹的时刻
for i in range(0, 7):

    headporks = [porks[0]]
    bottomporks = porks[1:]
    porks = bottomporks + headporks
    print(porks)

print(f"交换后的卡片是{porks}")


while len(porks) > 1:
    headporks = [porks[0]]
    bottomporks = porks[1:]
    porks = bottomporks + headporks
    print(f"欢乐{porks}")

    # 烦恼
    porks = porks[1:]
    print(f"烦恼{porks}")
print(porks)
相关推荐
电饭叔23 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
杰哥在此2 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
zaim14 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
PythonFun8 小时前
Python批量下载PPT模块并实现自动解压
开发语言·python·powerpoint
炼丹师小米9 小时前
Ubuntu24.04.1系统下VideoMamba环境配置
python·环境配置·videomamba
GFCGUO9 小时前
ubuntu18.04运行OpenPCDet出现的问题
linux·python·学习·ubuntu·conda·pip
985小水博一枚呀10 小时前
【深度学习基础模型】神经图灵机(Neural Turing Machines, NTM)详细理解并附实现代码。
人工智能·python·rnn·深度学习·lstm·ntm
萧鼎12 小时前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python
IFTICing12 小时前
【文献阅读】Attention Bottlenecks for Multimodal Fusion
人工智能·pytorch·python·神经网络·学习·模态融合