javascript 函数似乎是正确的,但是
javascript function seems correct, yet
我正在尝试解决 Pokemon Damage Calculator 套路,但我找不到我的代码的问题
这是我的代码:
function calculateDamage(yourType, opponentType, attack, defense) {
let damage = 0;
const effArr = [
["fire", "grass", 2],
["grass", "fire", 0.5],
["fire", "water", 0.5],
["water", "fire", 2],
["fire", "electric", 1],
["water", "grass", 0.5],
["grass", "water", 2],
["water", "electric", 0.5],
["electric", "water", 2]
["grass", "electric", 1]
];
for (i = 0; damage == 0 && i < effArr.length; i++) {
// console.log(effArr[i].indexOf(yourType) == 0, effArr[i].indexOf(opponentType) === 1, damage)
if (effArr[i].indexOf(yourType) == 0 && effArr[i].indexOf(opponentType) == 1) {
damage = (50 * effArr[i][2] * attack / defense)
}
}
return damage;
}
这是预期的结果:
calculateDamage("fire", "water", 100, 100) => 25
calculateDamage("grass", "water", 100, 100) => 100
calculateDamage("electric", "fire", 100, 100) => 50
calculateDamage("grass", "electric", 57, 19) => 150
但我得到:
calculateDamage("fire", "water", 100, 100) => true false 0
calculateDamage("grass", "water", 100, 100) => false false 0
calculateDamage("electric", "fire", 100, 100) => true true 0
calculateDamage("grass", "electric", 57, 19) => false false 0
我认为如果您使用对象而不是数组,您可以更有效地解决这个问题 - 这样,您不必使用循环来搜索您的值,而只需使用 yourType
和 opponentType
作为 Property accessors 以获得类型有效性
此外,您原来的 Array 方法缺少一些类型对,我认为您错过了 kata 描述的部分 "any type against itself is not very effective" - 所以我稍微修改了此数据
function calculateDamage(yourType, opponentType, attack, defense) {
const matchups = {
fire: {fire: 0.5, water: 0.5, grass: 2.0, electric: 1.0},
water: {fire: 2.0, water: 0.5, grass: 0.5, electric: 0.5},
grass: {fire: 0.5, water: 2.0, grass: 0.5, electric: 1.0},
electric: {fire: 1.0, water: 2.0, grass: 1.0, electric: 0.5}
};
let effectiveness = matchups[yourType][opponentType];
return 50 * (attack / defense) * effectiveness;
}
console.log(`("fire", "water", 100, 100) => ${calculateDamage("fire", "water", 100, 100)}`)
console.log(`("grass", "water", 100, 100) => ${calculateDamage("grass", "water", 100, 100)}`)
console.log(`("electric", "fire", 100, 100) => ${calculateDamage("electric", "fire", 100, 100)}`)
console.log(`("grass", "electric", 57, 19) => ${calculateDamage("grass", "electric", 57, 19)}`)
但是,如果您希望您的方法起作用,则需要为 electric
填写缺失的条目,并处理数组倒数第二个条目中缺失的 ,
。
然后,你只需要添加一个默认的effectiveness
值,当你有相同类型的比赛时使用;因为这些不会在您当前的循环中被捕获,因为 .indexOf()
将 return 找到 第一个 匹配项。为了让这个回退工作,你的 for 循环中的匹配现在直接 returned,最后的 return 是默认 effectiveness
的回退
function calculateDamage(yourType, opponentType, attack, defense) {
let damage = 0;
let effectiveness = 0.5; // Default value, used for same type matchups
const effArr = [
["fire", "fire", 0.5],
["fire", "water", 0.5],
["fire", "grass", 2],
["fire", "electric", 1],
["water", "fire", 2],
["water", "water", 0.5],
["water", "grass", 0.5],
["water", "electric", 0.5],
["grass", "fire", 0.5],
["grass", "water", 2],
["grass", "grass", 0.5],
["grass", "electric", 1],
["electric", "fire", 1],
["electric", "water", 2],
["electric", "grass", 1],
["electric", "electric", 0.5]
];
for (i = 0; damage == 0 && i < effArr.length; i++) {
if (effArr[i].indexOf(yourType) == 0 && effArr[i].indexOf(opponentType) == 1) {
return (50 * effArr[i][2] * attack / defense)
}
}
return (50 * effectiveness * attack / defense);
}
console.log(`("fire", "water", 100, 100) => ${calculateDamage("fire", "water", 100, 100)}`)
console.log(`("grass", "water", 100, 100) => ${calculateDamage("grass", "water", 100, 100)}`)
console.log(`("electric", "fire", 100, 100) => ${calculateDamage("electric", "fire", 100, 100)}`)
console.log(`("grass", "electric", 57, 19) => ${calculateDamage("grass", "electric", 57, 19)}`)
我正在尝试解决 Pokemon Damage Calculator 套路,但我找不到我的代码的问题
这是我的代码:
function calculateDamage(yourType, opponentType, attack, defense) {
let damage = 0;
const effArr = [
["fire", "grass", 2],
["grass", "fire", 0.5],
["fire", "water", 0.5],
["water", "fire", 2],
["fire", "electric", 1],
["water", "grass", 0.5],
["grass", "water", 2],
["water", "electric", 0.5],
["electric", "water", 2]
["grass", "electric", 1]
];
for (i = 0; damage == 0 && i < effArr.length; i++) {
// console.log(effArr[i].indexOf(yourType) == 0, effArr[i].indexOf(opponentType) === 1, damage)
if (effArr[i].indexOf(yourType) == 0 && effArr[i].indexOf(opponentType) == 1) {
damage = (50 * effArr[i][2] * attack / defense)
}
}
return damage;
}
这是预期的结果:
calculateDamage("fire", "water", 100, 100) => 25
calculateDamage("grass", "water", 100, 100) => 100
calculateDamage("electric", "fire", 100, 100) => 50
calculateDamage("grass", "electric", 57, 19) => 150
但我得到:
calculateDamage("fire", "water", 100, 100) => true false 0
calculateDamage("grass", "water", 100, 100) => false false 0
calculateDamage("electric", "fire", 100, 100) => true true 0
calculateDamage("grass", "electric", 57, 19) => false false 0
我认为如果您使用对象而不是数组,您可以更有效地解决这个问题 - 这样,您不必使用循环来搜索您的值,而只需使用 yourType
和 opponentType
作为 Property accessors 以获得类型有效性
此外,您原来的 Array 方法缺少一些类型对,我认为您错过了 kata 描述的部分 "any type against itself is not very effective" - 所以我稍微修改了此数据
function calculateDamage(yourType, opponentType, attack, defense) {
const matchups = {
fire: {fire: 0.5, water: 0.5, grass: 2.0, electric: 1.0},
water: {fire: 2.0, water: 0.5, grass: 0.5, electric: 0.5},
grass: {fire: 0.5, water: 2.0, grass: 0.5, electric: 1.0},
electric: {fire: 1.0, water: 2.0, grass: 1.0, electric: 0.5}
};
let effectiveness = matchups[yourType][opponentType];
return 50 * (attack / defense) * effectiveness;
}
console.log(`("fire", "water", 100, 100) => ${calculateDamage("fire", "water", 100, 100)}`)
console.log(`("grass", "water", 100, 100) => ${calculateDamage("grass", "water", 100, 100)}`)
console.log(`("electric", "fire", 100, 100) => ${calculateDamage("electric", "fire", 100, 100)}`)
console.log(`("grass", "electric", 57, 19) => ${calculateDamage("grass", "electric", 57, 19)}`)
但是,如果您希望您的方法起作用,则需要为 electric
填写缺失的条目,并处理数组倒数第二个条目中缺失的 ,
。
然后,你只需要添加一个默认的effectiveness
值,当你有相同类型的比赛时使用;因为这些不会在您当前的循环中被捕获,因为 .indexOf()
将 return 找到 第一个 匹配项。为了让这个回退工作,你的 for 循环中的匹配现在直接 returned,最后的 return 是默认 effectiveness
function calculateDamage(yourType, opponentType, attack, defense) {
let damage = 0;
let effectiveness = 0.5; // Default value, used for same type matchups
const effArr = [
["fire", "fire", 0.5],
["fire", "water", 0.5],
["fire", "grass", 2],
["fire", "electric", 1],
["water", "fire", 2],
["water", "water", 0.5],
["water", "grass", 0.5],
["water", "electric", 0.5],
["grass", "fire", 0.5],
["grass", "water", 2],
["grass", "grass", 0.5],
["grass", "electric", 1],
["electric", "fire", 1],
["electric", "water", 2],
["electric", "grass", 1],
["electric", "electric", 0.5]
];
for (i = 0; damage == 0 && i < effArr.length; i++) {
if (effArr[i].indexOf(yourType) == 0 && effArr[i].indexOf(opponentType) == 1) {
return (50 * effArr[i][2] * attack / defense)
}
}
return (50 * effectiveness * attack / defense);
}
console.log(`("fire", "water", 100, 100) => ${calculateDamage("fire", "water", 100, 100)}`)
console.log(`("grass", "water", 100, 100) => ${calculateDamage("grass", "water", 100, 100)}`)
console.log(`("electric", "fire", 100, 100) => ${calculateDamage("electric", "fire", 100, 100)}`)
console.log(`("grass", "electric", 57, 19) => ${calculateDamage("grass", "electric", 57, 19)}`)