12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- class Roll {
- constructor() {
- this._ = []; // 存储要roll的列表
- this.totalRank = 0; // 总权重
- }
- add(
- item = throwError('Item must be required'), // 验证参数
- rank = throwError('Rank must be required') // 验证参数
- ) {
- const rankType = typeof rank;
- if (rankType !== 'number')
- throwError(`Rank must be a Number not ${rankType}`);
- if (rank <= 0) throwError('require Rank>0');
- this._.push({
- item,
- rank
- }); // 把要roll的商品添加要列表中
- this.totalRank += rank // 更新权重
- }
- roll() {
- let totalRank = this.totalRank;
- const random = cc.random0To1(); // 产生一个随机数
- let result = null;
- let start = 0; // 区间的开始,第一个是为0
- for (let item of this._) {
- const end = start + item.rank / totalRank; // 计算区间的结束
- if (random > start && random <= end) { // 如果随机数在这个区间内,说明抽中了该商品,终止循环
- result = item;
- break;
- }
- start = end; // 当前区间的结束,作为下一个区间的开始
- }
- return result ? result.item : null;
- }
- }
- module.exports = Roll;
|