Функциональность цикла и подсчет в функции javascript rock paper scissors game ()

#javascript

#javascript

Вопрос:

Просто в качестве предисловия, я очень новичок в программировании, поэтому прошу прощения, если ошибка — это что-то простое, что я просто упустил из виду. Также заранее я знаю, что функция game сейчас в беспорядке, я скопировал ее в том состоянии, в котором она находится сейчас, после того, как я повозился с ней пару дней.

Я работал над проектом odin project rock paper scissors project, и хотя я разработал единственную функцию раунда, которая работает хорошо, я не смог заставить всеобъемлющую игровую функцию работать должным образом. Я попытался изменить синтаксис и подозреваю, что проблема связана с областью действия определенных переменных, но я пока не смог найти способ, который работает. Я также проводил исследования в течение последних нескольких дней, пытаясь выяснить, как это сделать, пока я оптимизировал один раунд, но я не смог найти запрос, который работал с настройкой моего кода.

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

Моя игровая функция, которая примерно в пятом или шестом исполнении не работает:

 function game() {
  let playerScore = 0;
  let computerScore = 0;
  let roundResult = computerPlay();

  for (let counter = 0; counter <= 5;   counter) {
    computerPlay();

    if (roundResult === 'You win, rock beats scissors' || roundResult === 'You win, paper beats rock.' || roundResult === 'You win, scissors beats paper.') {
        playerScore;
    } else if (roundResult === 'You lose, paper beats rock.' || roundResult === 'You lose, scissors beats paper.' || roundResult === 'You lose, rock beats scissors.') {
        computerScore
    }

    if (playerScore > computerScore) {
      return ('You win '   playerScore   ' to '   computerScore   '.');
    } else if (playerScore < computerScore) {
      return ('You lose '   computerScore   ' to '   playerScore   '.');
    } else {
      return 'It was a tie, you both won the same number of rounds.';
    }
  }
}

// and the single round (computerPlay) function that works fine:

function computerPlay() {
  let playerInput = prompt('Enter your selection of rock, paper, or scissors.');
  let playerTrimmed = playerInput.trim();
  let playerSelection = playerTrimmed.charAt(0).toUpperCase();

  let playerScore = 0;
  let computerScore = 0;

  if (playerSelection === 'R' || playerSelection === 'P' || playerSelection === 'S') {
    let myArray = ['R', 'P', 'S'];
    let computerSelection = myArray[Math.floor(Math.random() * myArray.length)];

    if (playerSelection === 'R') {
      if (computerSelection === 'S') {
          playerScore;
        return 'You win, rock beats scissors.';
      } else if (computerSelection === 'P') {
          computerScore;
        return 'You lose, paper beats rock.';
      } else {
        return 'Tie.';
      }
    } else if (playerSelection === 'P') {
      if (computerSelection === 'R') {
          playerScore;
        return 'You win, paper beats rock.';
      } else if (computerSelection === 'S') {
          computerScore;
        return 'You lose, scissors beats paper.';
      } else {
        return 'Tie.';
      }
    } else if (playerSelection === 'S') {
      if (computerSelection === 'P') {
          playerScore;
        return 'You win, scissors beats paper.';
      } else if (computerSelection === 'R') {
          computerScore;
        return 'You lose, rock beats scissors.';
      } else {
        return 'Tie.';
      }
    }

  } else {
    //makes sure player entered a string starting with a valid letter (r, p, or s)
    alert('Please make sure you enter a valid selection.');
  }
}

game()  

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

1. return Оператор завершит выполнение функции, даже если она находится внутри цикла, дальнейшие итерации цикла выполняться не будут. Таким game() образом, цикл функции будет выполняться только один раз, а затем возвращать строку. Возможно, вы захотите переместить эту playerScore > computerScore проверку из (и после) цикла.

2. Вы можете избежать всех ужасов «если-то», определив выигрышные совпадения, const winCombos = ["PR", "RS", "SP"] а затем проверив winCombos.indexOf(selection)!=-1 , совпадают ли оба выбора. Это должно охватывать все сценарии.

3. См. jsfiddle.net/pfzq69yt

Ответ №1:

Как сказал DBS, оператор return остановит вашу функцию и ваш цикл вместе с ней, поэтому попробуйте сделать это так:

 function game() {
  let playerScore = 0;
  let computerScore = 0;
  let roundResult = computerPlay();

  for (let counter = 0; counter <= 5;   counter) {
    computerPlay();

    if (roundResult === 'You win, rock beats scissors' || roundResult === 'You win, paper beats rock.' || roundResult === 'You win, scissors beats paper.') {
        playerScore;
    } else if (roundResult === 'You lose, paper beats rock.' || roundResult === 'You lose, scissors beats paper.' || roundResult === 'You lose, rock beats scissors.') {
        computerScore
    }
  }

  if (playerScore > computerScore) {
    return ('You win '   playerScore   ' to '   computerScore   '.');
  } else if (playerScore < computerScore) {
    return ('You lose '   computerScore   ' to '   playerScore   '.');
  } else {
    return 'It was a tie, you both won the same number of rounds.';
  }
}
  

Таким образом, он вернет результат только после завершения цикла.

(И, кстати, переменные PlayerScore и computerScore в вашей функции computerPlay () бесполезны: p)