最近一周学了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