Discord.js 经济系统如何实现随机增减用户资金的功能
Discord.js 经济系统随机增减资金实现方案
现有代码的基础问题先修正
你当前写的代码存在3个会直接导致功能失效的问题,需要先修正:
- 方法拼写错误:
db.subract是笔误,正确方法名是db.subtract - 模板字符串取值错误:扣钱逻辑里的键值写的是
money_${msg.guild.id}_{user.id},这里{user.id}前面漏了$,根本无法读取用户ID,会把数据写到固定的字面量键下,和用户实际数据完全脱节 - 逻辑无分支:现在代码会先给用户加一次固定金额,再无差别扣掉同样金额,最终余额没有任何变化
核心增减逻辑实现
整体逻辑拆成三步即可:
- 生成指定区间内的随机资金变动额度,你原本写的1-80的随机值可以直接复用
- 生成独立的0-99随机数做概率判定,自定义加钱/扣钱的触发比例
- 按照判定结果走对应资金操作分支,扣钱逻辑加兜底,避免把用户余额扣成负数
可直接复用的代码示例
// 统一抽取数据库键值,避免重复写导致拼写错误 const balanceKey = `money_${msg.guild.id}_${user.id}`; // 生成1-80的随机变动金额 const changeAmount = Math.floor(Math.random() * 80) + 1; // 生成0-99的随机判定值,这里设定70%概率加钱,30%概率扣钱,阈值可以自行调整 const rollResult = Math.floor(Math.random() * 100); if (rollResult < 70) { // 加钱分支 db.add(balanceKey, changeAmount); // 可在此处给用户发送反馈:本次触发获得XX资金 } else { // 扣钱分支,先查询用户当前余额做兜底 const currentBalance = db.get(balanceKey) || 0; if (currentBalance >= changeAmount) { db.subtract(balanceKey, changeAmount); // 可在此处给用户发送反馈:本次触发损失XX资金 } else { // 余额不足扣除金额时,直接把余额设为0,避免出现负数 db.set(balanceKey, 0); // 可在此处给用户发送反馈:余额不足,本次损失了所有可用资金 } }
可自定义调整的配置点
- 加扣概率:修改
rollResult < 70里的阈值即可,比如改成50就是对半概率触发加/扣,改成80就是80%概率加钱 - 金额区间:如果需要给不同分支设不同的金额范围,可以把
changeAmount的生成逻辑移到对应分支内部,比如加钱时随机1-100,扣钱时随机1-30 - 减少低级拼写错误:把数据库键值存在独立变量里复用,能避免类似之前的模板字符串取值错位问题
内容的提问来源于stack exchange,提问作者DailyToast
相关产品推荐
相关产品推荐

