【发布时间】:2019-08-23 08:21:40
【问题描述】:
我正在尝试使用 Javascript 解决 this kata on Codewars。
这个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 }
不幸的是,我看不到测试失败的怪物的统计数据,所以很难看出我可能出错的地方。有人可以帮忙吗? (P.S. 我知道代码可以更整洁,抱歉)
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());
}
【问题讨论】:
-
将
mon1.number = Math.ceil(hitpoints1 / mon1.hitpoints)移到if之外
标签: javascript function object