玩石头剪刀游戏

Looping a rock-paper-scissors game

本文关键字:游戏 石头      更新时间:2023-09-26

好的,所以这个问题应该很容易回答,但出于某种原因,我遇到了问题。(可能是因为我对编程很陌生)我已经创建了一个与CPU对抗的石头、纸张、剪刀游戏。现在我想问用户他们是否想再次播放,如果他们回答Y,那么每次都应该经过循环。如果他们输入"N",那么游戏将结束。我遇到的主要问题是,一旦你再次输入Y,它只会给你上一场比赛的结果。任何指针都会有所帮助。

这是我的:

var userChoice = "";
var userChoice = prompt("Choose rock, paper, or scissors");
var playagain = "Y";
var computerChoice = Math.random();
if (computerChoice < 0.34) {
    computerChoice = "rock";
} else if (computerChoice <= 0.67) {
    computerChoice = "paper";
} else {
    computerChoice = "scissors";
}
choice1 = userChoice;
choice2 = computerChoice;
while (playagain == "Y") {
    function compare(choice1, choice2) {
        if (choice1 == choice2) {
            return ("It's a tie!");
        }
        if (choice1 == "rock") {
            if (choice2 == "scissors") {
                return ("You win!");
            } else {
                return ("computer wins!");
            }
        }
        if (choice1 == "paper") {
            if (choice2 == "rock") {
                return ("you win!");
            } else {
                return ("computer wins!");
            }
        }
        if (choice1 == "scissors") {
            if (choice2 == "rock") {
                return ("computer wins!");
            } else {
                return ("you win!");
            }
        }
    }
    document.write(compare(choice1, choice2));
    document.write("<br>");
    playagain = prompt("Do you want to play again, Y or N");
    userChoice = prompt("Choose rock, paper, or scissors");
}

您唯一需要的就是将所有游戏逻辑移动到while循环下:

function compare(choice1, choice2) {
    if (choice1 == choice2) {
        return ("It's a tie!");
    }
    if (choice1 == "rock") {
        if (choice2 == "scissors") {
            return ("You win!");
        } else {
            return ("computer wins!");
            }
        }
        if (choice1 == "paper") {
            if (choice2 == "rock") {
                return ("you win!");
            } else {
                return ("computer wins!");
            }
        }
        if (choice1 == "scissors") {
            if (choice2 == "rock") {
                return ("computer wins!");
            } else {
                return ("you win!");
            }
        }
    }
}
var playagain = "Y";
while (playagain == "Y") {
    var userChoice = prompt("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";
    }
    document.write(compare(userChoice, computerChoice));
    document.write("<br>");
    playagain = prompt("Do you want to play again, Y or N");
}

我有:

  • 将除playagain声明之外的所有内容都移动到循环中
  • 删除了choice1choice2局部变量,因为它们是冗余的
  • 删除了循环末尾的提示,因为我们在开头有一个
  • 删除了开头的空userChoice的声明
  • 根据@LiYinKing的建议,将函数移出循环

这是正在运行的JSFiddle演示。

在while循环中,您需要包括用户提示和新的计算机生成的随机数。问题是,你的循环一遍又一遍地计算相同的随机数和用户输入。

很难准确解释问题所在,因为代码很难理解。

  • 我不知道你怎么会期望在代码执行到脚本底部后,设置计算机选择的代码再次运行
  • 在循环中声明命名函数是没有意义的。在顶部声明它们。然后循环的主体就什么都没有了。鱼

你需要的是一个运行游戏的函数和一个调用该函数的while循环。

我在打电话,这是未经测试的

function runGame() {
  var userChoice = prompt("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";
  }
  if(userChoice==computerChoice){
     return "It's a tie!";
  }
  if(userChoice=="rock"){
    if(computerChoice=="scissors"){
      return "You win!";
    } else{
      return "computer wins!";
    }
  }
  if(userChoice=="paper"){
    if(computerChoice=="rock"){
        return "you win!";         
    } else{
        return "computer wins!";
    }
  }    
  if(userChoice=="scissors"){
    if(computerChoice=="rock"){
        return "computer wins!" ;           
    } else{
        return "you win!" ;
    }
  }
}
alert(runGame());
while ( prompt("Do you want to play again, Y or N") == "Y") {
  alert(runGame());
}

稍后,凭借经验和知识,您可以编写如下脚本:

function compare(choice1, choice2) {
    if (choice1 == choice2) {
        return ("It's a tie!");
    }
    var lose = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper"
    };
    return (lose[choice1] == choice2) ? "You win!" : "computer wins!";
}
(function() {
    var CHOICE = ["rock", "paper", "scissors"];
    var userChoice = "";
    var userChoice, computerChoice, playagain, i = 0;
    do {
        document.write("Ground " + i + " :<br>");
        computerChoice = CHOICE[Math.floor(Math.random() * 3)];
        do {
            userChoice = (""+prompt("Choose rock, paper, or scissors")).toLowerCase();
        } while (CHOICE.indexOf(userChoice) === -1);
        document.write(userChoice + " vs " + computerChoice + "<br>");
        document.write(compare(userChoice, computerChoice) + "<br>");
        playagain = (""+prompt("Do you want to play again, Y or N")).toUpperCase();
        i++;
    } while (["Y", "YES"].indexOf(playagain) !== -1);
});

说明:

我添加了toLowerCase()函数,将"Rock"替换为"Rock",并添加了toUpperCase(),将"y"替换为了"y"。

在这种情况下CCD_ 8更合适。

带有:

do {
    userChoice = (""+prompt("Choose rock, paper, or scissors")).toLowerCase();
} while (CHOICE.indexOf(userChoice) === -1);

您等待一个有效的答案,只有三个字石头或者剪刀。当userChoice等于"rock"indexOf时,返回0;等于"纸张"indexOf返回1…

此语法:

return (lose[choice1] == choice2) ? "You win!" : "computer wins!";

Is:

if (lose[choice1] == choice2)
    return "You win!";
else
    return "computer wins!"

带有函数的JavaScript三元运算符示例