Игра в камень, ножницы, бумагу: ввод правильного значения возвращает неправильную консоль.сообщение журнала

#javascript

#javascript

Вопрос:

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

Кроме того, в других случаях, когда я ввожу «rock» в приглашении и нажимаю OK, в консоли ничего не происходит (оценка не добавляется). Ниже приведен снимок экранавведите описание изображения здесь

 const playerSelection = ''
const computerSelection = computerPlay()
let computerScore = 0;
let playerScore = 0;
console.log(playRound(playerSelection, computerSelection))

function computerPlay(){
  let values = ['rock', 'paper', 'scissors'],
  valueToUse = values [Math.floor(Math.random()* values.length)];
  return valueToUse;
};

function playRound(playerSelection, computerSelection) {
  while(true){
    playerSelection = prompt ('Pick your poison');

    if (playerSelection.toLowerCase() === 'rock' amp;amp; computerPlay() === 'paper'){
      computerScore  = 1
      console.log('Sorry! Paper beats Rock')
    } 
    else if (playerSelection.toLowerCase() === 'rock'.toLowerCase() amp;amp; computerPlay() === 'scissors'){
      playerScore  = 1
      console.log('Good job! Rock beats Scissors');
    }
    else 
    {
      console.log('Please type Rock, Paper, or Scissors')
    }

  console.log (`User Selection: ${playerSelection.toUpperCase()} | Player Score: ${playerScore} 
Computer Selection: ${computerSelection.toUpperCase()} | Computer Score: ${computerScore}`);
  }
}
  

Комментарии:

1. вы не рассматривали случай, когда компьютер выбирает камень, а игрок выбирает камень, если это произойдет, сработает блок else

2. также вы можете удалить 'rock'.toLowerCase() и сделать это просто 'rock' , так как строка 'rock' уже в нижнем регистре

3. В чем смысл аргументов playerSelection и computerSelection в playRound , когда вы повторно запрашиваете выбор пользователя и повторно запускаете выбор компьютера?

4. Глядя на playerSelection объявление, кажется, что это константа, но внутри оператора while вы меняете ее значение! Должна быть переменная (var или let)!

Ответ №1:

Вы вызываете только computerSelection один раз, в начале загрузки страницы:

 const computerSelection = computerPlay()
  

Затем он продолжает использоваться только в журнале:

 Computer Selection: ${computerSelection.toUpperCase()} | 
  

Но ваши тесты вызываются computerPlay снова, каждый раз создавая новые строки для компьютера:

 if (playerSelection.toLowerCase() === 'rock' amp;amp; computerPlay() === 'paper'){
  //  function invocation                       ^^^^^^^^^^^^^^
  computerScore  = 1
  console.log('Sorry! Paper beats Rock')
} 
else if (playerSelection.toLowerCase() === 'rock'.toLowerCase() amp;amp; computerPlay() === 'scissors'){
  //  function invocation                                          ^^^^^^^^^^^^^^
  

В дополнение к этому, вы не тестируете исчерпывающим образом каждую возможность для игры камень-ножницы-бумага (например, когда игрок выбирает что-то другое, кроме ‘rock’).

Для начала вызовите computerPlay только один раз, затем используйте computerSelection переменную:

 if (playerSelection.toLowerCase() === 'rock' amp;amp; computerSelection === 'paper') {
  computerScore  = 1
  console.log('Sorry! Paper beats Rock')
} else if (playerSelection.toLowerCase() === 'rock' amp;amp; computerSelection === 'scissors') {
  

Также обратите внимание, что нет особого смысла вызывать toLowerCase то, что уже является строковым литералом в нижнем регистре — просто используйте обычную строку.

Ответ №2:

Вы можете обновить код следующим образом

  1. Удалите все ненужные объявления глобальных переменных.
  2. Удалите ненужные аргументы функции воспроизведения.
  3. Добавьте больше логики для других вариантов выбора игрока.
  4. Условие Nest для случаев выбора компьютера.
 playRound();

function computerPlay(){
  let values = ['rock', 'paper', 'scissors'],
  valueToUse = values [Math.floor(Math.random()* values.length)];
  return valueToUse;
};

function playRound() {
  let playerSelection;
  let computerSelection;
  let playerScore = 0;
  let computerScore = 0;
  while(true){
    playerSelection = prompt('Pick your poison').toLowerCase();
    computerSelection = computerPlay();

    if (playerSelection === 'rock') {
        if (computerSelection === 'paper') {
           computerScore  = 1;
        } else if (computerSelection === 'scissors') {
           playerScore  = 1;
        }
    } else if (playerSelection === 'paper') {
        if (computerSelection === 'scissors') {
           computerScore  = 1;
        } else if (computerSelection === 'rock') {
           playerScore  = 1;
        }
    } else if (playerSelection === 'scissors') {
        if (computerSelection === 'rock') {
           computerScore  = 1;
        } else if (computerSelection === 'paper') {
           playerScore  = 1;
        }
    } else {
      console.log('Please type Rock, Paper, or Scissors');
      continue;
    }
  console.log (`User Selection: ${playerSelection.toUpperCase()} | Player Score: ${playerScore} 
Computer Selection: ${computerSelection.toUpperCase()} | Computer Score: ${computerScore}`);
  }
}
  

Комментарии:

1. Спасибо. Из любопытства, что делает оператор continue?

2. Инструкция Hi @Parham Continue игнорирует остальные команды в блоке цикла и начинается снова с верхней части блока. В этом случае вам не нужно показывать компьютер / ваш счет, когда вы вводите неправильную строку.

Ответ №3:

Вот минималистская версия игры, полностью переписанная:

 function game(){
 var usr, u, c, g, score=[0,0],last="";
 const words=["rock","paper","scissors"];

 while(usr=prompt(last "nScore (you:computer):  " score.join(":") "nYour choice:")) {  
  while((u=words.indexOf(usr.toLowerCase()))<0) usr=prompt("invalid choice, please enter again,none of: " words.join(", "));
  
  c=Math.floor(Math.random()*3);
  g=(3 u-c)%3; // who wins?
  if(g) score[g-1]  ;
  last="you: " words[u] ", computer: " words[c] " --> "
   ["draw","you win!!!","you lost - sorry."][g];
 }
}
game()