崩坏三精准池python模拟

最近一周学了python,正好崩坏三出来后崩坏鸭的精准池子,利用列表,字典,随机数匹配范围,简单模拟一下抽卡

 本次UP武器:
重炮:蓝焰银隼0019   2.479%

双枪:空无之钥       0.413%

太刀:天殛之钥       0.413%

大剑:天鹅湖         0.413%

拳套:无存之钥       0.413%

镰刀:血渊之眸       0.413%

骑枪:永寂之赫勒尔   0.413%


[4★圣痕]

真理之翼套装:布洛妮娅.次生银翼(上、中、下)   1.240%

神圣诗篇套装:但丁(上、中、下)               0.310%

适格者套装:哥伦布(上、中、下)               0.310%

雾都神探套装:福尔摩斯(上、中、下)           0.310%

冰之律者套装:安娜.沙尼亚特(上、中、下)      0.310%

3★武器:23个都是 0.488%

3星圣痕:12套概率都是0.936%

4★相转移镜面      6.828%

3★超小型反应炉    10.242%

4星双子灵魂结晶     8.536%

3星灵魂结晶    8.536%

4星吼咪宝藏    1.707%

4星吼美宝藏    2.561%

3星吼里宝藏     4.267%

为了方便计算,把三星材料都放在一块算,把4星材料都放在一块算 

整个代码的流程,首先把四星武器,四星圣痕,三星武器,三星圣痕,三星材料,四星材料用列表分开来存储

再用一个字典存储上面的数据,用列名做key,value就是一整个列表的数据

还要把四星武器和四星圣痕单独再存储一下,再把up圣痕,up武器,非up圣痕,非up武器拿到一块计算他们的概率,再做一个和上面相同操作的字典,为我们做保底机制给必定四星的时候用

每次抽卡,抽卡次数cardcount加一,将这个卡放进一个临时列表中,

判断抽到的是不是4星的,如果是将标签flag改为true说明出了货,不用进保底机制了,直接把临时列表内容写到最终返回的列表cardlist中

如果一次10连没4星,进保底机制,将你临时列表中一个元素删除,从4星装备中拿一个进去

把临时列表的内容写进最终要返回的结果列表cardlist中

 还有针对一次抽卡小于10次的,直接写进最终列表

最后一种情况针对抽卡是12,23,34.这种有十连,最后一趟不够十连的,我套了2层判断 ,为了和前面的情况区分开

import random
from honkaicard import matchfun
m=input("请输入抽卡次数:")
n=int(m)
#4星武器
arms4=['重炮:蓝焰银隼0019','双枪:空无之钥','太刀:天殛之钥','大剑:天鹅湖','拳套:无存之钥','镰刀:血渊之眸','骑枪:永寂之赫勒尔']
#4星圣痕
stigma4=['真理之翼套装:布洛妮娅.次生银翼(上)','真理之翼套装:布洛妮娅.次生银翼(中)','真理之翼套装:布洛妮娅.次生银翼(下)',
         '神圣诗篇套装:但丁(上) ','神圣诗篇套装:但丁(中) ','神圣诗篇套装:但丁(下)',
         '适格者套装:哥伦布(上)','适格者套装:哥伦布(中)','适格者套装:哥伦布(下)',
         '雾都神探套装:福尔摩斯(上)','雾都神探套装:福尔摩斯(中)','雾都神探套装:福尔摩斯(下)',
         '冰之律者套装:安娜.沙尼亚特(上)','冰之律者套装:安娜.沙尼亚特(中)','冰之律者套装:安娜.沙尼亚特(下) '
         ]
#3星武器
arms3=['3星武器(23种)']
#3星圣痕
stigma3=['3星圣痕(12套中上中下任意一件)']
#3星材料
material3=['超小型反应炉','3星吼里宝藏','超小型反应炉']
#4星材料
material4=['相转移镜面','吼咪宝藏 ','吼美宝藏','双子灵魂结晶']
dict_card={}
dict_card.update({'arms4':arms4})
dict_card.update({'arms3':arms3})
dict_card.update({'stigma4':stigma4})
dict_card.update(({'stigma3':stigma3}))
dict_card.update({'material3':material3})
dict_card.update({'material4':material4})
#print(dict_card)


#单抽一次的装备概率
CardprobabilityDict={'arms4':(0,4.96),
                     'stigma4':(4.96,12.397),
                     'arms3':(12.397,23.621),
                     'stigma3':(23.621,57.317),
                     'material3':(57.317,80.362),
                     'material4':(80.362,101)
}

#四星装备中的概率
star4poolprobability={'up_arms':(0,19.997),
                      'not_up_arms':(19.997,39.994),
                      'not_up_stigma':(39.994,69.997),
                      'up_stigma':(69.997,101)
}
up_arms=['重炮:蓝焰银隼0019']
not_up_arms=['双枪:空无之钥','太刀:天殛之钥','大剑:天鹅湖','拳套:无存之钥','镰刀:血渊之眸','骑枪:永寂之赫勒尔']
not_up_stigma=['神圣诗篇套装:但丁(上) ','神圣诗篇套装:但丁(中) ','神圣诗篇套装:但丁(下)',
               '适格者套装:哥伦布(上)','适格者套装:哥伦布(中)','适格者套装:哥伦布(下)',
               '雾都神探套装:福尔摩斯(上)','雾都神探套装:福尔摩斯(中)','雾都神探套装:福尔摩斯(下)',
               '冰之律者套装:安娜.沙尼亚特(上)','冰之律者套装:安娜.沙尼亚特(中)','冰之律者套装:安娜.沙尼亚特(下)']
