首页 > 解决方案 > CodeWars Kata 解决方案中的疑似舍入错误

问题描述

我正在尝试使用 Javascript在 Codewars 上解决这个 kata 。

这个kata要求你让游戏中的两种类型的怪物相互攻击魔法门之英雄无敌2,每个人轮流互相攻击,直到一个人获胜。

大多数测试现在都成功了,但是我仍然收到一些与预期结果相差 1 的错误。例如:

'预期:'5 野猪获胜',而不是:'4 野猪获胜'

'预期:'1 Skeleton(s) won',而不是:'2 Skeleton(s) won'

错误通常只是相差 1 或 2,并且似乎是双向的(我的结果要么太高要么太低)。

我一直在摆弄我的代码,似乎找不到解决方案。

示例怪物包括:

{ "type": "Roc",         "hitpoints": 40, "number": 6,  "damage":8 }
{ "type": "Unicorn",     "hitpoints": 40, "number": 4,  "damage":13}
{ "type": "Titan",       "hitpoints": 300,"number": 1,  "damage":50}
{ "type": "Battle Dwarf","hitpoints": 20, "number": 25, "damage":4 }
{ "type": "Paladin",     "hitpoints": 50, "number": 8 , "damage":20}
{ "type": "Skeleton",    "hitpoints": 4 , "number": 100,"damage":3 }

不幸的是,我看不到测试失败的怪物的统计数据,所以很难看出我可能出错的地方。有人可以帮忙吗?(PS我知道代码可能更整洁,抱歉)

function whoWouldWin(mon1, mon2) {
  var hitpoints1 = mon1.hitpoints * mon1.number;
  var hitpoints2 = mon2.hitpoints * mon2.number;

  function attack() {
    damage1 = (mon1.number * mon1.damage);
    hitpoints2 -= damage1;

    if (hitpoints2 < ((mon2.number - 1) * mon2.hitpoints)) {
      mon2.number = Math.ceil(hitpoints2 / mon2.hitpoints);
    }

    if (mon2.number <= 0) {
      return (mon1.number + " " + mon1.type + "(s) won");

    } else {
      damage2 = (mon2.number * mon2.damage);
      hitpoints1 -= damage2;

      if (hitpoints1 < ((mon1.number - 1) * mon1.hitpoints)) {
        mon1.number = Math.ceil(hitpoints1 / mon1.hitpoints);
      }

    }
    if (mon1.number <= 0) {
      return (mon2.number + " " + mon2.type + "(s) won");

    } else {
      return (attack());
    }
  }
  return (attack());
}

标签: javascriptfunctionobject

解决方案


hitpoints2 < ((mon2.number - 1) * mon2.hitpoints)) {

这就是说:如果生命值2 小于(剩余怪物数量-1 怪物)乘以每个怪物的完整生命值,则计算剩余怪物数量。

但是最后一个怪物在战斗后没有完整的生命值。


推荐阅读