我是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!"
};