JS开发Discord机器人遇Math.random返回负数问题求解决方法
问题修复方案
负数产生原因
你遇到的负数问题和Math.random()无关,是代码里的余额计算逻辑写反、执行顺序错误导致的:
- 抢劫成功时,你给受害者设置余额用了
amount - victimWallet,正确逻辑应该是受害者原有余额减去被抢金额,写反后自然会出现负数 - 抢劫失败分支你先执行了
return发送消息,后续的数据库修改代码完全不会执行,且两次修改操作都错误指向了抢劫者的钱包,余额计算同样写反 - 受害者钱包为空的判断缺少
return,后续代码仍会执行,会出现Math.random() * null的异常情况
修复步骤
- 给受害者钱包为空的判断加
return阻断后续逻辑 - 修正抢劫成功后的余额计算逻辑,将受害者余额改为
victimWallet - amount - 调整抢劫失败分支的执行顺序:先修改数据库再返回消息,同时修正余额计算逻辑和更新的用户ID
- 用
Math.max()给随机金额兜底,避免生成0金额 - 把随机结果的判断改为
else,避免random=30时无逻辑执行的问题
修复后代码
let db = require(`quick.db`) module.exports = { name: "rob", description: "Rob your friends to get money", category: "economy", usage: "rob [member]", timeout: "1 minute", run: async (client, message, args) => { let victim = message.mentions.members.first() if(!victim) { return message.channel.send(`:x: Please specify a member to rob!`) } let victimW = await db.get(`wallet_${victim.id}`) || 0 if(victimW <= 0) { return message.channel.send(`:x: That user doesn't have money in his wallet, are you sure you want to rob him?`) } let random = Math.floor(Math.random() * 100); if(random < 30) { let victimWallet = await db.get(`wallet_${victim.id}`) || 0 let userWallet = await db.get(`wallet_${message.author.id}`) || 0 // 兜底最少抢1块 let amount = Math.max(1, Math.floor(Math.random() * victimWallet)); const messages = [`POG! You robbed **${victim.username}** and got **${amount}** :coin:!`, `oo seems like you robbed **${victim.displayName}** and got **${amount}** :coin:!`] const randomMessage = messages[Math.floor(Math.random() * messages.length)]; // 修正受害者余额计算 await db.set(`wallet_${victim.id}`, victimWallet - amount) await db.set(`wallet_${message.author.id}`, userWallet + amount) message.channel.send(randomMessage) } else { let authorWallet = await db.get(`wallet_${message.author.id}`) || 0 if(authorWallet <= 0) { return message.channel.send(`:x: You don't have any money to pay the fine if you get caught!`) } let wallet1 = await db.get(`wallet_${victim.id}`) || 0 // 兜底最少罚1块 let amountPaid = Math.max(1, Math.floor(Math.random() * authorWallet)); const message1 = [`Pfft noob, you got caught and paid **${victim.displayName} ${amountPaid}** :coin: lol!`, `lel ure such a noob, you paid **${victim.displayName} ${amountPaid}** :coin:!`, `u suck and you paid **${amountPaid}** :coin: to **${victim.displayName}**, such a noob lol!`] const randomMessage1 = message1[Math.floor(Math.random() * message1.length)]; // 修正余额计算和更新的用户ID await db.set(`wallet_${message.author.id}`, authorWallet - amountPaid); await db.set(`wallet_${victim.id}`, wallet1 + amountPaid); return message.channel.send(randomMessage1) } } }
内容的提问来源于stack exchange,提问作者Refluent
相关产品推荐
相关产品推荐

