javascript - 将获得的积分转换为游玩时间(数学相关)

标签 javascript math data-conversion

我需要使用纯 JavaScript 将经验值转换为按固定费率计算的游戏小时数。

例如:

一名玩家拥有 1,129,518 经验值。

每小时获得的经验值取决于已有的 XP 数量。它们会被安排成这样:

0 XP 以上:8,000 XP/小时

超过 2,107 XP:20,000 XP/小时

超过 101,333 XP:45,000 XP/小时

1,210,421 XP 以上:68,500 XP/小时

超过 13,034,431 XP:75,000 XP/小时

我正在努力寻找一种方法,使用这些经验值将给定量的经验值转换为玩的小时数,至少使用稍微优雅的 JavaScript。

我最终得到了一堆困惑的 if/else 语句,最终由于数学错误而失败。

有数学奇才可以帮助我吗?谢谢。

代码示例:我将从这里开始

 if(xp === 0){
    return 0;
}else if( 2107 >= xp > 0){
    const result = (xp/8000).toFixed(1);
    return result;
}else if(101333 >= xp > 2107){
    const result = ((2107/8000) + ((xp-2107)/20000)).toFixed(1);
    return result;
}else if(1210421 >= xp > 101333){
    ...
}

如您所见,如果有很多不同的层级,它很快就会失控。

最佳答案

首先,您应该这样编写 if 语句:

if( 2107 >= xp && xp > 0){
    ...
}

接下来,尝试将 XP 视为 XP 桶,每个桶具有不同的值(value)/价格。从最有值(value)的存储桶到最不有值(value)的存储桶,计算每个存储桶的小时数,并减去用于计算这些小时数的 XP 量。

您可以在 while 循环中执行此操作:

let hours = 0;
while(XP > 0)
{
  // figure out bucket you are in, your if statements are fine for that.
  let value = 0;
  let lowerBoundary = 0;
  if( 101333 >= xp && xp > 2107){
    value = 20000;
    lowerBoundary = 2107;
    // you need lower boundary to figure out how many XP you used in this bucket.
  }
  // else if...
  const usedInBucket = XP - lowerBoundary;
  hours += usedInBucket / value; // simply calculate hours needed
  XP -= usedInBucket;
}

关于javascript - 将获得的积分转换为游玩时间(数学相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141039/

相关文章:

javascript - Leaflet 图像映射到横向视口(viewport)的边界 View

javascript - 从函数javascript发送变量

ruby-on-rails - 在 Redis 中进行高效的数学计算

javascript - Angular js 中的模块错误

javascript - 将 fullcalendar.io 与 JSONP 结合使用

math - 高级形式逻辑/自动机理论教科书

查找名称/字符之间比较的算法

java - 如何在 Java 中将一种日期格式转换为另一种日期格式?

python - 将纬度和经度转换为 3D 空间中的点

r - 将列转换为序列