Javascript 如何反转此命令?

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

我正在制作一个关于“不和谐”的声音排名系统,现在一切都很好,但我陷入了某种困境。 我发出了这个命令,它可以让你从一个级别获得Xp值,并将Xp转换为时间,如:

级别系统基于以下代码:

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级别。我不明白它是如何工作的,但现在我认为最好的方法是