2024刘谦春晚魔术的Python代码实现

import random

#将牌撕开再叠加
def doubleArr(arr):
    for i in range(0,len(arr),1):
        arr.append(arr[i])

#洗牌
def shuffle(arr,x):
    arrLen = len(arr)
    for i in range(0,x,1):
        StartToEnd = arr[0] 
        for j in range(1,arrLen,1):
            arr[j-1] = arr[j]
        arr[arrLen-1] = StartToEnd

#将开头连续的n∈(1, 原序列长度/2-1)张牌随便插入序列的中间
def insertMid(arr,rocation,inserArrCount):
    arrLen = len(arr)
    SwapStartIndex = inserArrCount
    SwapStopIndex = 0
    for i in range(0,rocation,1):
        for j in range(SwapStartIndex,SwapStopIndex,-1):
            arr[j-1],arr[j] = arr[j],arr[j-1]
        SwapStartIndex += 1
        SwapStopIndex += 1

#魔术的丢牌步骤,直至剩下一张牌
def losePoker(arr):
    loseRocation = random.randint(1,2)
    print(f"随机生成满足z∈[1,2]的z值:\nz = {loseRocation}")
    print(f"丢弃第一张牌,重复 z={loseRocation} 次...")
    for i in range(0,loseRocation,1):
        arr.pop(0)
        print(arr)
    print("将第一张牌放到最后,重复 7 次...")
    for i in range(0,7,1):
        temp = arr.pop(0)
        arr.insert(len(arr),temp)
        print(arr)
    print(f"将第一张牌放到最后,再将新序列的第一张牌扔掉,重复 6-z={6-loseRocation} 次...")
    for i in range(0,6-loseRocation,1):
        temp = arr.pop(0)
        arr.insert(len(arr),temp)
        arr.pop(0)
        print(arr)

def _2024Spring(arr):
    print("初始序列:")
    print(arr) 
    print("将牌撕开再叠加:")
    doubleArr(arr)
    print(arr) 
    x = random.randint(0,10)
    print(f"重复洗牌(将第一张牌放到最后) x={x} 次后:")
    shuffle(arr,x)
    print(arr)
    arrLen = len(arr)
    rocationMax = arrLen-4
    rocation = random.randint(1,rocationMax)
    print(f"将开头连续 y=3 张牌插入中间第 n ∈[1,arrLen-y-1={rocationMax}] 个位置(arrLen = {len(arr)}):\n生成n = {rocation}")
    insertMid(arr,rocation,3)
    print(arr) 
    arsePoker = arr.pop(0)
    print(f"把第一张牌藏起来,这张牌为:\n['{arsePoker}']")
    print("此时剩下的牌为:")
    print(arr)
    inserArrCount = random.randint(1,int(arrLen/2-1))
    rocationMax = arrLen-inserArrCount-2
    rocation = random.randint(1,rocationMax)
    print(f"y∈[1,{int(arrLen/2-1)}],取随机y张牌插入序列中间...生成随机数:\ny = {inserArrCount}")
    print(f"将开头连续 y={inserArrCount} 张牌插入中间第 n ∈[1,arrLen-y-1={rocationMax}] 个位置(arrLen = {len(arr)}):\n生成n = {rocation}")
    insertMid(arr,rocation,inserArrCount)
    print(arr)
    losePoker(arr)

poker = ["A","3","6","K"]
_2024Spring(poker)

效果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_xian_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值