使⽤python基本函数实现简易的《原神》抽卡系统
使⽤python基本函数实现简易的《原神》抽卡系统
前⾔
最近迷上了《原神》这款游戏,其中的抽卡系统也是很让⼈上瘾,尤其是1.3版本更新中魈的up池的开启,不知不觉氪⾦数额已近千元。看着瘪瘪的腰包,我想:为什么不⾃⼰写⼀个抽卡系统,爽个够?
说⼲就⼲
基本思路
原神的抽卡系统可以建⽴在单抽的基础上,主要有单抽和⼗连这两种选项。抛开其概率的设定不说,卡池分别包含五星⾓⾊(因为是模拟的魈up池所以没有五星武器)、四星⾓⾊、四星武器和三星武器。五星和四星⼜分别有保底政策。在抽卡函数之外,还需要⼀定的交互界⾯,⽐如查询、充值等选项。
⼤致思路如上,以下为具体做法
抽卡基本函数
先来个这个:
import random
抽卡概率设定
此处我使⽤的是random函数,由于也不是很懂设置概率的操作,直接就⽤⽣成随机数,再判断随机数的区间,只要把区间范围圈定,可以简单地设置抽卡的概率。代码如下:
def single():
"""不保底时的抽奖"""
i = random.randint(1,10001)#⽣成10000个整数
女女小说
if i in range(1,61):#五星中奖概率为0.6%
a = random.randint(0,5)
star = st5[a]
stat.num_5 =0
elif i in range(61,316):#四星⾓⾊概率为2.55%
cha = random.randint(0,len(cha_4)-1)
star = cha_4[cha]
stat.num_4 =0
elif i in range(316,571):#四星武器概率为2.55%
wea = random.randint(0,len(weapon_4)-1)
star = weapon_4[wea]
stat.num_4 =0
elif i in range(571,10001):#其余为三星
star ='三星'
el:
#不知道为什么,实际操作中总是会⽣成写奇奇怪怪的
#东西,为了不影响原函数,这⾥el直接忽视
return None
if star == up:
stat.num_5 =0
stat.up_num =0
add(star)#这个函数会在后⾯解释
卡池
为了不影响阅读,还是把卡池内容贴上吧
"""卡池内容(未设置四星up⾓⾊)"""
up ='魈'
st5 =[up, up, up, up, up,'刻晴','莫娜','七七','迪卢克','琴']
cha_4 =['安柏','丽莎','凯亚','芭芭拉','雷泽','菲谢尔','班尼特','诺艾尔','菲谢尔','砂糖',
'迪奥娜','北⽃','凝光','⾹菱','⾏秋','重云','⾟焱']
weapon_4 =['⼸藏','祭礼⼸','绝弦','西风猎⼸','昭⼼','祭礼残章','流浪乐章','西风秘典','西风长枪',
'⾬裁','匣⾥灭⾠','祭礼⼤剑','钟剑','西风⼤剑','匣⾥龙吟','祭礼剑','笛剑','西风剑','岩盔丘丘王']
st4 = weapon_4 + cha_4
get =[]#这是每次抽奖后存储抽出内容的列表
have =[]#这是存储总抽出内容的列表
保底策略
写程序的时候,这个是让我⽐较头疼的地⽅。⼀开始我想⽤简单的if-el,未果后尝试while,最后才想起来正解:引⼊跟踪游戏数据的类
class Stats:
"""跟踪游戏统计信息"""
def__init__(lf):
lf.up_num =0#记录up保底次数(180发保底)
lf.num_4 =0#记录四星保底次数(10发保底)
lf.num_5 =0#记录五星保底次数(90发保底)
lf.stone =0#这个⽤于充值系统,记录原⽯数
本来需要考虑到“抽到五星后,下⼀个五星必为up⾓⾊这⼀政策,但是嗯…我的⽅法的执⾏效果似乎是⼀样的
荠菜的营养价值利⽤这个统计信息,每抽⼀次卡,如果没有出现期望的物品,对应数据就会+1,从⽽累积起来,到达保底数时,触发保底政策。
保底函数如下
def check_up():
"""检查保底"""
if stat.up_num <179:#检查up⾓⾊保底
if stat.num_5 <89:#检查五星保底
if stat.num_4 <9:#检查四星保底
single()#如果没到保底,就正常抽卡
el:
#如果到保底了,就直接送出期望物品
o_4 = random.randint(0,len(st4)-1)
star = st4[o_4]
add(star)
stat.num_4 =0
el:#同理,不赘述了
o_5 = random.randint(0,len(st5)-1)
star = st5[o_5]
add(star)
设计艺术stat.num_5 =0
el:
star = up
add(star)
stat.up_num =0
但还是有⼀点⼩⼩的问题:假如,这⼀抽既是五星保底的第九⼗发,也是四星保底的第⼗发,此时到
底该出五星还是四星。不是很清楚⽶哈游如何解决这个问题,抽奖⽂案中也没有提及。我就偷个懒不考虑了,直接设置优先级:up>五星>四星,嘿嘿布丁牛仔
另外,关于对运⾏数据的累计,那个函数会在下⼀节提到。也不难想不是
抽卡结束做什么
大象族也就是上⾯提到的function:add()
这个函数会在每次抽卡后执⾏,不管是触发保底还是正常抽卡,主要做记录结果的⼯作
代码如下:
def add(star):
"""每次抽卡完毕的常规操作"""
record(star)#记录保底数据
get.append(star)#将抽到的物品加⼊单次显⽰
have.append(star)#将抽到的内容加⼊背包
record()函数负责记录保底数据,代码如下:
def record(star):
"""记录数据变化"""
if star !='魈':#抽不到就加⼀
stat.up_num +=1
if star not in st4:
stat.num_4 +=1
if star not in st5:
stat.num_5 +=1
统计背包
抽完卡后,背包have列表还是⽐较凌乱的,我对其借⽤了个统计,制成字典以更条理地显⽰所获物品
def remember():
"""统计抽卡内容"""
value_cnt ={}#将中奖添加到列表⾥
for h in have:
value_cnt[h]= (h,0)+1
print(value_cnt)
抽奖操作
这⾥分为单抽和⼗连,由于每次抽奖都需要在get列表中显⽰抽奖结果,两种函数均需在调⽤时清空get[]
单抽函数代码如下:
def extract():
"""单抽"""
if stat.stone >=160:#这⾥添加了个判断原⽯
del get[:]
check_up()
stat.stone -=160
print(get)
el:#充值系统我放在交互程序的⽂件⾥了
print('您的原⽯不⾜,请充值!')
⼗连函数如下:
def ten():
"""⼗连函数"""
美国大学专业排名
if stat.stone >=1600:
del get[:]
for num in range(0,10):#操作⼗次
check_up()
stat.stone -=1600
print(get)
el:
print('您的原⽯不⾜,请充值!')
⾄此,抽卡系统已制作完成,下⾯是交互系统的制作
交互系统
这⼀部分⽐较简单,就是各种逻辑判断,运⾏时也只是在python终端⾥通过⽤户输⼊来实现,相对⽽⾔较为简陋。需要引⼊的库:
import main#也就是上⾯那个抽奖系统
from time import sleep
⾸先是开始运⾏的显⽰
print('正在加载配置⽂件...')
sleep(1)#嘿嘿,加点⼉正式感
print('欢迎使⽤《原神》模拟抽卡系统,随时输⼊q以退出')
while True:
print('请输⼊对应字母以进⼊相应功能:\n[A]开始祈愿\t[B]祈愿记录\t[C]充值\t[q]退出') msg =input('')
开始祈愿
话不多说,上代码
if msg.title()=='A':
yi =input('请选择:\n[A]祈愿1次\t[B]祈愿10次\n')
if yi.title()=='A':
sleep(1)#sleep,营造氛围嘛
sleep(0.5)
continue
elif yi.title()=='B':
sleep(1)
<()
sleep(0.5)精忠报国串词
continue
elif yi.title()=='q':
古代选官制度break
el:
print('请输⼊正确的选项!')
sleep(1)
continue
祈愿记录
if msg.title()=='B':
num =len(main.have)
print('您已进⾏'+str(num)+'次祈愿')
print('其中有:')
sleep(1.5)
continue
充值系统
⽤了冗长的判断,好丑
if msg.title()=='C':
print('您当前原⽯余额为:'+str(main.stat.stone))
cho =input('请选择充值⾦额:\n[A]6元(加赠60原⽯)\t[B]30元(加赠300原⽯)\t[C]98元(加赠980原⽯)' '\n[D]198元(加赠1980原⽯)\t[E]328元(加赠3280原⽯)\t[F]648元(加赠6480原⽯)\n[G]返回\n') if cho.title()=='A':
main.stat.stone +=120
elif cho.title()=='B':
main.stat.stone +=600
elif cho.title()=='C':
main.stat.stone +=1960
elif cho.title()=='D':
main.stat.stone +=3960
elif cho.title()=='E':
main.stat.stone +=6480
elif cho.title()=='F':
main.stat.stone +=12960
elif cho.title()=='G':
continue
elif cho =='q':
break
el:
print('请输⼊正确的选项!')
continue
print('充值成功!当前余额为:'+str(main.stat.stone))
sleep(1.5)
continue
退出
#
if msg =='q':
break
print('感谢您使⽤模拟抽卡系统,祝您游戏愉快!')
sleep(1.5)
结语