【编程练习】明日非舟抽卡模拟器(1)按照概率抽取干员星级
好友封掣写了一个明日方舟模拟寻访,于是也想做一个来作为 java 的练手,这学期写课设的时候就体现出我平时写代码写太少了。
当然,经过这学期末的编码轰炸,我现在可不敢像以前一样没有计划地直接开始,先想好它的架构,随后再开始编写,并留下系列博文记录,供以后参考。
目前已经构思的架构
- 主包
- 视图包 view
- 模型包 model
- 简历类 Resume:用于存储干员的信息,比如名字,星级,立绘路径等
- 人事资源类 HumanResourse:用于存储合成玉以及其他抽卡资源数目
- 属性
- 合成玉数目
- 卡池
- 方法
- 单抽
- 十连
- 属性
- 卡池类 Pool
- 属性
- 星级出率:一维数组,下标对应星级,值为对应出率
- 简历池:二维数组,一维下标对应星级,二维下标动态,值为干员引用
- 方法
- 载入简历 loadResume(String fileName)
从文件中读取出简历,并加入简历池 - 抽出下一份简历 recruit()
先抽取星级,再从对应的星级池中抽取简历 - 抽取星级 randomStar()
生成 1~100 的随机整数,根据星级出率确定每个星级的区间,判断随机数落在哪个区间,从而确定星级 - 抽取对应星级的简历 randomResume(int star)
从简历池中随机抽取下标,并返回下标对应的干员引用
- 载入简历 loadResume(String fileName)
- 属性
算法
根据卡池的出率抽取星级。
干员的星级分为一星到六星,每个星级的概率不一定相同。
这个目标的要点在于,如何给予六个星级不同的抽取概率。
方法一是创建一个 100 个元素的数组,根据不同星级各自的概率分配不同的元素数量。比如,三星有 45%概率被抽出,那么就将 45 个元素赋值为“3”,六星有 2%的概率,那么就将 2 个元素赋值为“6”。最后抽取下标来获取星级。
不过我没有采取这种方式,这种方式有点暴力。这个例子里面还好,是 100 个整数,假如是 100 个开销比较大的对象,或者概率精确到了很多位小数,那么就不太合适了。
方法二是对每个星级划分一个区间,概率决定了区间的长度,在总区间内随机一个数,然后判断落在哪个星级区间。我用的是这个方法。
代码
1 | /** |
【编程练习】明日非舟抽卡模拟器(1)按照概率抽取干员星级