【问题标题】:Can't get out of my while loop (Javascript)无法摆脱我的 while 循环(Javascript)
【发布时间】:2014-09-05 00:32:43
【问题描述】:

作为完成代码学院课程后的第一个项目,我正在制作一个石头/纸/剪刀游戏,但我看不出我的循环哪里出了问题。

while (userChoice !== "ROCK" | "PAPER" | "SCISSORS" | "LIZARD" | "SPOCK") {
    var userChoice = prompt("Invalid choice. Please pick ROCK, PAPER, SCISSORS, LIZARD or SPOCK.");
    var userChoice = userChoice.toUpperCase();
}

抱歉,如果它是平凡的。

【问题讨论】:

  • 你试过“break”语句吗?
  • 另外,如果我错了,请纠正我,但这不是你做多个条件的方式,你必须明确地说 userChoice != "rock" && userChoice != "scissors" 等等......

标签: javascript while-loop


【解决方案1】:
userChoice !== "ROCK" | "PAPER" | "SCISSORS" | "LIZARD" | "SPOCK"

应该是

userChoice !== "ROCK" && userChoice !== "PAPER" && userChoice !== "SCISSORS" && userChoice !== "LIZARD" && userChoice !== "SPOCK"

现在它本质上是检查 userChoice !== 0 的整个右侧是否是一个表达式并且计算结果为 0。

在 javascript 中,| 本身就是按位或。由于按位运算仅对整数有意义,因此您的字符串会转换为整数,因此您基本上是在做 0 | 0,这将是 0。

您可能在想||,这是一个逻辑或,我可以看到您会如何想“如果 userChoice 不是石头或纸或剪刀”,但同样,它不是如何工作的。您必须检查 userChoice 是否不是 Rock,并且 userChoice 不是 Scissors。

如果您想查看 userChoice 是否为摇滚,或者 userChoics 是否为剪刀等,您可以使用 ||

根据 cmets,您可以通过执行以下操作大大提高代码的可读性:

var choices = ["ROCK", "PAPER", "SCISSORS", "LIZARD", "SPOCK"];    
while(choices.indexOf(userChoice) == -1) {
     userChoice = prompt("Invalid choice. Please pick one of: " + 
                         choices.join(" ").toUpperCase());
}

另外,只是添加我个人最喜欢的javascript技巧,你可以改变

while(choices.indexOf(userChoice) == -1)

while(!~choices.indexOf(userChoice))

【讨论】:

  • 他们不应该在while循环中从var userChoice中删除var吗?
  • 您可以使用 switch 语句来代替所有与 && 的链式比较。或者你可以这样做:while (["ROCK","PAPER","SCISSORS","LIZARD","SPOCK"].indexOf(userChoice) < 0)
  • @DanKorn - 或者我最喜欢的:if (!~["ROCK","PAPER","SCISSORS","LIZARD","SPOCK"].indexOf(userChoice))
  • 有点跑题了,但为了干燥和可读性,我会这样做:var choices = ["ROCK", "PAPER", "SCISSORS", "LIZARD", "SPOCK"]; while(choices.indexOf(userChoice) == -1) 编辑:呵呵,我们都有同样的挑剔。
  • 如果你想关注 DRY(不要重复自己),你可以这样做:var choices = ["ROCK", "PAPER", "SCISSORS", "LIZARD", "SPOCK"]; while(choices.indexOf(userChoice) == -1) userChoice = prompt("Invalid choice. Please pick one of: " + choices).toUpperCase();
【解决方案2】:

或者如果你想使用类似 not in 的东西,你可以像这样创建一个对象:

var choice = {ROCK:{}, PAPER:{}, SCISSORS:{}, LIZARD:{}, SPOCK:{}};

然后将while语句修改为:

while (!(userChoice in choice))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2014-03-28
    • 2022-12-02
    • 2013-06-20
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多