JavaScript中的石头、纸、剪刀

Rock, Paper, Scissors in JavaScript

本文关键字:剪刀 石头 JavaScript      更新时间:2023-09-26

我正在制作我的第一款游戏(Rock Paper Sisors),遇到了一个问题,当userChoice剪刀,而computerChoiceock时,程序无法将获胜者作为Rock返回。我可以让程序给我任何其他组合的获胜者。

我在这里有我的代码:

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";
}
var compare = function(choice1, choice2) {
    if(choice1 === choice2) {
    return "The result is a tie!";
}
if(choice1 === "rock") {
    if(choice2 === "scissors") {
        return "rock wins";
    } else {
        return "paper wins";
    }
}
if(choice1 === "paper") {
    if(choice2 === "rock") {
        return "paper wins";
    } else {
        if(choice2 === "scissors") {
            return "scissors wins";
    }
}
if(choice1 === "scissors") {
    if(choice2 === "rock") {
        return "rock wins";
    } else {
        if(choice2 === "paper") {
            return "scissors wins";
        }
    }
}
}
};
console.log("User Choice: " + userChoice);
console.log("Computer Choice: " + computerChoice);
compare(userChoice, computerChoice);

需要研究的内容:

var choices = ["rock", "paper", "scissors"];
var map = {};
choices.forEach(function(choice, i) {
    map[choice] = {};
    map[choice][choice] = "Was a tie"
    map[choice][choices[(i+1)%3]] = choices[(i+1)%3] + " wins"
    map[choice][choices[(i+2)%3]] = choice + " wins"
})
function compare(choice1, choice2) {
    return (map[choice1] || {})[choice2] || "Invalid choice";
}

这是一个适用于扩展集的替代方案。我们的假设是,在对手的总数中,有奇数种可能性,从任何一个给定点开始,从我们的给定点向前看(当我们到达终点时),上半场将战胜给定点,下半场将输。

或者用另一种方式来描述它是,在我们给定点之前剩下的一半对手会输,接下来的一半会赢。

因此,choices阵列中的正确顺序至关重要。

var choices = ["rock", "spock", "paper", "lizard", "scissors"];
var map = {};
choices.forEach(function(choice, i) {
    map[choice] = {};
    for (var j = 0, half = (choices.length-1)/2; j < choices.length; j++) {
        var opposition = (i+j)%choices.length
        if (!j)
            map[choice][choice] = "Was a tie"
        else if (j <= half)
            map[choice][choices[opposition]] = choices[opposition] + " wins"
        else
            map[choice][choices[opposition]] = choice + " wins"
    }
})
function compare(choice1, choice2) {
    return (map[choice1] || {})[choice2] || "Invalid choice";
}

您无法看到问题,很可能是因为代码缩进不好。正确缩进问题很清楚:

if (choice1 === "paper") {
    if (choice2 === "rock") {
        return "paper wins";
    } else {
        if (choice2 === "scissors") {
            return "scissors wins";
        }
    }
    if (choice1 === "scissors") {
        if (choice2 === "rock") {
            return "rock wins";
        } else {
            if (choice2 === "paper") {
                return "scissors wins";
            }
        }
    }
}

