新手Javascript函数返回未定义的石头剪刀游戏

Newbie Javascript function returning undefined, rock paper scissors game

本文关键字:石头 游戏 未定义 Javascript 函数 返回 新手      更新时间:2023-09-26

作为一名新手,在学习代码学院课程后,我遇到了一个构建石头剪刀游戏的问题。

我创建了两个包含整个程序的函数,当两个选项不同时,程序运行良好,但当选项相同时,它返回未定义,我不明白为什么。

我可以看到,当选择被捆绑时,新的选择会不断被分配,直到它们不同,然后对这些不同的选择调用比较函数,这应该会返回一个获胜的结果。

只是想补充一点,我想按原样修复代码,而不是重写整个代码,我已经完成了关于代码学院的这项练习,但我只是试图以不同的方式将其作为两个独立的函数。

感谢

var makeChoices = function() {
userChoice = "";
computerChoice = "";
userChoice = prompt("Do you choose rock, paper or scissors?");
computerChoice = Math.random();
if (computerChoice < 0.34) {
    computerChoice = "rock";
} else if(computerChoice <= 0.67) {
    computerChoice = "paper";
} else {
    computerChoice = "scissors";
} 
console.log("Computer: " + computerChoice + " " + "User: " + userChoice);
};
var compare = function(choice1, choice2) {
    if (choice1 === choice2) {
        makeChoices();
        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 === "rock") {
            return "rock wins";
        }
        else {
            return "scissors wins";
        }
    }
    else {
        return "invalid choice by user";
    }
};
makeChoices();
compare (userChoice, computerChoice);

您必须返回递归调用的结果。尝试更改

...
compare(userChoice, computerChoice);
...

...
return compare(userChoice, computerChoice);
...

当它相等时,您有"compare(userChoice,computerChoice);"。变量userChoice和computerChoice是在makeChoice()函数中定义的。它们在compare()函数中不可用。您可以将它们作为全局变量,也可以考虑将compare()函数调用移到makeChoices()的底部。

我们都以同样的方式开始这种令人印象深刻的语言!,不要担心成为新手,如果你不投降,你很快就会成为一名老师!,下面是这个练习的完整代码:

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(computerChoice, userChoice) {
if (computerChoice===userChoice) {
     return("The result is a tie!");
 }
if (userChoice === "rock"){
   if (computerChoice === "paper") {
return("paper wins");
}
else if (computerChoice === "scissors") {
    return("rock wins");
 }
}
if (userChoice === "scissors") {
     if (computerChoice==="paper") {
       return("scissors wins");
 }
 else if (computerChoice === "rock") {
    return("rock wins");
      }
   }
if (userChoice === "rock") {
if (computerChoice==="scissors") {
    return "rock wins";
}
else if (computerChoice=== "paper") {
    return "paper wins";
}
}
if (userChoice === "paper") {
if (computerChoice ==="scissors") {
    return "scissors wins";
}
else if (computerChoice==="rock") {
    return "paper wins";
    }
   }
 };
compare();

我以前做过这样一个游戏:

var prsStatements = {
  paperBeatsRock: 'Paper Beats Rock',
  rockBeatsScissors: 'Rock Beats Scissors',
  scissorsBeatsPaper: 'Scissors Beats Paper',
  seperator: ' - ',
  player1: 'Player One',
  player2: 'Player Two',
  wins: ' Wins!',
  tie: "It's a Tie!",
  tally: 'Final Tally: '
}
function PaperRockScissors(player1, player2){
  var p = /^paper$/i, r = /^rock$/i, s = /^scissors$/i, prss = prsStatements, sep = prss.seperator, win = prss.wins;
  var pbr = prss.paperBeatsRock+sep, rbs = prss.rockBeatsScissors+sep, sbp = prss.scissorsBeatsPaper+sep;
  var plr1 = player1 ? player1 : prss.player1;
  var plr2 = player2 ? player2 : prss.player2;
  var p1w = plr1+win, p2w = plr2+win;
  this.p1 = 0; this.p2 = 0;
  this.rand = function(){
    switch(Math.floor(Math.random()*3)){
      case 0:
        return 'rock';
      case 1:
        return 'paper';
      case 2:
        return 'scissors';
    }
  }
  this.play = function(in1, in2){
    var i2 = in2 || this.rand();
    if(in1.match(p) && i2.match(r)){
      ++this.p1;
      return pbr+p1w;
    }
    else if(i2.match(p) && in1.match(r)){
      ++this.p2;
      return pbr+p2w;
    }
    else if(in1.match(r) && i2.match(s)){
      ++this.p1;
      return rbs+p1w;
    }
    else if(i2.match(r) && in1.match(s)){
      ++this.p2;
      return rbs+p2w;
    }
    else if(in1.match(s) && i2.match(p)){
      ++this.p1;
      return sbp+p1w;
    }
    else if(i2.match(s) && in1.match(p)){
      ++this.p2;
      return sbp+p2w;
    }
    else if(in1.match(i2r)){
      return prss.tie;
    }
    else{
      return this;
    }
  }
  this.tally = function(){
    var pt = prss.tally;
    if(this.p1 > this.p2){
      return pt+p1w;
    }
    else if(this.p2 > this.p1){
      return pt+p2w;
    }
    else{
      return pt+prss.tie;
    }
  }
}
var pr = new PaperRockScissors('Joe', 'Bob');
console.log(pr.play('paper', 'rock'));
console.log(pr.play('rock', 'Paper'));
console.log(pr.play('scissors', 'paper'));
console.log(pr.play('rock', 'Paper'));
console.log(pr.play('paper', 'rock'));
console.log(pr.play('Paper', 'Scissors'));
console.log(pr.play('Paper', 'paper'));
console.log(pr.play('paper', 'Rock'));
console.log(pr.tally());

如果你想让这个网络功能化,你只需要传递用户输入值,比如:

pr.play(someElement.value, anotherElement.value);

当然,您可能希望使用事件并传递正确的值"纸"、"石头"或"剪刀"。

电脑游戏可能看起来像:

var pc = new PaperRockScissors('Joe', 'Comupter');
console.log(pc.play('paper'));
console.log(pc.play('rock'));
console.log(pc.play('scissors'));
console.log(pc.play('rock'));
console.log(pc.play('paper'));
console.log(pc.play('Paper'));
console.log(pc.play('Paper'));
console.log(pc.play('paper'));
console.log(pc.tally());