Java 脚本 - 为什么这个开关大小写语句不起作用?



我是JS的新手,我想做一个关于codewars的作业。这应该是一个石头、剪刀、布的游戏,并返回哪个玩家赢了,或者是否有平局。我尝试使用开关情况下,这个解决方案,但在某些情况下,它返回错误的答案。我知道它可以解决使用if语句,但我很好奇为什么我的解决方案不工作。有人能解释一下吗?提前谢谢你:)

这是我尝试的:

let rps = (p1, p2) => {
switch (p1,p2){
case "scissors" && "paper":
return "Player 1 won!";
break;
case "scissors"&& "rock":
return "Player 2 won!";
break;
case "scissors"&& "scissors":
return "Draw!";
break;
case "paper"&& "paper":
return "Draw!";
break;
case "paper"&& "scissors":
return "Player 2 won!";
break;
case "paper"&& "rock":
return "Player 1 won!";
break;
case "rock"&& "rock":
return "Draw";
break;
case "rock"&& "paper":
return "Player 2 won!";
break;
case "rock" && "scissors":
return "Player 1 won!";
break;
}
};

一个switch语句只接受一个表达式。注意,p1,p2使用逗号运算符,这将导致p2的值。您的case表达式只检查一个表达式。同样,这里的&&运算符将求值为两个操作数中的一个。

你可以做一些事情来减少代码的重复:

  • 这三个单词有不同的首字母,所以你可以让逻辑只看首字母
  • 如果你把这些不同的字母放在一个字符串中,那么你可以使它,如果两个字母是连续的,那意味着第一个玩家赢了。

你可以这样写:

const rps = (p1, p2) => {
if (p1 === p2) return "Draw!";
if ("sprs".includes(p1[0] + p2[0])) return "Player 1 won!";
return "Player 2 won!";
}

使用相同的逻辑,但将其放在一个表达式中:

const rps = (p1, p2) =>
p1 === p2 ? "Draw!" : `Player ${2-"sprs".includes(p1[0] + p2[0])} won!`;

switch只支持一个值。要使用它作为开关,您需要将字符串连接起来。

switch (p1 + p2){
case "scissorspaper":
return "Player 1 won!";
case "scissorsrock":
return "Player 2 won!";
case "scissorsscissors":
return "Draw!";

其他选项是嵌套开关

switch (p1){
case "scissors":
switch (p2){
case "paper":
return "Player 1 won!";
case "rock":
return "Player 2 won!";
case "scissors":
return "Draw!";
case "paper":
....

这不是如何切换的工作原理。Switch查找与给定语句匹配的精确值。

如果你想使用像这样:

const response = (p1, p2) => {
if (p1 === "scissors" && p2 === "paper") {
return "Player 1 won!";
}
// more ifs...
}

或者,如果您坚持使用switch,比较例如string的组合值,如下所示:

const response = (p1, p2) => {
const combination = `${p1}:${p2}`;
switch (combination) {
case "scissors:paper":
return "Player 1 won!";
// ...more cases...
}
}

另外,请注意在返回后不需要中断。Return语句立即退出函数。

开关检查单个条件。但是,您可以交换检查,并在每种情况下对两个参数进行检查,以测试是否为真。

注意,您还应该使用普通函数或const而不是let,除非您想稍后在同一作用域中重新分配rps。此外,return意味着在每个return之后不需要break。而且你没有默认的返回值(呸!)您还可以对结果进行分组,因为fall - through结果都返回并停止大小写匹配。

const rps = (p1, p2) => {
switch (true) {
case p1 === "scissors" && p2 === "scissors":
case p1 === "paper" && p2 === "paper":
case p1 === "rock" && p2 === "rock":
return "Draw!";
case p1 === "scissors" && p2 === "paper":
case p1 === "paper" && p2 === "rock":
case p1 === "rock" && p2 === "scissors":
return "Player 1 won!";
case p1 === "scissors" && p2 === "rock":
case p1 === "paper" && p2 === "scissors":
case p1 === "rock" && p2 === "paper":
return "Player 2 won!";
}
return "Doh!"
};

相关内容

  • 没有找到相关文章

最新更新