您的if (choice1 === "scissors") {if (choice1 === "paper") {内。内的代码将永远无法访问。

我提出了一个替代方案,它应该易于理解,并避免代码中的一些问题,如过度重复和固定选择。因此,它更灵活,更易于维护。

function compare(choice1, choice2) {
    choice1 = choices.indexOf(choice1);
    choice2 = choices.indexOf(choice2);
    if (choice1 == choice2) {
        return "Tie";
    }
    if (choice1 == choices.length - 1 && choice2 == 0) {
        return "Right wins";
    }
    if (choice2 == choices.length - 1 && choice1 == 0) {
        return "Left wins";
    }
    if (choice1 > choice2) {
        return "Left wins";
    } else {
        return "Right wins";
    }
}

选择是CCD_ 4。你可以看到一个演示。


为了将解决方案推广到更大的列表,这种模技术可能会有所帮助:

function mod(a, b) {
    c = a % b
    return (c < 0) ? c + b : c
}

然后编写比较代码就容易多了:

function compare(choice1, choice2) {
    x = choices.indexOf(choice1);
    y = choices.indexOf(choice2);
    if (x == y) {
        return "Tie";
    }
    if (mod((x - y), choices.length) < choices.length / 2) {
        return choice1 + " wins";
    } else {
        return choice2 + " wins";
    }
}

相应的jsFiddle。

这么多if语句。它们令人困惑。

此外,所有这些if语句都会锁定游戏并使其变得困难为另一个游戏重新使用该逻辑。

function referee(){
    var training = {};
    function learn(winner,loser){
        if (!training[winner]) training[winner] = {};
        training[winner][loser]=1;
    }
    function judge(play1,play2){
        if (play1 === play2){ return 'tie'; }
        return ( (training[play1][play2] === 1)? play1: play2 )+' wins!';
    }
    function validate(choice) {
        return choice in training;
    }
    function choices() {
        return Object.keys(training);
    }
    return {
        'learn': learn,
        'judge': judge,
        'validAction': validate,
        'getChoices': choices
    };
}
var ref = referee();
ref.learn('rock','scissors');
ref.learn('paper','rock');
ref.learn('scissors','paper');
do {
    var userChoice = prompt("Do you choose rock, paper or scissors?");
} while(!ref.validAction(userChoice))
var choices = ref.getChoices(),
    computerChoice = choices[Math.floor(Math.random()*choices.length)];
console.log("User Choice: " + userChoice);
console.log("Computer Choice: " + computerChoice);
console.log(ref.judge(userChoice, computerChoice));

您有一个不匹配的大括号:

if(choice1 === "paper") {
    if(choice2 === "rock") {
        return "paper wins";
    } else {
        if(choice2 === "scissors") {
            return "scissors wins";
    }
}

实际上,我会删除该块中的最后一个if,你不需要它。最后一个块(choice1 === "scissors")是正确的,但如果不需要,请再次删除最后一个。

为了向您展示为什么它以这种特定的方式失败,我重新缩进了代码的相关部分,以说明它是如何被解释的:

if(choice1 === "paper") {
    if(choice2 === "rock") {
        return "paper wins";
    } else {
        if(choice2 === "scissors") {
            return "scissors wins";
        }
    }
    if(choice1 === "scissors") {
        if(choice2 === "rock") {
            return "rock wins";
        } else {
            if(choice2 === "paper") {
                return "scissors wins";
            }
        }
    }
}

试试这个:

var UserChoice = window.prompt("Do you choose rock, paper or scissors ?");
var computChoice = Math.random();
var computChoice = computChoice < 0.34 ? "rock" : ( computChoice > 0.67 ? "scissors" : "paper" ) ;
var mess = { 
  rock : { scissors : 'You Win!, Rock smashes scissors!', paper : 'You lose!, Paper covers rock!'} ,
  paper : { rock : 'You Win!, Paper covers rock!', scissors : 'You lose!, Scissors cut paper!' },
  scissors : { paper : 'You Win!, Scissors cut paper!', rock : 'You lose!, Rock smashes scissors!' }
}
if ( computChoice === UserChoice)
  result = "It's a tie!" ; 
	 
else if ( UserChoice !== "rock" && UserChoice !== "paper" && UserChoice !== "scissors" )
  result = "Invalid choice! Choose from rock, paper, or scissors" ;
else
  result = mess[UserChoice][computChoice] ;
console.log( 'you chose ' + UserChoice + ' and computer chose ' + computChoice + ' ( ' + result + ' ) ') ;

我就是这样做的:


    //player choice
    var playerChoice = prompt("What is your choice of weapon: rock, paper, or scissors?");
    
    //Computer Choice
    var computerChoice = Math.ceil(Math.random() *3);
    
    //variables as numbers
    if (computerChoice < 1) {
        computerChoice = "rock";
    } else if(1 <= computerChoice <= 2) {
        computerChoice = "paper";
    } else {
        computerChoice = "scissors";
    }
    
    
    //defining function
    function game(playerChoice, computerChoice){
    
    //Checking for a tie
    if (playerChoice === computerChoice) {
          return "It is a tie";
        }
    
        //Check for Rock
        if (playerChoice === "rock") {
          if (computerChoice === "scissors") {
            return "Player Wins";
          } else {
            return "Computer Wins";
          }
        }
        //Check for Paper
        if (playerChoice === "paper") {
          if (computerChoice === "scissors") {
            return "Computer Wins";
          } else {
            return "Player Wins";
          }
        }
        //Check for Scissors
        if (playerChoice === "scissors") {
          if (computerChoice === "rock") {
            return "Computer Wins";
          } else {
                    return "Player Wins";
          }
        }
    }
    
    //start the game function
    game();
    //print winner
    console.log(game(playerChoice, computerChoice))

我选择了我的电脑选择是随机的,整数,0-3,但你可以去掉那部分。

我开始工作了:

function playFunction() {
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";
}
var compare = function(choice1, choice2) {
    if(choice1 === choice2) {
      alert("The result is a tie!");
}
if(choice1 === "rock") {
    if(choice2 === "scissors") {
        alert("rock wins");
    } else {
        alert("paper wins");
    }
}
if(choice1 === "paper") {
    if(choice2 === "rock") {
        alert("paper wins");
    } else {
        if(choice2 === "scissors") {
            alert("scissors wins");
    }
}
if(choice1 === "scissors") {
    if(choice2 === "rock") {
        alert("rock wins");
    } else {
        if(choice2 === "paper") {
           alert("scissors wins");
        }
    }
}
}
};
console.log("User Choice: " + userChoice);
console.log("Computer Choice: " + computerChoice);
compare(userChoice, computerChoice)
} 

我所改变的只是没有返回一条消息,而是弹出一条带有答案的警报。我还将其放入一个函数中,该函数可以在单击HTML按钮时调用。

没有所有{}和else if 的示例

如果可以的话,总是使用else。。由于你的if语句是不同的情况,并且只有一个适用,你应该使用else-if..

如果条件后面只有1个语句,则使用if语句(下面的条件1)。。即使你有一个if…else if…block语句,它也被认为是一个语句。。(以下条件2)。。但是如果它有帮助,你可以在if…else if…block语句周围使用它们来帮助你更好地理解它。。(以下条件3)。。

也不要使用===,除非你真的知道它的作用。。这会给你新手带来麻烦。。默认情况下使用==。。

if(choice1 == choice2)  //condition 1
    return "The result is a tie!";
else if(choice1 == "rock") //condition 2
    if(choice2 == "scissors") 
        return "rock wins";
     else 
        return "paper wins";
else if(choice1 == "paper"){ //condition 3
    if(choice2 == "rock") 
        return "paper wins";
     else 
        return "scissors wins";
}
else if(choice1 == "scissors")
    if(choice2 == "rock")
       return "rock wins";
    else 
       return "scissors wins";
var userChoice = prompt("Do you choose rock, paper or scissors? ");

var computerChoice=Math.random();
{

if(computerChoice <= ".33") 
{
    computerChoice === 'rock';

    }

    else if(computerChoice<='.66' & '>=.34')

    {
computerChoice === 'paper';

        }
        else
{
            computerChoice ===' scissors';

            }

            }

console.log( computerChoice);
var compare = function (choice1, choice2)
{
    if (choice1 === choice2)
    {
        return "The result is a tie!";
    }
    else
    {
        if(choice1 === "rock")
        {
            if(choice2 === "paper")
            {
               return "Paper beats rock. Computer Wins.";
            }
            else
            {
                return "Rock beats scissors. You win.";
            }
        }
        else
        {
            if(choice1 === "paper")
                {
                     if(choice2 === "rock")
                        {
                             return "Paper beats rock. You Win.";
                        }
            else
                {
                return "Scissors beat paper. Computer Wins.";               }
                }
    if(choice1 === "scissors")
                {
                     if(choice2 === "rock")
                        {
                             return "Rock beats scissors. Computer Wins.";
                        }
            else
                {
                return "Scissors beat paper. You Win.";               }
                }
        }
    }

};
var r = function(user)
{
    while(user < 0 | user >3)
    {user = prompt("Please don't act oversmart. Press '1' for rock, '2' for paper, and '3' for scissors.");
    }
    if(user === "1")
    user = "rock";
    else
    {
        if(user === "2")
        {user = "paper";}
        else
        {user = "scissors";}
    };
    console.log("You chose: " + user);
    computerChoice = Math.random()
    if(computerChoice <= 0.33)
    {
        computerChoice = "rock";
    }
    else
    {
        if(computerChoice > 0.33 && computerChoice <=0.66)
        {computerChoice = "paper";}
        else
        {computerChoice = "scissors";}
    }
    console.log("The computer chose: "+computerChoice)
    console.log(compare(user, computerChoice));
    if(user===computerChoice)
    {
        userChoice = user;
        return "1";}
};

var userChoice = prompt("Press '1' for rock, '2' for paper, and '3' for scissors")
var computerChoice;
var a = r(userChoice);
if(a === "1")
{//console.log("1");
while(userChoice === computerChoice)
{
    var a = prompt("Since there was a tie, please choose again. Press 1 for rock, 2 for paper and 3 for scissors.")
    var b = r(a);
    if(b !== "1")
    {break;}
}
}

这将创造一个完美的、自我重复的游戏,直到有人获胜。它还显示你玩了多少游戏。全部不使用循环!

count = 1;
var Decisions = function() {
    if (count === 1) {
        userChoice = prompt("Do you choose rock, paper or scissors?");
    } else {
        userChoice = prompt("It's a tie. Please make your choice again!");
    }
    computerChoice = Math.random();
    if (computerChoice < 0.4) {
        computerChoice = "rock";
    } else if(computerChoice <= 0.8) {
        computerChoice = "paper";
    } else {
        computerChoice = "scissors";
    }
    console.log("User: " + userChoice);
    console.log("Computer: " + computerChoice);
}
Decisions();
var compare = function(choice1, choice2) {
    if (choice1 === choice2) {
        count = count + 1
        console.log("The result is a tie!");
        Decisions();
        return 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 wins";
        }
    } else if (choice1 === "scissors") {
        if (choice2 === "paper") {
            return "scissors win";
        } else {
            return "rock wins";
        }
    }
}
console.log(compare(userChoice,computerChoice));
console.log("Wow, you played " + count + " times!");

这是我在本次练习中编写的代码,它的工作方式很有魅力。。。我在"if"语句中使用了逻辑运算符,它被接受了(显然)。

试试看:D

var userChoice = prompt("Do you choose rock, paper or scissor?");
var computerChoice = Math.random();
if (computerChoice > 0 && computerChoice < 0.33) {
  computerChoice = "Rock";
} else if (computerChoice > 0.34 && computerChoice < 0.67) {
  computerChoice = "Paper";
} else {
  computerChoice = "Scissor";
}
console.log(computerChoice);

我作为新手找到的解决方案似乎相对简单。。

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