up_stigma=['真理之翼套装:布洛妮娅.次生银翼(上)','真理之翼套装:布洛妮娅.次生银翼(中)','真理之翼套装:布洛妮娅.次生银翼(下)']

star4pool={}
star4pool.update({'up_arms':up_arms})
star4pool.update({'not_up_arms':not_up_arms})
star4pool.update({'not_up_stigma':not_up_stigma})
star4pool.update({'up_stigma':up_stigma})
#print(star4pool)

#抽卡距离出4星保底距离开始是10
distance=10
cardcount=0

#存放最终结果的列表
listcard =[]

#存放10次抽卡记录的临时列表
temporary_list=[]

#这个参数是为了分辨出剩余抽卡次数少于10次,一个情况是总的抽卡次数n小于10
#还有一种是我前面10连了,剩下水晶不够10连
recordcount =0

#star4pool通过value方法取出的类型是dict_values,需要做个类型转换,变成list
star4pool_values = list(star4pool.values())
#print(star4pool_values)

#遍历上面的列表内部的列表,添加到四星武器的列表,为了最后统计4星装备做的
star4_list = []
for i in star4pool_values:
    for j in i:
        star4_list.append(j)
#print(star4_list)

for i in range(n):
    #flag是做标签,看看这次10连过程中有没有出4星
    flag = False

    #传入单抽的概率字典,和所有装备和材料的卡池,得到一张卡
    result = matchfun.matchfun(CardprobabilityDict,dict_card)
    #print("这是抽到的结果",result)

    #抽卡次数加一
    cardcount += 1

    # 抽到4星卡了就重置保底
    if result in star4_list:
        distance = 10
        flag = True
    else:
        distance -= 1

    print("哇这次抽到了%s"%result)
    
    print("还有%s次就保底了,加油"%distance)

    #将抽到的卡放进临时的列表中
    temporary_list.append(result)

    # 如果总共的抽卡次数少于10次,直接写入最终的列表
    if n < 10 and n == cardcount:
        #print("少于10次直接进最终表")
        listcard.extend(temporary_list)
        temporary_list.clear()
        cardcount=0
        break

    if flag is False:
        #如果抽卡次数到了十,就要返回一次结果
        if cardcount==10:
            #print('这是10连里面没有4星的情况')
            # 临时表里现在一张4星卡都没有,从临时的表随便找到一张卡
            swap_card = random.choice(temporary_list)
            #print("t1",temporary_list)
            # 删除上面找到的那张卡
            temporary_list.remove(swap_card)
            #print("t2",temporary_list)
            # 从四星卡池中找随机一个装备出来
            start4_result = matchfun.matchfun(star4poolprobability, star4pool)
            #print("这是4星替换策略",start4_result)
            # 把这个四星装备加到临时列表中
            temporary_list.append(start4_result)
            # 把本次结果写进最终返回的列表中
            listcard.extend(temporary_list)
            cardcount = 0
            distance = 10
            temporary_list.clear()
            flag = False
            recordcount += 10


    if flag is True:
        if cardcount == 10:
            #print("#"*10)
            #print('这是10连里面有4星的情况')
            listcard.extend(temporary_list)
            cardcount = 0
            distance = 10
            temporary_list.clear()
            recordcount += 10
            flag=False

    #抽卡超过10次,剩余抽卡次数不足10的时候,也需要把结果写进我们最终返回的列表里
    if cardcount < 10 and n > 10:
        if recordcount >= 10 and n - recordcount == cardcount:
            #print("多余10次的部分,剩下不满足10次")
            listcard.extend(temporary_list)
            cardcount=0
            temporary_list.clear()

#print(temporary_list)
#print(flag)
#print(cardcount)
#统计最后4星装备的数量
equipment=0
#统计最后普通装备的数量
normal_equipment=0
for i in listcard:
    if i in star4_list:
        equipment+=1
    else:
        normal_equipment+=1
print('本次精准普通装备数量:',normal_equipment)
print('本次精准4星装备数量:',equipment)
print(listcard)

matchfun类中的matchfun方法

作用是传入一个概率字典,通过生成一个随机数,在概率字典的value中匹配,找到一个key,然后取另一个字典中的任意一个值

import random
from honkaicard import randomchoice
def matchfun(dict1,dict2,dicts={},dict2s={}):
    dicts.clear()
    dict2s.clear()
    if dict1:
        #生成从0到100000的随机数
        number =random.uniform(0,100)
        number=round(number,3)
        dicts.update(dict1)
        #从概率字典中寻找这个随机数的位置
        for k,v in dicts.items():
            if v[0]<=number<v[1]:
                key = k
                dict2s.update(dict2)
                # 如果在carddict中有这个key,我们从中挑一个出来
                if key in dict2s:
                    # 匹配相同的key,取得对应的value,我们的目标结果list
                    final_list = dict2s.get(key)
                    #print(final_list)
                    # 从中找到一个元素返回
                    result = randomchoice.randomchoice(final_list)
                    # print(result)
                    return result

  randomchoice类中的 randomchoice方法

import random
#这个函数的方法是从列表中随机挑选出一个元素
def randomchoice(list1,lists=[]):
    if list1:
        lists.extend(list1)
        result = random.choice(lists)
        return result

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值