我正在上一门代码学院课程(找到here),但一直告诉我“当输入是纸质和摇滚时,您的代码返回的是“岩胜”,而不是“纸胜””,为什么呢?应该是正确的。因为它在谈论“摇滚胜利”,所以它在谈论摇滚与剪刀。那么,为什么在“摇滚胜利”的唯一结果中根本没有涉及纸张的情况下,为什么说“代替纸面胜利”呢?
var compare = function (choice1, choice2) {
if (choice1 === choice2) {
return("The result is a tie!");
}
if (choice1 === "rock") {
if (choice2 === "scissors");
} else {
return ("rock wins");
}
if (choice1 === "paper") {
if (choice2 === "rock");
} else {
return ("paper wins");
}
if (choice1 === "paper") {
if (choice2 === "scissors");
} else {
return ("scissors wins");
}
};
最佳答案
看你的第一个条件:
if (choice1 === "rock") {
if (choice2 === "scissors");
} else {
return ("rock wins");
}
因此,如果
choice1
是石头,则输入if
块(实际上不返回任何内容,但是由于在这种情况下choice1
实际上是"paper"
,因此进入else
块,这是无条件的返回"rock wins"
。尝试将其重构为如下形式:if (choice1 === choice2) {
return("The result is a tie!");
}
if (choice1 === "rock") {
if (choice2 === "scissors") {
return ("rock wins");
} else {
return ("paper wins");
}
}
if (choice1 === "paper") {
if (choice2 === "rock") {
return ("paper wins");
} else {
return ("scissors wins");
}
}
if (choice1 === "paper") {
if (choice2 === "scissors") {
return ("scissors wins");
} else {
return ("rock wins");
}
}
但是,让我们开始幻想吧。尝试将选择放入数组中:
var choices = ["rock", "paper", "scissors"];
现在,请注意,右边的项目总是比左边的项目好(如果我们认为数组会环绕)。我们如何使用它来简化代码?好了,我们可以比较每个选择的索引,注意处理剪刀和岩石的边缘情况:
var x = choices.indexOf(choice1),
y = choices.indexOf(choice2);
if (x === y) {
return("The result is a tie!");
} else if (x > y) {
if (x == 3 && y == 0) {
return choice2 + " wins";
} else {
return choice1 + " wins";
}
} else {
return choice2 + " wins";
}
但是我们可以在这里使用remainder operator(
%
)来更容易地处理边缘情况:var choices = ["rock", "paper", "scissors"];
var compare = function (choice1, choice2) {
var x = choices.indexOf(choice1),
y = choices.indexOf(choice2);
if (x === y) {
return("The result is a tie!");
}
return (((x - y) % 3) > 0 ? choice1 : choice2) + " wins";
}
关于javascript - JavaScript中的石头,纸,剪刀,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20961119/