今天跟大家分享一下我最近搞的那个《原神抽卡模拟器》,说起来这玩意儿,纯粹是自己手痒,想试试水。
事情是这样的,前段时间原神不是又更新吗,出新角色,我寻思着抽一个玩玩,结果嘛懂得都懂,非酋体质,氪不少,就出几个重复的。当时我就在想,能不能自己整个模拟器,让我过过瘾,也省点钱。
说干就干!
我上网搜一大堆资料,什么“原神抽卡概率”、“保底机制”之类的,把官方的说法研究个透彻。然后就开始找现成的轮子,看看有没有大神已经做过类似的。搜一圈,还真不少,什么“Silly Wisher”,什么“原神开箱模拟器”,花里胡哨的,下几个体验一下,感觉都差点意思,要么广告太多,要么界面太简陋,总之就是没内味儿。
既然没有满意的,那就只能自己动手。
我先是琢磨一下整个抽卡流程,这玩意儿说白就是个概率问题,得模拟出那种真实的抽卡体验。于是我决定从最简单的开始,先用Python写个简单的版本,主要就是实现一个抽卡函数,能够根据官方的概率,随机返回一个角色或者武器。
python
import random
def 抽卡():
# 这里简单模拟一下,假设五星概率是0.6%,四星概率是5.1%
五星概率 = 0.006
四星概率 = 0.051
随机数 = *()
if 随机数 < 五星概率:
return "恭喜你,抽到五星角色!"
elif 随机数 < 五星概率 + 四星概率:
return "恭喜你,抽到四星角色!"
else:
return "很遗憾,抽到三星武器。"
# 测试一下
print(抽卡())
这只是个最简单的版本,连角色池都没加,更别说保底机制。但是至少能跑起来,给我点信心。
我就开始逐步完善它。是加入角色池,把原神里所有的角色和武器都放进去,然后根据星级分类,五星角色有哪些,四星角色有哪些,三星武器有哪些,都要明确。
然后是实现保底机制。原神的保底机制是90抽必出五星,10抽必出四星。这个得用代码来实现,就得记录玩家已经抽多少次,如果到保底次数还没出货,就必须强制出一个。
这部分代码比较复杂,涉及到计数、判断、随机选择等等,我花不少时间才搞定。
python
import random
角色池 = {
"五星角色": ["角色A", "角色B", "角色C"],
"四星角色": ["角色D", "角色E", "角色F"],
"三星武器": ["武器1", "武器2", "武器3"]
五星保底 = 90
四星保底 = 10
def 抽卡(已抽次数):
五星概率 = 0.006
四星概率 = 0.051
# 保底机制
if 已抽次数 % 五星保底 == 0:
return *(角色池["五星角色"]) # 强制出五星
elif 已抽次数 % 四星保底 == 0:
return *(角色池["四星角色"]) # 强制出四星
else:
随机数 = *()
if 随机数 < 五星概率:
return *(角色池["五星角色"])
elif 随机数 < 五星概率 + 四星概率:
return *(角色池["四星角色"])
else:
return *(角色池["三星武器"])
# 模拟抽卡100次
已抽次数 = 0
for i in range(100):
已抽次数 += 1
result = 抽卡(已抽次数)
print(f"第{已抽次数}抽:{result}")
代码写完,就开始疯狂测试。看看保底机制是否正常,看看概率是否符合预期。结果嘛bug还是不少,经常出现一些奇怪的问题,比如保底次数不对,或者抽出来的东西不在角色池里。
改bug的过程简直痛苦,有时候一个bug就要搞一天,但解决之后又特别有成就感。
我把这个简陋的模拟器分享给几个朋友,让他们帮忙测试。结果反馈还不错,虽然界面很丑,功能也很简单,但是至少能用,也能模拟出那种抽卡的刺激感。
这只是个开始,后面我还想继续完善它,比如加入更多的角色和武器,优化界面,甚至加入一些社交功能,让大家可以一起分享抽卡结果。
这回实践还是很有意思的,不仅让我对原神的抽卡机制有更深入的解,也让我复习不少Python知识。虽然过程很艰辛,但是结果还是值得的。以后有机会,我会继续分享我的实践记录,希望对大家有所帮助。
