Камень, ножницы и бумага выбирает ответы случайным образом

Всем отличного дня!

Мне было интересно, почему, если я уже выбрал «камень» (в const playerSelection), а компьютер выбрал «камень», он печатает мне, что «Компьютер выигрывает», или иногда печатает, что я выиграл игру, а не вничью. То же самое и с другим элементом в коде.

Что могло случиться, что результат игры также был случайным?

Вот мой код:

function computerPicks() {
 let compChoices = ["rock", "paper", "scissors"] // let computer pick [rock, paper, scissors]
 let randomizeChoice = Math.floor(Math.random() * compChoices.length) + 1 // randomize rock paper and scissors

 if (randomizeChoice === 1) {
   return "rock";
 } if (randomizeChoice === 2) {
   return "paper";
 } if (randomizeChoice === 3) {
   return "scissors";
 }
}

console.info(computerPicks()); // view computer's choice


function playRound(playerSelection, computerSelection) {
  if (playerSelection === "rock") {  
    if (computerSelection === "rock") {
      return "It is a tie!!"
    } else if (computerSelection === "paper") {
        return "The computer wins!";
      } else {
        return "You win this game!";
      }
  }
  else if (playerSelection === "paper") {  
    if (computerSelection === "paper") {
      return "It is a tie!!"
    } else if (computerSelection === "rock") {
        return "The computer wins!";
      } else {
        return "You win this game!";
      }
  } else {
    if (computerSelection === "rock") {
      return "Computer wins!";
  } else if (computerSelection === "paper") {
      return "User wins!";
  } else {
      return "Draw!";
  }
  }


}

const playerSelection = "scissors"; // primary choice
const computerSelection = computerPicks(); // calls the randomized choices
console.info(playRound(playerSelection, computerSelection)); // print out the result

Я думаю, что это также рандомизация из-за того, как я вызвал рандомизатор или как он объявлен в функции computerPicks().

Вы должны войти computerSelection вместо того, чтобы звонить computerPicks() во второй раз. Вы говорите ему выбрать дважды прямо сейчас, один раз, чтобы показать вам свой выбор, и еще раз с новым выбором, чтобы играть в игру.

Paul 17.03.2022 02:20

Добавьте возвращаемое значение по умолчанию в computerPicks на случай, если ни один из операторов if не будет совпадать.

Jerry Jeremiah 17.03.2022 02:20

Всем спасибо, уже заработало! ^^

Edzer 17.03.2022 02:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша программа ведет себя не так, как ожидалось, потому что вы используете оператор '===' для сравнения строк. Оператор '===' является оператором строгого равенства, что означает, что он возвращает значение true только в том случае, если оба операнда относятся к одному и тому же объекту. В вашем случае «==» будет более подходящим, поскольку вы проверяете базовое равенство.

Если все строки являются литералами — я не вижу new String("I am a string object") — тогда все они «примитивы» и === должны правильно приравниваться.

radarbob 17.03.2022 03:56
Ответ принят как подходящий

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

Работа со многими уровнями операторов if/else может быть трудной для понимания, обслуживания и отладки.

Вы можете значительно уменьшить сложность, сохранив часть логики движка в объекте, который определяет, какие варианты лучше, чем какие (см. плохое имя whatBeatsWhat).

// Explicit mapping of winning key (i.e. "rock") beating losing value (i.e. "scissors").
const whatBeatsWhat = {
  rock: "scissors",
  paper: "rock",
  scissors: "paper",
}

// Derive computerChoices from keys of whatBeatsWhat.
const computerChoices = Object.keys(whatBeatsWhat)

function computerPicks() {
  // Randomize rock paper and scissors.
  let randomizeChoice = Math.floor(Math.random() * computerChoices.length)
  // randomizeChoice will be one of [0,1,2] representing all possible indices of computerChoices.
  return computerChoices[randomizeChoice]
}

function playRound(playerSelection, computerSelection) {
  if (playerSelection === computerSelection) {
    return "It is a tie!!"
  }

  // Check if playerSelection in whatBeatsWhat maps to computerSelection
  // and if so, player has beaten computer.
  if (whatBeatsWhat[playerSelection] === computerSelection) {
    return "You win this game!"
  }

  // Undoubtedly, whatBeatsWhat[computerSelection] === playerSelection
  return "The computer wins!"
}

const playerSelection = "scissors"
const computerSelection = computerPicks()
const result = playRound(playerSelection, computerSelection)
console.info(`${result} (${playerSelection} vs ${computerSelection})`)

Другие вопросы по теме