Roll.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. class Roll {
  2. constructor() {
  3. this._ = []; // 存储要roll的列表
  4. this.totalRank = 0; // 总权重
  5. }
  6. add(
  7. item = throwError('Item must be required'), // 验证参数
  8. rank = throwError('Rank must be required') // 验证参数
  9. ) {
  10. const rankType = typeof rank;
  11. if (rankType !== 'number')
  12. throwError(`Rank must be a Number not ${rankType}`);
  13. if (rank <= 0) throwError('require Rank>0');
  14. this._.push({
  15. item,
  16. rank
  17. }); // 把要roll的商品添加要列表中
  18. this.totalRank += rank // 更新权重
  19. }
  20. roll() {
  21. let totalRank = this.totalRank;
  22. const random = cc.random0To1(); // 产生一个随机数
  23. let result = null;
  24. let start = 0; // 区间的开始,第一个是为0
  25. for (let item of this._) {
  26. const end = start + item.rank / totalRank; // 计算区间的结束
  27. if (random > start && random <= end) { // 如果随机数在这个区间内,说明抽中了该商品,终止循环
  28. result = item;
  29. break;
  30. }
  31. start = end; // 当前区间的结束,作为下一个区间的开始
  32. }
  33. return result ? result.item : null;
  34. }
  35. }
  36. module.exports = Roll;