我是JavaScript的新手。我刚开始学习它,我决定制作一个摇滚,纸,剪刀,蜥蜴,Spock'游戏。这是代码:
var userChoice = prompt("Do you choose rock, paper, scissors, lizard, or spock?")
var computerChoice = Math.random();
if (computerChoice < 0.2) {
computerChoice = "rock";
} else if (computerChoice <= 0.4) {
computerChoice = "paper";
} else if (computerChoice <= 0.6) {
computerChoice = "scissors";
} else if (computerChoice <= 0.8) {
computerChoice = "lizard";
} else {
computerChoice = "spock";
}
alert("The computer chose " + computerChoice);
var compare = function(choice1, choice2){
if (choice1 === choice2) {
alert("And... It's a tie!");
}
//If the user chose rock...
else if (choice1 === "rock") {
if (choice2 === "scissors") {
alert("Rock wins!");
} else if (choice2 === "paper") {
alert("Paper wins!");
} else if (choice2 === "lizard") {
alert("Rock wins!");
} else {
alert("Spock wins!");
}
}
//If the user chose paper...
else if (choice1 === "paper") {
if (choice2 === "scissors") {
alert("Scissors wins!");
} else if (choice2 === "rock") {
alert("Paper wins!");
} else if (choice2 === "lizard") {
alert("Lizard wins!");
} else {
alert("Paper wins!");
}
}
//If the user chose scissors...
else if (choice1 === "scissors") {
if (choice2 === "paper") {
alert("Scissors wins!");
} else if (choice2 === "rock") {
alert("Rock wins!");
} else if (choice2 === "lizard") {
alert("Scissors wins!");
} else {
alert("Spock wins!");
}
}
//If the user chose lizard...
else if (choice1 === "lizard") {
if (choice2 === "scissors") {
alert("Scissors wins!");
} else if (choice2 === "rock") {
alert("Rock wins!");
} else if (choice2 === "paper") {
alert("Lizard wins!");
} else {
alert("Lizard wins!");
}
}
//If the user chose spock...
else if (choice1 === "spock") {
if (choice2 === "scissors") {
alert("Spock wins!");
} else if (choice2 === "rock") {
alert("Spock wins!");
} else if (choice2 === "lizard") {
alert("Lizard wins!");
} else {
alert("Paper wins!");
}
}
};
compare(userChoice, computerChoice);
我想在代码中添加两件主要内容,但我不知道如何:
目前,如果用户输入了“摇滚乐”等内容。如果没有首都,它就不会被认为是五种有效投入之一(岩石,纸张,剪刀,蜥蜴和spock)。有没有办法让它如果用户输入有大写字母(或字母)的有效内容,它仍然有效?
我想添加一些东西,以便每当有人放入无效的东西时(例如&#34; sloth&#34;)它会提醒他们他们的输入是无效的并且会再次要求他们放入摇滚,纸,剪刀,蜥蜴或spock。
答案 0 :(得分:4)
让我们以此为导向。它将减少逻辑中的重复:
//Set up the choices with what they can beat
//This is a hash table of objects you can referecne by name
var choices = {rock : {name: "Rock", defeats: ["scissors","lizard"]},
paper: {name: "Paper", defeats: ["rock", "spock"]},
scissors: {name: "Scissors", defeats: ["paper", "lizard"]},
lizard: {name: "Lizard", defeats:["paper","spock"]},
spock: {name: "Spock", defeats:["scissors","rock"]}
};
//Get the computers choice
var computerChoice = Math.random();
if (computerChoice < 0.2) {
computerChoice = "rock";
} else if (computerChoice <= 0.4) {
computerChoice = "paper";
} else if (computerChoice <= 0.6) {
computerChoice = "scissors";
} else if (computerChoice <= 0.8) {
computerChoice = "lizard";
} else {
computerChoice = "spock";
}
//Get the users choice, normalising to lower case
var userChoice = prompt("Do you choose rock, paper, scissors, lizard, or spock?").toLowerCase();
alert("The computer chose " + computerChoice);
//Check for a tie
if(computerChoice == userChoice){
alert("It's a tie");
//Check for a valid choice
}else if(choices[userChoice] === undefined){
alert("Invalid Choice");
}else{
//Get the chosen one as an object
userChoice = choices[userChoice];
//Check For a win
/*var victory = false;
for(var i = 0; i < userChoice.defeats.length; i++){
if(computerChoice == userChoice.defeats[i])
{
victory = true;
break;
}
}*/
//Improved check, inspired by Mke Spa Guy
var victory = userChoice.defeats.indexOf(computerChoice) > -1;
//Display result
if(victory) {
alert("Vitory! " + userChoice.name + " wins!")
}else{
alert("Defeat, " + computerChoice + " wins!");
}
}
多数民众赞成,Spocks&#39;你的叔叔。
Demo with full action:例如:Paper Covers Rock;
更多阅读:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
答案 1 :(得分:4)
用数学简化结果函数。 http://jsfiddle.net/afrievalt/qBbJn/
var options = ["paper", "rock", "lizard", "spock", "scissors"],
result = [" ties ", " beats ", " loses to "],
bigBang = function(choice1, choice2) {
var index1 = options.indexOf(choice1), //spock => 3
index2 = options.indexOf(choice2), //rock=> 1
dif = index2 - index1; // 1 - 3 => -2
if(dif < 0) { // -2 < 0 => truthy
dif += options.length; // -2 + 5 => 3
}
while(dif > 2) { //3 > 2 => truthy
dif -= 2; // 3 - 2 => 1
}
return choice1 + result[dif] + choice2; //spock beats rock
};
bigBang("spock", "paper"); // spock losses to paper
var i = Math.floor(Math.random() * 5),
randomChoice = options[i];
bigBang(randomChoice, userChoice);
这个功能也可以用于选项= [“cockroach”,“nuke”,“shoe”],(从70年代表演)或任何奇数长度数组,如选项= [“水”,“火”,“纸” “,”摇滚“,”树“,”金属“,”泥“] // todo:如果任何index = -1
则抛出错误答案 2 :(得分:1)
我会编写一个函数来获取正确的响应,而不是全部内联..这只是我...
function getUserChoice(){
var invalidPin = true;
var response;
while(invalidPin){
response = prompt("choose your thing..");
if(response == "rock" || response == "paper" || response == "scizerz"){
invalidPin = false;
}
}
}
return response;
}
然后您只需调用函数
即可获得用户的选择var userChoice = getUserChoice();
答案 3 :(得分:0)
我会做类似以下的事情(请注意语法可能稍微偏离):
var compare = function (choice1, choice2)
{
switch (choice1.tolower())
{
case "rock"
RockPicked(choice2);
break;
case "scissors"
ScissorsPicked(choice2);
break;
....
....
case default
alert ("Selection was invalid")
break;
}
}
// if the user picked rock then we compare the computers choice and decide winner
var RockPicked = function(choice2)
{
if (choice2 === "scissors")
{
alert("Rock wins!");
}
else if (choice2 === "paper")
{
alert("Paper wins!");
}
else if (choice2 === "lizard")
{
alert("Rock wins!");
}
else
{
alert("Spock wins!");
}
}
答案 4 :(得分:0)
正如一些用户所提到的,比较最好的选择是将输入转换为小写。
对于第二点,我将输入解析包装在一个循环中,如下所示:
while(true){
var input = getInput();
if(isValid(input)){
// check for the winner
break;
}else{
// tell the user that their input is invalid
}
}
答案 5 :(得分:0)
如果您自己使用这样的组合表 -
https://commons.wikimedia.org/wiki/File:Normal_form_matrix_of_Rock-paper-scissors-lizard-Spock.jpg
我使用2而不是-1(0 - Tie; 1 - row win; 2 - row looses)
然后您的代码变为:
var options=["Rock","Paper","Scissors","Lizard","Spock"]
var outcomes=[[0,2,1,1,2],[1,0,2,2,1],[2,1,0,1,2],[2,1,2,0,1],[1,2,1,2,0]]
function RPSLS(user){
var computer=Math.floor(Math.random()*5);
if (outcomes[user][computer]==0){alert("Tie");}
if (outcomes[user][computer]==1){alert("User Wins");}
if (outcomes[user][computer]==2){alert("Computer Wins");}
txt1.value=options[user];
txt2.value=options[computer];}
然后输出的HMTL部分:
Please choose:<br>
<button onclick="RPSLS(0)">Rock</button>
<button onclick="RPSLS(1)">Paper</button>
<button onclick="RPSLS(2)">Scissors</button>
<button onclick="RPSLS(3)">Lizard</button>
<button onclick="RPSLS(4)">Spock</button>
<button onclick="RPSLS(Math.floor(Math.random()*4))">Random Game</button><P>
<textarea id="txt1"></textarea><textarea id="txt1"></textarea>