我使用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);
答案 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);