2013-07-31 4 views
3

Je travaille à rendre mon premier jeu (Rock Paper Sissors) et je suis tombé sur un problème où lorsque le userChoice est ciseaux et le computerChoice est roche, le programme ne peut pas retourner le gagnant comme rock. Je peux obtenir le programme pour me donner le gagnant pour toute autre combinaison.Rock, Paper, Scissors en JavaScript

J'ai mon code ici:

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); 
+0

Il y avait une erreur de syntaxe 'manquante accolade requise »ou quelque chose à la fin de la fonction, et vous l'avez inséré là? Ne les croyez pas, l'orthèse manquait ailleurs mais l'analyseur l'a reconnu à la fin. – Bergi

+2

Ce code, une fois corrigé, doit être envoyé à [Code Review] (http://codereview.stackexchange.com), il peut être optimisé par beaucoup. –

+1

ils ont résolu votre problème. mais vous devriez utiliser "else if" quand il est approprié comme dans votre code .. avez-vous vraiment besoin de tous ces {}? code plus propre a moins d'erreurs – gezzuzz

Répondre

5

Vous ne pouviez pas voir la question probablement dû à une mauvaise indentation de votre code. Correctement indenté la question est claire:

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"; 
      } 
     } 
    } 
} 

Votre if (choice1 === "scissors") { est dans les if (choice1 === "paper") {. Le code à l'intérieur ne sera jamais atteint.

+0

Bon, alors il me manque juste une accolade alors. Merci! – Godzdude

+0

Je suis sûr que vous avez le bon nombre d'accolades. Je suppose que vous pourriez dire qu'ils sont dans le mauvais ordre. Vous devez déplacer le code en dehors de l'autre 'if'. –

+0

Eh bien, ne mettrait pas une accolade au-dessus de 'if (choice1 ===" ciseaux ")' le déplacer efficacement en dehors de l'autre déclaration 'if'? – Godzdude

1

Vous avez une attelle mal apparié:

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

je supprimer en fait le dernier if dans ce bloc, vous ne avez pas besoin. Le dernier bloc (choice1 === "scissors") est correct, mais encore une fois le dernier n'est pas requis.

Pour vous montrer pourquoi il est à défaut de cette façon particulière, j'ai réindenté la partie pertinente de votre code pour illustrer la façon dont il est interprété:

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"; 
      } 
     } 
    } 
} 
2

Tant d'instructions if. Ils sont déroutants.

De plus, toutes ces instructions if se verrouillent dans le jeu et rendent difficile la réutilisation de la logique pour un autre jeu.

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)); 
+1

La raison pour laquelle j'utilise des instructions est parce que j'ai commencé à apprendre JavaScript il y a 2 jours chez Codecadamy. Je n'ai pas appris la plupart des choses que vous avez utilisées pour créer la version codée plus propre du jeu. – Godzdude

+1

C'est bon. Nous commençons tous quelque part. Parfois, vous apprenez seulement ces astuces à la fin d'un long cours, mais je pense qu'il pourrait être bon de les apprendre plus tôt. – Paul

+0

Testé et expansé un peu maintenant :-) – Bergi

9

Quelque chose à étudier:

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"; 
} 

Voici un autre qui fonctionnera pour des ensembles élargis. L'hypothèse est qu'il y a un nombre impair de possibilités, et à partir d'un point donné, du nombre total d'opposition, en lisant à partir de notre point donné (et en tournant autour quand nous atteignons la fin) la première moitié va gagner sur le donné point, et la seconde moitié va perdre.

Ou une autre façon de le décrire serait que la moitié des adversaires restants qui précèdent notre point donné va perdre, et la moitié qui suit va gagner.

Par conséquent, le bon ordre dans la matrice choices est crucial.

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"; 
} 
+0

hes une recrue .. Je pense que vous soufflerait son esprit .. – gezzuzz

+0

@gezzuzz: Je suis d'accord. C'est pourquoi c'est quelque chose à étudier. Il y a plusieurs concepts en jeu, dont chacun est très simple, mais tous ensemble sont peut-être un peu hallucinants. –

+0

J'avais du mal à comprendre cette solution, mais ça m'a inspiré d'en trouver un autre que je trouve beaucoup plus simple. Aussi, ici vous devez générer toutes les comparaisons possibles, n'est-ce pas? –

0

J'obtenu cela fonctionne:

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) 
} 

Tout ce que je changé était au lieu de retourner un message, il apparaît une alerte avec la réponse. Je l'ai également mis dans une fonction qui pourrait être appelée sur un clic de bouton HTML.

0

Exemple sans tous les {} et d'autre si

toujours utiliser d'autre si quand vous pouvez .. depuis votre si des déclarations sont différents cas et un seul, vous devez utiliser applique d'autre si ..

avec si déclarations si vous avez seulement 1 déclaration après la condition que vous n'avez pas besoin de {} (condition 1 ci-dessous) .. même si vous avez une instruction if .. else if ... block est considérée comme une déclaration (condition 2 ci-dessous) .. mais si cela vous aide, vous pouvez les utiliser autour de la déclaration de bloc if .. else if ... pour vous aider à mieux le comprendre .. (condition 3 ci-dessous) .. ..

aussi don ' t l'utilisation === sauf si vous savez vraiment ce qu'il fait .. il peut vous causer du mal à être une recrue .. utiliser == par défaut ..

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"; 
+0

Je pense que se débarrasser des accolades est un bon moyen de le nettoyer, même si vous avez laissé une paire pour une raison quelconque. Mais je dois dire que je suis complètement en désaccord avec votre conseil d'utiliser '==' sur '==='. C'est généralement le contraire de ce que les gens pourraient conseiller. Le '===' est une comparaison d'égalité très simple, tandis que '==' utilise un algorithme beaucoup plus complexe lorsque des types disparates sont comparés afin de forcer les opérandes à correspondre à des types. C'est cet algorithme de coercition qui surprend les gens. –

+0

Je l'ai laissé pour la condition 3 pour lui montrer que vous pouvez toujours l'utiliser en option pour vous aider à lire. – gezzuzz

2

je suis venu avec une alternative qui devrait être facile pour vous pour comprendre et éviter certains problèmes dans votre code, comme les répétitions excessives et les choix fixes. Il est donc beaucoup plus flexible et plus facile à entretenir.

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"; 
    } 
} 

choix est var choices = ["rock", "paper", "scissors"];. Vous pouvez voir a demonstration.


Généraliser la solution aux listes plus grandes, ce modulo technique peut être utile:

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

Ensuite, il est beaucoup plus facile d'écrire le code de comparaison:

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"; 
    } 
} 

Le corresponding jsFiddle.

+0

Belle approche. +1 –

0
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); 
+1

Veuillez également expliquer votre code. – lpapp

0
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;} 
} 
} 
+2

Vous devriez vraiment expliquer ce qui se passe ici, plutôt que de simplement jeter ce code. –

0

Celui-ci va créer le parfait jeu d'auto répéter jusqu'à ce que quelqu'un a gagné. Il vous montre également combien de jeux vous avez joués. Tout sans utiliser de boucles!

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!"); 
0

Voici le code que j'ai fait à cet exercice et cela a fonctionné comme un charme ... Je utilisé les opérateurs logiques sur mes déclarations « si », et il a été accepté (évidemment).

Essayez-le: 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);

0

La solution que je suis venu en tant que novice collègue semble relativement simple ..

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"; 
} 
Questions connexes