没有合适的资源?快使用搜索试试~ 我知道了~
Python 模拟《原神》抽卡系统
资源推荐
资源详情
资源评论
简介
想必大家都听说过原神吧,是米哈游开发的大世界探索游戏。大学一放假就太闲了,于是就
用 python 写了个模拟原神抽卡的程序,其实星铁也适用这个机制
大家可以用它来试试运气,我在测试的时候一次出了三金,两个纳西妲一个琴(炫耀)[为什么
我游戏中就没这运气,天天大保底,气死了]
好的,那么废话不多说,我们先说一下原理
代码思想
根据我从网上和官方给出的概率浏览获得的信息:
保底机制
180 抽大保底,90 抽小保底
概率
五星中奖概率为 0.6%
四星角色概率为 2.55%
其余的三星概率是 96.85%
大保底小报底各占 50%
五星概率会从第 74 抽开始逐渐提高 6%
概率公式
概率 抽卡次数 i
0.006 (i<=73)
0.006 + 0.06(i - 73) (74<=i<=89)
1 (i=90)
代码构建
导入软件包 random 和 os
毕竟是抽卡,怎么能少了 random
然后这个 os 是新建文件夹用的
用来保存你的抽卡记录,还有创建你的卡池
import os
import random
初始化概率
其实简单说说就是,先加入 9685 个蓝色,然后加入 255 个紫色,再加入 6 个金色,然后打
乱
# 初始化抽卡的概率
def rate_initialization():
rate_list.extend(['蓝' for temp in range(9685)]) # 蓝色概率是 96.85%
rate_list.extend(['紫' for temp in range(255)]) # 紫色概率是 2.55%
rate_list.extend(['金' for temp in range(60)]) # 金色概率是 0.6%
random.shuffle(rate_list) # 打乱这个列表
增加概率
其实就是 74 抽之后,每次把 60 个蓝色去掉,然后随机插入 60 个金色
啊,这个踹他的原因就是怕一开始初始化蓝色数量不够,其实没啥用,可以删掉
# 74 抽之后增加概率
def rate_add():
try:
for _ in range(60):
rate_list.remove('蓝')
rate_list.insert(random.randint(0, len(rate_list) - 1), '金')
except ValueError:
print('程序异常,概率增加异常')
exit()
保底机制
有点小长,说简单点其实就是检测是否有保底这个文本文档,如果有就读一下,没有就创建
并写入 false 表示是小报底,true 是大保底。如果是 false 就在 up 和常驻中随机抽取,抽到 up
还是 false,抽到常驻变成 true,就这么个原理
# 大保底还是小保底
def guarantees():
try:
with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:
if file.read() == 'true':
certainly = True
else:
certainly = False
except BaseException:
with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:
file.write('false')
with open('recording\\isGuarantees.txt', 'r', encoding='utf-8') as file:
if file.read() == 'true':
certainly = True
else:
certainly = False
if certainly:
with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:
file.write('false')
return True
else:
res = random.choice(['up', 'resident'])
if res == 'up':
with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:
file.write('false')
return True
else:
with open('recording\\isGuarantees.txt', 'w+', encoding='utf-8') as file:
file.write('true')
return False
创建文件夹
其实注释都说了,不存在就新建一个,存在就拉倒
# 创建一个文件夹在同一个目录下
def mkdir(path):
folder = os.path.exists(path)
if not folder: # 判断文件夹是否存在
os.makedirs(path) # 不存在就新建一个
抽卡次数读取
这个其实和上面的保底一样的,找不到文件就新建一个,然后初始化为 0
# 抽卡次数读取
def read_times():
try:
with open('recording\\times.txt', 'r', encoding='utf-8') as file:
number = int(file.read())
return number
except BaseException:
with open('recording\\times.txt', 'w+', encoding='utf-8') as file:
file.write('0')
return 0
出金之后的判断
这就是为什么上面的保底返回的是 True 和 False,出了就 append 一个 up 角色,歪了就 append
一个常驻的角色上去
# 出金了
def gold():
rate_initialization()
record_times(0)
if guarantees():
res_list.append(up)
return '出货了!!!!!'
else:
res_list.append(random.choice(fiveStar))
return '哇!金色传。。。歪了。。。'
10 抽必出紫
第十抽必是紫色,如果不满 10 抽出了紫色,那么记录则会清零,这是记录和读取的函数
# 记录紫色保底,10 抽必出紫色
def record_rare(number):
with open('recording\\rare.txt', 'w+', encoding='utf-8') as file:
剩余10页未读,继续阅读
资源评论
诗者才子酒中仙
- 粉丝: 5661
- 资源: 1036
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功