根据参与次数计算奖牌数量 解决44次以上计数结果异常问题
参与次数奖励应用问题
基础奖励规则
- 10次参与 = 1枚铜牌
- 20次参与 = 1枚铜牌、1枚银牌
- 30次参与 = 1枚铜牌、1枚银牌、1枚金牌
奖励规则以10次为单位无限循环:
- 40次参与 = 2枚铜牌、1枚银牌、1枚金牌
- 50次参与 = 2枚银牌、2枚银牌、1枚金牌
- 60次参与 = 2枚金牌、2枚铜牌、2枚金牌
进度展示规则
每个等级的1-9次参与显示进行中状态,每满10次进入下一个等级:1次对应10%进度,9次对应90%进度,不显示100%,直接跳转至下一级。
问题说明
目前当前等级进度条、当前等级完成百分比、目标等级图标展示均正常,仅存在奖牌计数异常问题:各等级奖牌计数仅在参与次数≤44时准确,从第45次开始结果异常。
相关代码
const DENOMINATOR = 10; const clamp = (value: number, min: number, max: number): number => { return Math.min(Math.max(value, min), max); } const calculateAwardsByEntryCount = (count: number) => { const maxLevels = 3 * DENOMINATOR; const modulus = count % maxLevels; const currentLevel = Math.max(0, Math.floor(modulus / DENOMINATOR) - 1); const nextLevel = Math.min(3, currentLevel + 1); const prestige = Math.ceil((count + 1) / maxLevels); const progress = ((modulus - DENOMINATOR * nextLevel) / DENOMINATOR) * 100; let bronze = 0; let silver = 0; let gold = 0; if (count >= DENOMINATOR) { bronze = count <= maxLevels ? 1 : Math.floor(modulus / (DENOMINATOR - 1)) * prestige; } if (count >= DENOMINATOR * 2 && bronze > 0) { silver = count <= maxLevels ? 1 : clamp(Math.ceil(modulus / (DENOMINATOR * 2 - 1)) * prestige, 0, bronze + 1); } if (count >= DENOMINATOR * 3 && silver > 0) { gold = count <= maxLevels ? 1 : clamp(Math.ceil((modulus / (DENOMINATOR * 3 - 1)) * prestige), 0, silver + 1); } return { achieved: {bronze, silver, gold}, currentLevel, nextLevel, progress, } } console.log(calculateAwardsByEntryCount(45));
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

