Javascript 如何反转此命令?
我正在制作一个关于“不和谐”的声音排名系统,现在一切都很好,但我陷入了某种困境。 我发出了这个命令,它可以让你从一个级别获得Xp值,并将Xp转换为时间,如: 级别系统基于以下代码:Javascript 如何反转此命令?,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,我正在制作一个关于“不和谐”的声音排名系统,现在一切都很好,但我陷入了某种困境。 我发出了这个命令,它可以让你从一个级别获得Xp值,并将Xp转换为时间,如: 级别系统基于以下代码: module.exports={ 名称:“lvl”, 执行(消息,参数){ const start=216000//从一级到二级 常数coe=125//系数 const lvls=2//每个阶段中的lvl数量 函数msToTime(duration){//ms到时间,用法:msToTime(xp+'00'),1xp
module.exports={
名称:“lvl”,
执行(消息,参数){
const start=216000//从一级到二级
常数coe=125//系数
const lvls=2//每个阶段中的lvl数量
函数msToTime(duration){//ms到时间,用法:msToTime(xp+'00'),1xp=0.1秒
var毫秒=parseInt((持续时间%1000)/100),
秒=数学楼层((持续时间/1000)%60),
分钟=数学楼层((持续时间/(1000*60))%60),
小时=数学楼层((持续时间/(1000*60*60));
小时数=(小时数<10)?“0”+小时数:小时数;
分钟=(分钟<10)?“0”+分钟:分钟;
秒=(秒<10)?“0”+秒:秒;
返回时数+小时+分钟+米+秒+秒;
}
功能阶段(lvl){//从lvl获取阶段编号,阶段用于划分lvl
常数a=+1级
常数b=数学楼层((a/2)+1)
常数c=b.toString()
控制台日志(c)
返回c;
}
功能百分比(阶段){//获取lvls膨胀百分比,每个阶段的百分比将更大
常数a=阶段*coe
常数b=a.toString()
控制台日志(b)
返回b;
}
函数Xp(lvl){//从lvl获取Xp量
常数a=(百分比(阶段(级别))*(级别-1))
常数b=start+(start*a/100)
常数c=b.toString()
控制台日志(c)
返回c;
}
message.channel.send('Xp:'+Xp(args[0])+',Time:'+msToTime(Xp(args[0])+'00')//发送Xp金额和时间
}
};
但是现在,我不知道如何从Xp中获得级别,例如:
您键入.xp 486000
,它将为您提供2级
有人有主意吗~和thx
编辑:(我删除了阶段功能)
module.exports={
名称:“lvl”,
执行(消息,参数){
const start=216000//从一级到二级
常数coe=65//系数
函数msToTime(duration){//ms到时间,用法:msToTime(xp+'00'),1xp=0.1秒
var毫秒=parseInt((持续时间%1000)/100),
秒=数学楼层((持续时间/1000)%60),
分钟=数学楼层((持续时间/(1000*60))%60),
小时=数学楼层((持续时间/(1000*60*60));
小时数=(小时数<10)?“0”+小时数:小时数;
分钟=(分钟<10)?“0”+分钟:分钟;
秒=(秒<10)?“0”+秒:秒;
返回时数+小时+分钟+米+秒+秒;
}
函数百分比(lvl){//获取lvl膨胀百分比
常数a=lvl*coe
常数b=a.toString()
控制台日志(b)
返回b;
}
函数Xp(lvl){//从lvl获取Xp量
常数a=(百分比(层积)*(层积-1))
常数b=start+(start*a/100)
常数c=b.toString()
控制台日志(c)
返回c;
}
message.channel.send('Xp:'+Xp(args[0])+',Time:'+msToTime(Xp(args[0])+'00')//发送Xp金额和时间
}
};
您可以定义一个具有特定阈值的对象,用户可以在该阈值上升级。也许一级是0秒,二级是1小时,三级是5小时等等,你会这样做:
let levels = {
"1": 0
"2": 1 * 60 * 60 * 1000
"3": 5 * 60 * 60 * 1000
}
function checkLevel(xp) => {
let checkLevel = 0;
let outLevel = 0;
while (true) {
let levelXp = levelToXp(checkLevel);
if (xp > levelXp) outLevel = level;
else return outLevel.toString();
checkLevel++;
}
}
然后,您可以循环用户的输入,并检查它是否高于每个级别的阈值。当前您的XP是他们的时间(毫秒)。因此,如果他们说10800000
XP(3小时),这样的函数将返回他们的级别为“2”
:
如果您不希望对级别XP进行硬编码,可以使用一个函数,该函数接受级别并使用您想要的任何算法(即,您的XP()
函数)返回所需的XP。你可以这样做:
let levels = {
"1": 0
"2": 1 * 60 * 60 * 1000
"3": 5 * 60 * 60 * 1000
}
function checkLevel(xp) => {
let checkLevel = 0;
let outLevel = 0;
while (true) {
let levelXp = levelToXp(checkLevel);
if (xp > levelXp) outLevel = level;
else return outLevel.toString();
checkLevel++;
}
}
我试图回答这个问题,因为我很好奇代数方程会是什么样子。所以首先,它不会起作用,因为
Math.floor
是一个有损函数。如果lvl
是偶数,则答案是正确的,否则可能不是
那么,让我们建立一些代数方程
stage=st,coe=c,lvl=l,start=s,percentage=p,xp=x
阶段为:
百分比为:
XP是:
解决Lvl问题:
所以,你可能可以用它来制作一个JS函数,但它不会像我说的那样正确,Math.floor
是一个有损函数
您可以在这里查看:
https://www.mathpapa.com/algebra-calculator.html?q=x%3Ds%5Cleft(1%2B%5Cfrac%7B%5Cleft%5B%5Cleft(%5Cfrac%7B%5Cleft(l-1%5Cright)%7D%7B2%7D%2B1%5Cright)c%5Cleft(l-1%5Cright)%5Cright%5D%7D%7B100%7D%5Cright)
编辑: 如果没有
阶段
功能,方程式将为:
就是这样:
函数Lvl(xp){//从xp获取Lvl
常量a=((start*coe)+Math.sqrt((start*coe)*((start*coe)-(400*start)+(400*xp))/(2*start*coe)
常数b=a.toString()
控制台日志(a)
返回b;
}
将每个+替换为-,每个-替换为+,每个*替换为/和每个/替换为*。这样行吗?试试看,你就会知道不行,不行。我认为它不会工作,因为它是一个有损函数,如果lvl是偶数,那么它就可以了,否则它将不会返回正确的解。用lvl、xp和常数(coe和start)建立代数方程。你会知道的。定义一个对象将是一个解决方案,但一个临时解决方案。系统应该是自动的,这段代码的要点不仅仅是一个命令,我需要它在我的主系统上。我已经编辑了答案,第三段代码允许动态计算XP级别。我不明白它是如何工作的,但现在我认为最好的方法是