Время, необходимое для разрушения здания в браузерной игре, вычисляется неправильно

#javascript #math

#javascript #математика

Вопрос:

 // Number of rockets launched per second.
const rocketSpeed = 1;

// The amount of damage dealt by rocket.
const attackDamage = 60;

// The amount of hit points of the building.
const buildingHitPoints = 1000;

// The number of rockets required to destroy the building.
const numberOfRockets = Math.ceil(buildingHitPoints / attackDamage);

// The time it takes to destroy the building.
const requiredTime = numberOfRockets * rocketSpeed;
 

Если rocketSpeed это больше одной секунды, то я получаю правильное значение.

Например: const requiredTime = 17 * 1 ;

Но если вы укажете rocketSpeed менее 1 секунды, то значение будет неверным:

Например: const requiredTime = 17 * 0.625; // 10.625

0,625 — это количество ракет, выпущенных в секунду. То есть 1 ракета будет запущена примерно за ~ 1,2 секунды.

Я пробовал разные варианты по типу: const requiredTime = 17 (17 - 37.5%); (37,5%, потому что: 1000 — 625 = 375. 375 составляет 37,5% от 1000), но это не работает.

Комментарии:

1. Разделите 1 на скорость ракеты, так что это: numberOfRockets / (1 / Скорость ракеты)

2. Используйте анализ размеров на requiredTime = numberOfRockets * rocketSpeed . Какова единица измерения requiredTime ? Вы видите ошибку?

Ответ №1:

Количество ракет, запускаемых в секунду, лучше рассматривать как частоту, а не как «скорость».

Частота f равна f = 1/ T, где время равно T, поэтому T = 1 / f

Возможно, переименовать rocketSpeed в rocketFrequency и создать новую переменную timeBetweenRockets с
const timeBetweenRockets = 1 / rocketFrequency .

Тогда последняя строка кода будет более самоописывающейся

const requiredTime = numberOfRockets * timeBetweenRockets

Ответ №2:

У вас неправильный расчет. Если вы попробуете использовать значения больше 1, то увидите, что это займет больше времени: 1 ракета в секунду (r / s) приводит к 17 секундам. 2 r / s дает 34 секунды, а 0,5 r / s дает 10,625 секунды.

 const calculate = rocketSpeed => {

  // The amount of damage dealt by rocket.
  const attackDamage = 60;

  // The amount of hit points of the building.
  const buildingHitPoints = 1000;

  // The number of rockets required to destroy the building.
  const numberOfRockets = Math.ceil(buildingHitPoints / attackDamage);

  // The time it takes to destroy the building.
  const requiredTime = numberOfRockets * rocketSpeed;
  
  return requiredTime;
}
 
console.log(`Time for 1 rocket/s: ${calculate(1)}`);
console.log(`Time for 2 rocket/s: ${calculate(2)}`);
console.log(`Time for 0.625 rocket/s: ${calculate(0.625)}`); 

Если вы вместо этого разделите numberOfRockets на rocketSpeed , то получите правильные ответы.

 const calculate2 = rocketSpeed => {

  // The amount of damage dealt by rocket.
  const attackDamage = 60;

  // The amount of hit points of the building.
  const buildingHitPoints = 1000;

  // The number of rockets required to destroy the building.
  const numberOfRockets = Math.ceil(buildingHitPoints / attackDamage);

  // The time it takes to destroy the building.
  const requiredTime = numberOfRockets / rocketSpeed;
  
  return requiredTime;
}

console.log(`Time for 1 rocket/s: ${calculate2(1)}`);
console.log(`Time for 2 rocket/s: ${calculate2(2)}`);
console.log(`Time for 0.625 rocket/s: ${calculate2(0.625)}`);