if / else语句中的引用函数参数?

时间:2018-03-03 05:02:02

标签: javascript function if-statement comparison

我正在进行一项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赢了"无论我在函数调用中使用什么字符串(即使在测试绘图时)。

是否可以做类似的事情,或者我离开这里?

===编辑===

我想在这里添加我的速度测试结果以便更好地阅读。正如我在下面的评论中提到的,我测试了每个脚本100k次3轮并通过console.time返回完成时间()

如果有人好奇的话,我的测试循环在这里:

console.time("speed test");

for (var i = 1; i < 100000; i++) {
    rps("scissors","scissors");
}

console.timeEnd("speed test");

=== UPDATE ===

在我的机器(WAMP服务器)本地测试,而不是Cloud9的终端,速度更好:

以下是(&#34;摇滚,纸张和#34;)的结果:

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

以下是(&#34;剪刀&#34;,&#34;剪刀&#34;)的结果:

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

在性能方面,似乎if / else和case方法的速度至少在本地非常接近。

3 个答案:

答案 0 :(得分:1)

是否有可能:,您是否偏离基地:

这是经典的Matrix数学设置。最酷的部分是您通过尝试if语句以错误的方式定义了Matrix。如果你查看if语句,你会发现组合就出现了。好消息是,这个很容易合理化,因为事实证明我们所要处理的只是一个非常小的笛卡尔坐标系。基于您的定义的坐标系在下面的代码示例中。运行示例以查看该表。

代码由简单的查找表组成。

  1. 确定每个玩家工具的值(数组索引[0,1,2])
  2. 将它们组合成一个字符串,如&#34; 01&#34;或&#34; 20&#34;
    • Player1的号码永远是第一名,并以02,21&amp; 10
  3. 将它们转换为整数(+符号的作用)
  4. 在查找表中查找结果整数。 4。
  5. 我希望这是有益的,有帮助的,而不是指导解决方案。

    &#13;
    &#13;
    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!');
    &#13;
    <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>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

这是一个我认为非常简单的解决方案(对不起,如果格式不完美):

<html>

<script language=javascript>

    const r = 1;
    const p = 10;
    const s = 100;

function rps (p1, p2) {
//alert (p1);
//alert (p2);
var num = Math.abs(p1 - p2);  // rock wins when the difference is 99
alert (num);                  // scissors when it is 90
                              // paper when it is 9
 switch (num) {
     case 9:
         // Paper wins!
         alert ("Paper wins!");
          break;
     case 90:
         // Scissors wins!
         alert ("Scissors wins!");
         break;
     case 99:
         // Rock wins!
         alert ("Rock wins!");
         break;
     default:
         // It is a tie!
         alert ("It is a tie!");
         break;
     }
}

function runit() {
    //alert (r);
    //alert (p);
    //alert (s);
    rps(r,p);
    rps(p,r);
    rps(r,s);
    rps(s,r);
    rps(p,s);
    rps(s,p);
    rps(r,r);
    rps(p,p);
    rps(s,s);
} 

</script>

<body onload="runit()">
been so long

</body>

</html>

答案 2 :(得分:0)

在第二个例程中,您甚至不会使用传入的变量来确定它们是什么。除了它产生的结果之外,你怎么期望它确定任何东西,你根本不理解为什么它会产生它。 (r,s)并且可能所有相似的条件都评估为'true'可能只是因为它们不是零,并且一旦你有'true'它就会踢出来,所以它每次都会这样。