我正在做一个 JS 练习,它基本上是一个函数,可以进行石头、剪刀、布的比赛,并根据哪个玩家拥有什么来宣布获胜者。现在我已经有了一个完全可以工作的程序:
const rps = (p1, p2) => {
var r = "rock";
var p = "paper";
var s = "scissors";
if(p1 == r && p2 == s || p1 == s && p2 == p || p1 == p && p2 == r){
return "Player 1 won!";
}
else if (p1 == s && p2 == r || p1 == p && p2 == s || p1 == r && p2 == p){
return "Player 2 won!";
}
else if (p1 === p2){
return "Draw!";
}
};
console.log(rps("rock","scissors"));
我知道这不是很漂亮,但是我仍在学习诀窍。因此,考虑到这一点,我想知道是否有一种方法可以通过执行类似这样的操作来使代码更加干燥:
const rps = (p1, p2) => {
var r = "rock";
var p = "paper";
var s = "scissors";
if ((r,s) || (s,p) || (p,r)){
return "Player 1 won!";
}
else if((s,r) || (p,s) || (r,p)){
return "Player 2 won!";
}
else if (p1 === p2){
return "Draw";
}
};
console.log(rps("rock","scissors"));
在比较过程中它将获取变量并使用函数参数作为指定点。我已经运行了上面的脚本,并且非常惊讶它实际上返回了任何内容,我认为它会抛出错误。但是...无论我在函数调用中使用什么字符串(即使在测试平局时),它总是返回“玩家 1 获胜”。
是否可以做类似的事情,或者我在这里偏离基地了吗?
===编辑===
我想在这里添加我的速度测试结果以便更好地阅读。正如我在下面的评论中提到的,我对每个脚本进行了 3 轮 10 万次测试,并通过 console.time() 返回完成时间
如果有人好奇的话,这是我的测试循环:
console.time("speed test");
for (var i = 1; i < 100000; i++) {
rps("scissors","scissors");
}
console.timeEnd("speed test");
===更新===
在我的机器(WAMP 服务器)而不是 Cloud9 的终端上进行本地测试,速度要好得多:
以下是(“rock, paper”)的结果:
Cloud9
if/else script --> 4.091ms, 4.228ms, 4.698ms
case script --> 24.844ms, 31.974ms, 20.763ms
table script --> 68.934ms, 86.619ms, 51.805ms
Local
if/else script --> 4.412ms, 4.160ms, 4.374ms
case script --> 6.347ms, 5.551ms, 5.478ms
table script --> 18.093ms, 18.664ms, 19.065ms
以下是(“scissors”、“scissors”)的结果:
Cloud9
if/else script --> 4.351ms, 4.214ms, 5.023ms
case script --> 28.387ms, 19.079ms, 29.333ms
table script --> 62.740ms, 59.410ms, 70.401ms
Local
if/else script --> 5.743ms, 5.262ms, 4.858ms
case script --> 5.685ms, 6.447ms, 4.503ms
table script --> 27.116ms, 25.780ms, 24.467ms
从性能 Angular 来看,if/else 和 case 方法至少在本地速度上非常接近。
最佳答案
是否可能:是,你是否偏离基地:否。
这是一个经典的矩阵数学设置。最酷的部分是您尝试使用 if
语句以错误的方式定义了矩阵。如果您查看 if 语句,您会发现组合就在您眼前。好消息是,这个确实很容易合理化,因为事实证明我们需要处理的只是一个非常小的笛卡尔坐标系。基于您上面定义的坐标系位于下面的代码示例中。运行示例以查看该表。
该代码由简单的查找表组成。
- 确定每个玩家工具的值(数组索引[0,1,2])
- 将它们组合成一个字符串,例如“01”或“20”
- 玩家 1 的号码始终是第一位,并以 02、21 和 10 获胜
- 将它们转换为整数(这就是 + 号的作用)
- 在我们的查找表中找到结果整数。 4.
我希望这是有启发性和有帮助的,而不是指导解决方案。
function RPS(p1Tool, p2Tool) {
const tools = ["rock", "paper", "scissors"];
const p1Wins = [2,21,10];
const p2Wins = [20,12,1];
const draw = [0,11,22];
// p1Tool = 'rock' returns 0, p2Tool = 'scissors' returns 2
const winner = +(tools.indexOf(p1Tool) + tools.indexOf(p2Tool));
// look up the results in our matrixes
return (p1Wins.includes(winner))
? 'Player 1'
: (p2Wins.includes(winner))
? 'Player 2'
: 'No One';
}
let winner = RPS('rock', 'scissors');
alert(winner + ' wins!');
<TABLE border="1">
<TH></TH><TH>R(0)</TH><TH>P(1)</TH><TH>S(2)</TH>
<TR ALIGN="CENTER">
<TD>R(0)</TD>
<TD>D</TD>
<TD>P</TD>
<TD>R</TD>
</TR>
<TR ALIGN="CENTER">
<TD>P(1)</TD>
<TD>P</TD>
<TD>D</TD>
<TD>S</TD>
</TR>
<TR ALIGN="CENTER">
<TD>S(2)</TD>
<TD>R</TD>
<TD>S</TD>
<TD>D</TD>
</TR>
</TABLE>
<span>Think Cartesian Coordinates</span>
关于javascript - 在 if/else 语句中引用函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49080849/