当今抽卡游戏在年轻人间流行,像原神、崩坏:星穹铁道、绝区零这类二次元游戏也不乏抽卡的游戏模式,但各游戏的抽卡机制都不一样,有固定概率的、也有随抽取次数而增加概率的。
我参考的是《公主连结》这款游戏的抽卡机制,也能帮助我的朋友在每次出新卡池前试试手气,手气不好的话,就懂得都懂了。项目链接放在文章最后,感兴趣的朋友可以来玩一玩。
废话不多说,上代码(单抽代码):
# -*- coding: utf-8 -*-
import random
def random_one():
# 读取文件的示例
try:
jdt = False
with open("../docs/fes.data", "r", encoding="utf-8") as fp_fes:
fp_fes_list = fp_fes.readlines()
my_list = []
num = random.random()
if num < 0.025: # 2.5%的概率输出“彩色”
my_list.append(random.choice(fp_fes_list).strip())
elif num < 0.205: # 18%的概率输出“金色”
my_list.append("金")
have_color = True
else: # 79.5%的概率输出“银色”
my_list.append("银")
my_list_1 = set(my_list)
with open("../docs/ihave.data", "r", encoding="utf-8") as fp_fes:
fp_fes_list = {line.strip() for line in fp_fes.readlines()}
if not my_list_1 <= fp_fes_list:
unique_elements = my_list_1 - set(fp_fes_list)
elements_to_write = "\n".join(unique_elements)
with open("../docs/ihave.data", "a", encoding="utf-8") as fp_ihave:
fp_ihave.write(elements_to_write + "\n") # 添加换行符以分隔追加的内容
jdt = True
return my_list, jdt
except Exception as e:
print(f"发生错误: {e}")
这是其中的一部分代码,读取文件是为了将抽取结果保存下来。
关于概率的部分代码,使用一个简单的随机数便能实现。与大多数游戏一样,这个游戏也有三种不同的卡片,每种的概率也不同,但十连抽多了一个保底机制——如果前九次出来的都是“银”,那么第十次出来的一定是“金”,或者“彩”,且“银”的概率加在“金”上面。要实现这个也比较容易,在循环里定义一个布尔变量,如果有非“银”的出现就不改动,否则改变进入第十次抽取。这部分上面的代码就没有显示出来了。
最后一个if语句可以用来判断是否抽取出来的角色中有新的角色。在这个游戏中,每当有新角色被抽出来时都会有一段进度条加载,所以我添加了jdt(进度条)这个变量来传递变量。