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;