使用函数

时间:2015-09-01 12:24:34

标签: javascript

我使用codecademy.com一直在学习JS一段时间,其中一项任务是制作JS摇滚,纸张,剪刀游戏。最后,它要求一些增强功能,比如它是否是一个平局,你如何将它带到你可以再次选择的位置,如果用户输入的内容无效,你将如何解决这个问题。

以下是整个JS游戏,相当小。我只是需要一些帮助,如何通过正确检查第一个参数来使我的函数中的第一个if语句正常工作,如果它是无效的,则提示更新参数而不影响第二个参数。然后重新运行该功能。我的“OR”运算符似乎也没有工作。

此外,我想知道是否有更清晰/更好的方式来编写我的第二个if语句。它工作正常我只是好奇,如果有更好的方法。

谢谢大家的帮助!

var userChoice = prompt("Do you choose rock, paper or scissors?");
var computerChoice = Math.random();
if (computerChoice < 0.34) {
    computerChoice = "rock";
} else if(computerChoice <= 0.67) {
    computerChoice = "paper";
} else {
    computerChoice = "scissors";
} console.log("Computer: " + computerChoice);

var compare = function (choice1, choice2){

    if (choice1 !== "rock" || "scissors" || "paper"){
       choice1 = prompt("Invalid entry, please reenter")}

     if (choice1 === choice2){ 
         var userChoice = prompt("Tie! Choose Again!");
         var computerChoice = Math.random();
         if (computerChoice < 0.34) {
                computerChoice = "rock";
            } else if(computerChoice <= 0.67) {
                computerChoice = "paper";
            } else {
                computerChoice = "scissors";
            } console.log("Computer: " + computerChoice);
     compare(userChoice, computerChoice);


    } else if (choice1 === "rock"){

        if(choice2 === "scissors"){
        return "rock wins";
        }else{
            return "Paper wins"};
    } else if (choice1 === "paper"){
        if (choice2 === "rock"){
            return "paper wins";
        }else { 
            return "scissors win"}
    } else if (choice1 === "scissors"){
        if (choice2 === "rock"){
            return "rock wins"
        }else {
            return "scissors wins"}
    };
};
compare(userChoice, computerChoice);

3 个答案:

答案 0 :(得分:1)

您尝试执行的操作的逻辑不正确。

您需要将if语句的第一行更改为:

if (choice1 !== "rock" || choice1 !== "scissors" || choice1 !== "paper"){

可替换地:

var options = ["rock", "scissors", "paper"];
if (options.indexOf(choice1)==-1){

答案 1 :(得分:1)

我为你做了一点fiddle。看看这段代码:

var validChoices = ['rock', 'paper', 'scissors'];
if (validChoices.indexOf(choice1) == -1){
   hoice1 = prompt("Invalid entry, please reenter")
   compare(choice1, choice2);
}

首先,您说哪些选项有效。如果用户没有给出任何一个,那么您再次要求他做出选择并再次呼叫您的功能,并选择新用户choice1

关于你是否条件:你所做的是以下,或者:

  • choice1 is rock

  • “剪刀”是真的

  • “纸”是真的

由于javascript是弱类型的,因此字符串为true。要正确地与您想要的方式进行比较,请查看Curts答案。

答案 2 :(得分:1)

由于第二次提示必须再次检查,因此建议在循环或外部函数中合并检查。 e.g:

var options = ['rock', 'paper', 'scissors'];

function getUserInput(){
    var txt= "Do you choose rock, paper or scissors?";
    while(true){ //loop until valid input or cancelled
        var res = prompt(txt);
        if(res==null)return null; //user cancelled
        var ind = options.indexOf(res.toLowerCase()); //alter input (in this case only tolowercase, but you could add trimming and such)
        if(ind >=0) return options[ind]; //if valid, return the stored value to be able to have the same value for comparison. You could choose to work with the indices too
        txt = "Invalid entry, please reenter";
    }
}

这也在输入上执行toLowerCase,因此输入为&#39; Rock&#39;或者&#39; ROCK&#39;也是有效的。

为了进一步避免语法差异,您可以使用类似

之类的计算机输入重用options数组
var computerChoice = options[ Math.floor(Math.random() * 3)];

这将使用选项数组中的字符串。 Math.floor(Math.random() * 3)将生成0,1或2的整数,其机会与&lt; 1相同。 0.34等比较。

编辑:无法添加一个示例,说明为什么使用索引本身会很有用。如果选项正确排序,它将使代码能够与下一个元素进行比较(使用模数恢复到第一个元素)来确定获胜者。

var options = ['rock', 'scissors', 'paper']; //ordered such that each value beats the next value (where the last value beats the first)

function getUserInput(txt){
    while(true){ //loop until valid input or cancelled
        var res = prompt(txt || "Do you choose rock, paper or scissors?"); //prompt with a pre defined text or the default text ( || makes sure undefined is replaced with the right hand value)
        if(res==null)return null; //user cancelled
        var ind = options.indexOf(res.toLowerCase()); //alter input (in this case only tolowercase, but you could add trimming and such)
        if(ind >=0) return ind; //if valid, return the index
        txt = "Invalid entry, please reenter";
    }
}


function runGame(promptText){
    var userChoice = getUserInput(promptText);
    if(userChoice===null)return; //user cancelled
    var computerChoice = Math.floor(Math.random() * 3); //generates a random number of 0,1 or 2 
    console.log("Computer: " + options[computerChoice]);

    if(userChoice === computerChoice)
        return runGame("Tie! Choose Again!"); //in case of Tie, start over with the prompText of Tie

    if(userChoice === (computerChoice + 1) % 3)   //the next value: +1 the % 3 (modulo 3) returns the remainder if the '+1' value is divided by 3 and thus turns 3 into 0   
        return options[computerChoice] + ' beats ' + options[userChoice]  + ' (Computer wins)';        
    return options[userChoice] + ' beats ' + options[computerChoice]  + ' (User wins)';        

}

var res = runGame();
if(res)
   alert(res);

Fiddle