python实现模拟抽卡

需求

1. 100次必出红色
2. 100次内首次出了红色,保底就消失
3. 99次都没出保底红色,100次直接从红色里随机一个红色
4. 红色1%,紫色9%,蓝色30%,白色60%

代码实现

"""
1. 100次必出红色
2. 100次内首次出了红色,保底就消失
3. 99次都没出保底红色,100次直接从红色里随机一个红色
4. 红色1%,紫色9%,蓝色30%,白色60%
"""
import random
# 定义一个商品类
class Goods:
    def __init__(self,color,name):
        self.color = color
        self.name = name
    def desc(self):
        return f"这是一个{self.color}的{self.name}"
# 定义奖品池
listGoods = [ Goods("红色","匕首") ,Goods("紫色","匕首"),Goods("蓝色","匕首"),Goods("白色","匕首"),
              Goods("红色","斩马刀"),Goods("紫色","斩马刀"),Goods("蓝色","斩马刀"),Goods("白色","斩马刀"),
            Goods("红色","阔刀"),Goods("紫色","阔刀"),Goods("蓝色","阔刀"),Goods("白色","阔刀"),
Goods("红色","太刀"),Goods("紫色","太刀"),Goods("蓝色","太刀"),Goods("白色","太刀"),
Goods("红色","横刀"),Goods("紫色","横刀"),Goods("蓝色","横刀"),Goods("白色","横刀"),
Goods("红色","双刀"),Goods("紫色","双刀"),Goods("蓝色","双刀"),Goods("白色","双刀"),
Goods("红色","双籍"),Goods("紫色","双籍"),Goods("蓝色","双籍"),Goods("白色","双籍"),
Goods("红色","扇子"),Goods("紫色","扇子"),Goods("蓝色","扇子"),Goods("白色","扇子"),
Goods("红色","长枪"),Goods("紫色","长枪"),Goods("蓝色","长枪"),Goods("白色","长枪"),
Goods("红色","长棍"),Goods("紫色","长棍"),Goods("蓝色","长棍"),Goods("白色","长棍")]

# 4. 红色0.1%,紫色0.9%,蓝色3%,白色6%,设置权重
weights = [
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06,
    0.001,0.009,0.03,0.06
           ]
def baodi():
    counts = 0 # 抽奖次数
    i = 100 # 剩余次数
    isBaoDi = True # 是否触发保底
    def rand():
        nonlocal i
        nonlocal isBaoDi
        nonlocal counts
        if(isBaoDi == False and counts == 100 and i == 0): 
            # 循环保底
            counts = 0
            i = 100
            isBaoDi = True
        if(isBaoDi and counts == 99 and i == 1):
            # 最后一次必出红色
            reds = list(filter(lambda x:x.color == "红色",listGoods))
            randGoods = random.choice(reds)
            print(f"第{counts}次:{randGoods.desc()},是否还有保底{isBaoDi}")
        else:
            # 其他情况,均是随机抽奖
            randGoods = random.choices(listGoods,weights,k=1)[0]
            if(randGoods.color == "红色" and isBaoDi):
                isBaoDi = False
            print(f"第{counts}次:{randGoods.desc()},是否还有保底{isBaoDi}")
        i -= 1
        counts += 1
    return rand
inner = baodi()
# 模拟抽奖100次
for i in range(0,100):
    inner()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值