1

Я хочу, чтобы пользователь ввел свой ответ в игру с карандашом-ножницами в следующей строке кода.Использование логических операторов и операторов сравнения в условиях (javascript)

userChoice = prompt("Do you choose rock, paper or scissors?"); 

Однако, в случае, когда пользователь пишет что-то другое, чем именно «рок», «бумага» или «ножницы», он должен выбрать еще раз, что я пытался сделать этот кусок кода:

while (userChoice !== "rock" || "paper" || "scissors") { 
    userChoice = prompt("Invalid choice. Please change your answer."); 
}; 

Проблема заключается в том, что программа продолжает распознавать данный ввод как недопустимый, даже если это «рок», «бумага» или «ножницы».


При наборе текста мне удалось найти решение самостоятельно.

while (userChoice !== "rock" && userChoice !== "paper" && userChoice !== "scissors") { 
    userChoice = prompt("Invalid choice. Please change your answer."); 
}; 

Таким образом, имеет смысл и первое условие, вероятно, не работает, потому что даже если вы вводите правильный ответ (например, «бумага»), она до сих пор не равно два других ответов (в этом «рок» и «ножницы»), поэтому программа продолжала говорить, что ответ был недействительным, не так ли? Или это синтаксическая ошибка? Теперь (при рабочем состоянии) выбор пользователя не должен быть ни «скалой», ни «бумагой», ни «ножницами», и поэтому он работает правильно.

Кроме того, есть ли возможно более простой и более короткий способ написания этого условия?

Примечание: Я надеюсь, что это хорошо, что части решения уже включены, как они могли бы помочь другим кодеров.

ответ

1

Два примера

Один с массивом и Array.prototype.indexOf():

var userChoice; 
 
while (!~['rock', 'paper', 'scissors'].indexOf(userChoice)) { 
 
    userChoice = prompt("Invalid choice. Please change your answer."); 
 
};

И еще с объектом и оператором in:

в операторе возвращает true, если указанное свойство находится в указанном объекте.

var userChoice; 
 
while (!(userChoice in {rock: 1, paper: 1, scissors: 1})) { 
 
    userChoice = prompt("Invalid choice. Please change your answer."); 
 
};

+1

Приятное использование 'in'! И я понятия не имею, что '' 'в вашем первом примере. (собирается его искать). Любовь, когда я узнаю новые вещи от других ответов :-) – AmmarCSE

+1

Хех, для тех, кто интересуется тем, что '' 'делает: http://stackoverflow.com/questions/12299665/what-does-a-tilde-do-when-it -precedes-an-expression – AmmarCSE

+1

Два очень интересных решения, спасибо. :) – Maurice

1

Использование indexOf

while (["rock", "paper", "scissors"].indexOf(userChoice) > -1) { 

Ваша первая попытка

while (userChoice !== "rock" || "paper" || "scissors") { 

технически бесконечный цикл, потому что

|| "paper" 

, например, технически оценивается как истина или в truthy значение

+0

Отличное решение, спасибо. Кроме того, спасибо, что указали, что было не так с другим условием. :) – Maurice

+0

@Maurice, проблем нет. Рад ответить помогло :-) – AmmarCSE

0
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>Rock Papper Scissors Game</title> 
    </head> 
    <body> 
     <h1>Play Rock Papper Scissors?</h1> 
     <button id="start">Play?</button> 
     <script> 
      function rpsGame() { 
       var computerChoice = Math.random(), 
        userChoice = prompt('Do you choose rock, paper, or scissors'); 
       function getComputerChoice() { 
        if (computerChoice <= 0.33) { 
         computerChoice = 'rock'; 
        } else if (computerChoice <= 0.66 && computerChoice >= 0.33) { 
         computerChoice = 'paper'; 
        } else { 
         computerChoice = 'scissors'; 
        } 
       } 
       function playAgain() { 
        var restart = prompt('Would you like to play again, yes or no?').toLowerCase(); 
        switch(restart) { 
        case 'yes': 
         rpsGame(); 
         break; 
        default: 
         alert('Okay, see you later!'); 
        } 
       } 
       function compare() { 
        var choice1 = userChoice.toLowerCase(), 
         choice2 = computerChoice, 
         tie = "The computer chose " + choice2 + ", and you chose " + choice1 + ". The result is a tie!", 
         win = "The computer chose " + choice2 + ", and you chose " + choice1 + ". You win!", 
         lose = "The computer chose " + choice2 + ", and you chose " + choice1 + ". The computer wins!"; 

        switch (choice1) { 
        case "": 
         alert("You didn't enter anything. Maybe we can play later!"); 
         break; 
        case 'rock': 
         if (choice2 === 'scissors') { 
          alert(win); 
         } else if (choice2 === 'rock') { 
          alert(tie); 
         } else { 
          alert(lose); 
         } 
         playAgain(); 
         break; 
        case 'paper': 
         if (choice2 === 'rock') { 
          alert(win); 
         } else if (choice2 === 'paper') { 
          alert(tie); 
         } else { 
          alert(lose); 
         } 
         playAgain(); 
         break; 
        case 'scissors': 
         if (choice2 === 'paper') { 
          alert(win); 
         } else if (choice2 === 'scissors') { 
          alert(tie); 
         } else { 
          alert(lose); 
         } 
         playAgain(); 
         break; 
        default: 
         alert(choice1.substring(0,1).toUpperCase() + choice1.substring(1, choice1.length).toLowerCase() + " is an invalid choice. Please change your answer."); 
         rpsGame(); 
        } 
       } 
       getComputerChoice(); 
       compare(); 
      } 
      document.getElementById('start').addEventListener('click', rpsGame); 
     </script> 
    </body> 
</html> 
Смежные вопросы